class SuperBase{ void print(SuperBase a){System.out.print("super");}}
class Base extends SuperBase{ void print(Base b){System.out.print("Base");}}
class Derived extends Base{ static void print(Derived c){System.out.print("Derived");}}public class Test7{
public static void main(String[] args){
SuperBase a1 = new SuperBase();
SuperBase b1 = new Base();
Base c1 = new Derived();
a1.print(new Base());
b1.print(new Derived());
c1.print(new Derived());
}
}谁能帮我解释一下为什么这段代码运行的输出是“supersuperBase”类Base中的print方法是override了父类中的print方法吗?谢谢!
class Base extends SuperBase{ void print(Base b){System.out.print("Base");}}
class Derived extends Base{ static void print(Derived c){System.out.print("Derived");}}public class Test7{
public static void main(String[] args){
SuperBase a1 = new SuperBase();
SuperBase b1 = new Base();
Base c1 = new Derived();
a1.print(new Base());
b1.print(new Derived());
c1.print(new Derived());
}
}谁能帮我解释一下为什么这段代码运行的输出是“supersuperBase”类Base中的print方法是override了父类中的print方法吗?谢谢!
class Base extends SuperBase{
void print(Base b){
System.out.println("Base "+b.toString());
}
}
其实重载后应该是
class Base extends SuperBase{
void print(SuperBase a){
System.out.println("super "+a.toString());
}
}
void print(Base b){
System.out.println("Base "+b.toString());
}
}
你以SuperBase为参数肯定是调用void print(SuperBase a)这个函数,这并不是多太问题。
还有写代码一般不会像你这样的,估计只有教科书才会有这种代码
class Base extends SuperBase{ void print(SuperBase b){System.out.print("Base");}}其余的不变。 那么这里b1.print(new Derived());仍然调用了SuperBase类里面的方法why ???
class Base extends SuperBase{ void print(SuperBase b){System.out.print("Base");}}其余的不变。 那么这里b1.print(new Derived());仍然调用了SuperBase类里面的方法why ???
//********************************************************
关键是看b1是superbase 类吧,所以调用superbase 的print吧,然后用子类实例化父类作参数,我也是初学,等你明白了,我也学习
呵呵
子类对象赋给父类句柄后,该句柄不能访问子类的那些特殊属性和方法,就是那些没有在父类中定义过得方法和属性。所以那里总是调用父类那个方法了,Base类中的那个print方法永远也不会被调用。这里的b1是Base类的一个实例的引用,它调用的print方法是从SuperBase那里继承过来的。而不是他自己的那个。
因为平时我们遇到的一般都是子类对象赋给父类句柄后,然后调用那个已经在子类中覆盖了的方法,所以在这里也很容易误解为这里仍然调用子类中的方法。(惯性思维,呵呵)
问题已经解决,散分啦~
这不是覆盖(override)这是函数重载(overload)
醒过来后本人认为关键在于(SuperBase b1 它是什么?): SuperBase b1 = new Base();这里注意了,b1实际上是一个SuperBase类型的引用
所以调用的是SuperBase的构造函数。(第二个Super的解释)
同理可证(最后一个打印Base了,因为是Base类型的引用啊)
第一个打印的Super是理所当然的啦类Base中的print方法的确是override了父类中的print方法,这点没有错。
2) 子类对象赋给父类句柄后,该句柄不能访问子类的那些特殊属性和方法