下面的程序是自己为了搞清继承时方法调用写的,可是运行结果和我想的不一样
问题1 为什么a.run()运行调用B类的run()方法?
问题2 既然a调用B类的方法,为什么a.go()会发生编译错误public class Myinherit
{
public static void main(String args[])
{
A a = new A();
B b = new B();
a = b;
a.run();
//a.go();
//b.go();
}
}
//
class A
{
void run()
{
System.out.print("this is A\n");
} }//class B extends A{
void run()
{
System.out.print("this is B\n");
}
void go(){
System.out.print("this is b.go\n");
}
}
go是B的方法,A当然不能调用
那为什么a不调用A的run()方法呢?
System.out.println(o.toString());Object类里也要toString方法,但是它就是调用具体的类的访问.方法覆盖,
A a = new A();
B b = new B();
a = b;
相当于这一句 A a= new B();
其实就是基类引用指向子类对象。
既然B是A的子类,那么当你new B()时会先调用A类的构造函数再调用B的构造函数,相当于new一个B的时候在B的内部new了一个A,B重写run方法其实就是修改了自己里面的A。
基类引用指向子类对象时,即 A a= new B();这个a只能访问B里面的那个A,不能访问其它的属性或方法。
其实就是将类B当成类A来用。
例如可以把狗当成动物来用。
第二个因为父类没有go函数,则父类引用子类对象时,子类对象向上转型,go函数已经丢了 相当于