- 引用多态(向上转型)
- 父类的引用可以指向本类的对象
- 父类的引用可以指向子类的对象(动态绑定)
Outer in=new Outer(); Outer out=new Inner(); //指向子类的对象 一个引用调用的是哪个方法,取决于这个引用所指向的对象 class Outer{ public String A="我"; public void say(){ System.out.println("我"); } } class Inner extends Outer{ public String B="你"; public void say(){ //覆写父类方法 System.out.println("你"); } public void ask(){ System.out.println("他"); } } class ListSetMap { public static void main(String[] args) { Outer out=new Inner(); //指向子类的对象 out.say(); //out.ask(); 会找不到符号 } }
输出 你
注意:
父类不能调用子类新声明的方法
子类的应用是不能指向父类的对象的
Tips:
一个引用能调用什么成员(变量和函数),取决于这个引用的类型(Outer )就是类型,里面没有ask()方法,所以不能调用ask();
- 向下转型
- 先向上转型
- 在向下转型
class ListSetMap { public static void main(String[] args) { Outer o=new Inner(); //向上转型 Inner I=(Inner) o; //向下转型 System.out.println(I.A); //调用父类的A属性 System.out.println(I.B); I.say(); I.ask(); } }
输出
我 你 你 他
可以通过instanceof来判断一个引用是否属于一个类
Outer o=new Outer(); //向上转型 Outer k=new Inner(); System.out.println(o instanceof Inner); System.out.println(k instanceof Inner);
输出
false
true