以前一直以为子类继承了父类,父类的代码就成为自己的一部分,但是测试了一下,好像又不是。
代码如下:
public class One
{
protected void printA()
{
System.out.println("OneA");
}
private void printB()
{
System.out.println("One B");
}
protected void printAB()
{
printA();
printB();
}
}
public class Two extends One
{
protected void printA()
{
System.out.println("two A");
}
private void printB()
{
System.out.println("two B");
}
public static void main(String[] args)
{
Two t = new Two();
t.printAB();
}
}
运行结果是:
TwoA
OneB
子类使用了继承的父类方法printAB(),ptintA()打印的是子类的,printB打印的为什么是父类的?
子类对象使用父类方法,是不是这样:父类引用指向了子类对象?所以子类覆盖的就用子类的,子类没覆盖(父类private)的就使用父类的?
麻烦指教一下,继承又凌乱了...可以补充加分
那么printAB()方法,是谁在调用的呢,是父类引用吗?
如果是子类拥有了父类的方法,那么方法是子类的一部分,调用的应该是自己的private方法才对。
我觉得有点像父类引用指向子类对象t,
这时候父类方法私有,父类引用只能调用父类自己的方法,
子类覆盖了父类方法,父类引用调用子类方法。
其实我想问的是:子类继承了父类,父类的可以被继承方法是父类再调用,还是子类把方法变成自己的一部分?
子类继承后;
在堆区建立Two对象,在栈区建立Two引用,该引用指向Two对象;
所以应该是子类把方法变为自己的一部分,假如是父类调用的话,那么子类中构造函数 中super()怎么解释呢。所以是 子类调用
其实我 感觉我这么说也有问题,具体应该这么讲:
子类对象中会保存一个实例对象的引用super,该引用指向父类。 在实际的方法调用时,java会先在当前类的对象中寻找名称相同的方法,如果没有,就到super引用的父类对象中去寻找该方法,所以,若在子类中存在和父类方法的签名和返回值类型完全相同的方法(重写)的话,java就会直接调用该对象的方法而不用去父类去寻找调用方法了。而且在子类对象中,可以直接通过super来调用父类对象中的方法。