多态概念:
同一个对象(事物),在不同时刻体现出来的不同状态。
多态的前提:
A:要有继承关系。
必须有子父类关系或类实现接口关系
B:要有方法重写。
原因:如果没有的话,在编译时期是过不去的 在编译时只知道他自己的方法 编译时不管他new的对象 当然这个时候是强制类型转换的 其实没有也是可以的,但是如果没有这个就没有意义。 动物 d = new 猫(); d.show(); 动物 d = new 狗(); d.show();
C:要有父类引用指向子类对象。
必须有父类引用指向子类对象或接口引用指向实现类对象
父类类名 变量名 = new 子类类名();
接口名 变量名 = new 接口实现类();
多态中的成员访问特点:
A:成员变量 编译看左边,运行看左边。 B:构造方法 创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。 C:成员方法 编译看左边,运行看右边。 D:静态方法 编译看左边,运行看左边。 (静态和类相关,算不上重写,所以,访问还是左边的)
由于成员方法存在方法重写,所以它运行看右边。
成员变量:属于静态绑定成员方法:属于动态绑定
多态的好处:
A:提高了代码的维护性(继承保证)
B:提高了代码的扩展性(由多态保证)
C:提高了代码的复用性。
多态的弊端:
不能使用子类的特有功能。
多态的使用场景
作为方法的形式参数,可以接收更多数据类型的对象。
作为方法的返回值类型,可以方法更多的数据类型的对象
多态的转型
向上转型:父类引用指向子类对象的过程就是向上转型的结果。
Animal a = new Dog();
向下转型:将父类引用强制转换为子类引用的过程
格式:子类类型 变量名 = (子类类型)父类引用;
instanceof关键字
作用:用来判断多态后父类引用到底指向哪个子类类型的对象。
格式:boolean b = 引用变量 instanceof 类名或接口名;
注意事项:如果instanceof关键字后面的是类名,则要求引用变量和类之间有子父类关系。
/* 多态:同一个对象(事物),在不同时刻体现出来的不同状态。 举例: 猫是猫,猫是动物。 水(液体,固体,气态)。 多态的前提: A:要有继承关系。 B:要有方法重写。原因:如果没有的话,在编译时期是过不去的 在编译时只知道他自己的方法 编译时不管他new的对象 当然这个时候是科强制类型转换的 其实没有也是可以的,但是如果没有这个就没有意义。 动物 d = new 猫(); d.show(); 动物 d = new 狗(); d.show(); C:要有父类引用指向子类对象。 父 f = new 子(); 用代码体现一下多态。 多态中的成员访问特点: A:成员变量 编译看左边,运行看左边。 B:构造方法 创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。 C:成员方法 编译看左边,运行看右边。 D:静态方法 编译看左边,运行看左边。 (静态和类相关,算不上重写,所以,访问还是左边的) 由于成员方法存在方法重写,所以它运行看右边。 */ class Fu { public int num = 100; public void show() { System.out.println("show Fu"); } public static void function() { System.out.println("function Fu"); } } class Zi extends Fu { public int num = 1000; public int num2 = 200; public void show() { System.out.println("show Zi"); } public void method() { System.out.println("method zi"); } public static void function() { System.out.println("function Zi"); } } class DuoTaiDemo { public static void main(String[] args) { //要有父类引用指向子类对象。 //父 f = new 子(); Fu f = new Zi(); System.out.println(f.num); //找不到符号 //System.out.println(f.num2); f.show(); //找不到符号 //f.method(); f.function(); } }