首先因为B类继承了A类,在子类B中覆盖了方法fun1()新增了方法fun3(),而在父类A中,也有2个方法,一个是fun1(),一个是fun2(),而fun2()调用的还是fun1().
而子类继承了父类并且覆盖了父类中的方法后如调用该方法会运行子类方法中的内容。
在主函数中 A a = new B() ; 这句话的意思是建立了一个子类对象但是指向了父类的引用,子类对象向上转型了。
当你在调用a.fun1() ;
a.fun2();
这2个方法后是可以编译通过的,应为此时a对象向上转型了指向了父类的引用,父类中的方法都可以拿来用,但是运行的结果是子类中的方法的结果。
而 调用这个方法a.fun3();时,因为父类中没有这个方法,所以编译失败,若想调用这个方法,可以将对象a在向下转型:B b=(B)a; 则课可以调用子类中的特有方法了。
System.out.println((a instanceof B) ); // true 为什么又是B类的实例呢?不是转化成父类对象了吗??
a的实体对象还是B类,就好比猫是动物的子类,猫可以指向动物的引用,但它本身还是猫。
以上是我的个人见解,希望对楼主有帮助。 |