11多态调用的三种格式
* A:多态的定义格式:
* 就是父类的引用变量指向子类对象
父类类型 变量名 = new 子类类型();
变量名.方法名();
* B: 普通类多态定义的格式
父类 变量名 = new 子类();
* C: 抽象类多态定义格式
抽象类 变量名 = new 抽象类子类();
* D: 接口多态定义的格式
接口 变量名 = new 接口实现类();
* E: 注意事项
同一个父类的方法会被不同的子类重写。在调用方法时,调用的为各个子类重写后的方法。
12 instanceof关键字
* A: 作用
可以通过instanceof关键字来判断某个对象是否属于某种数据类型。如学生的对象属于学生类,学生的对象也属于人类(测试的时候前父后子)
*B:用法
声明父类变量名 声明子类变量名 Boolean b = s2 instanceof Person;//前父后子为flase (父属于子) 前面是子类变量名 后面是定义的父类 System.out.println(b);
13 多态-向上转型
* A: 多态的转型分为向上转型与向下转型两种:
* B: 向上转型:当有子类对象赋值给一个父类引用时,便是向上转型,多态本身就是向上转型的过程。
使用格式:
父类类型 变量名 = new 子类类型();
14 多态-向下转型
* A: 向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用转为子类引用,这个过程是向下转型。如果是直接创建父类对象,是无法向下转型的!
使用格式:
子类类型 变量名 = (子类类型) 父类类型的变量;
如:Student stu = (Student) p; //变量p 实际上指向Student对象
总结:
向上转型:(子类转为父类,自动转型)
格式 :父类类型 变量名 = new 子类类型();
注:子类赋值给父类,那这时这个父类就能调用子类的方法
向下转型:(父类转为子类,强制转型)
格式: 子类类型 变量名 = (子类类型) 父类类型的变量;
注:对于向下的类型转换,必须要显式指定,即必须要使用强制类型转换。并且父类型的引用必须指向子类的对象,即指向谁才能转换成谁。
而直接创建的父类对象,是无法向下转型的;调用的还是子类的方法而并不是父类的方法。
例子:
父类:
public class Fu { public int num=66; void show(){ System.out.println("Fu的显示"); } }
子类: public class Zi extends Fu{ public static int num=77; void show(){ System.out.println("子类中的show方法"); } }
测试类: public class Test { public static void main(String[] args) { Fu f = new Zi();// 编译时期:参考应用类型变量所属的类 如果类中没有调用的方法 编译失败 f.show();// 运行时期:引用类型变量所指的对象所属的类 并运行所属类中的方法 //成员方法:编译看左边 运行看右边 //成员变量:编译运行全看左边 int a=f.num; System.out.println(a); } }
15 多态的好处和弊端
* 当父类的引用指向子类对象时,就发生了向上转型,即把子类类型对象转成了父类类型。
* 向上转型的好处是隐藏了子类类型,提高了代码的扩展性。
* 但向上转型也有弊端,只能使用父类共性的内容,而无法使用子类特有功能,功能有限制。
总结: 创建多态在继承的关系上
使用向下转型 *****
使用instanceof 方法
多态 运行看右边 编译的看左边 *****