第二十三天
学习了Java的多态的实现和向上转型和向下转型的类型监测
明天学习Java的动态绑定
一、Java三大特性:封装、继承、多态
通俗的讲,多态具体表现在方法的重载和覆盖Overload(重写)
public class Father { public void say() { System.out.println("father say"); } public static void main(String[] args) { Son son=new Son(); son.say(); } } class Son extends Father{ public void say() { System.out.print("son say()"); } }
子类重写父类中的方法,即子类中的方法与父类中的方法保持一致。但是方法的修饰符一定要大于等于父类中的方法的修饰符。
此时,在子类中调用与父类相同的方法时,则调用的是子类,并非父类的方法。
public class Father { public void say() { System.out.println("father say"); } public static void main(String[] args) { Son son=new Son(); son.say(); } } class Son extends Father{ public void say() { System.out.print("son say()"); } }
二、类型检测——向下转型/向下转型
向上转型是指父类对象的引用指向子类对象。向下转型是指在向上转型的基础上再次指向子类的对象。
1、向上转型
父类 对象=new 子类()
public class Father { public void say() { System.out.println("father say"); } public static void main(String[] args) { Father son=new Son(); son.say(); } } class Son extends Father{ public void say() { System.out.print("son say()"); } }
父类对象的引用指向的是一个子类,所以打印方法也会是子类的方法。但是有的使用向上转型会丢掉子类特有的方法。
2、向下转型:使用向下转型必须使用(类型)进行强制转换
父类 对象1=new 子类(); 子类 对象2=(子类)对象1;
public static void main(String[] args) { //向上转型 Father son=new Son(); //向下转型 Son son2=(Son)son; son.say(); }
这是因为父类对象不能直接强转成子类对象。在实际开发中,凡是用到继承,我们应
该会第一想到使用向上类型转换。
现将向上转型总结如下。
(1)父类引用指向子类对象,子类引用不能指向父类对象。
(2)把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转型,如
Father fl=new Son()
(3)把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转
型。如fl就是一个指向子类对象的父类引用,把fl赋给子类引用s1即Son sl= (Son)fl。
其中,f1前面的(Son)必须添加,进行强制转换。
( 4)upcasting会丢失子类特有的方法(下面有说明),但是子类overriding父类的方
法,子类方法有效。