java继承,子类继承父类,子类是只允许调用父类的代码,还是子类拥有了这些代码

以前一直以为子类继承了父类,父类的代码就成为自己的一部分,但是测试了一下,好像又不是。
代码如下:

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)的就使用父类的?

麻烦指教一下,继承又凌乱了...可以补充加分

情况是这样的:
Class Two 继承了 Class One ,因此就可以使用 printAB() ,
当执行到 语句: t.printAB(), 时,会跳转到 Class One 中,执行 printAB(),
然后,发现 里面有个 printA(), 于是 去 Class Two中找,因为修饰符为 protected 能被Class One看到,所以 打印 TwoA;
然后,又发现有个 printB() , 于是去Class Two中找,因为修饰符是 private 所以,不能被Class One看到,所以 打印 OneB;
温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-10-12
public class One {

public One() {
System.out.println("");

}
protected void printA()
{
System.out.println("OneA");
}
private void printB()
{
System.out.println("One B");
}
protected void printAB()
{
this.printA();
System.out.println(this);
this.printB();
System.out.println(this);
}
}
输出:
two A
reusing.Two@6d06d69c
One B
reusing.Two@6d06d69c
继承是拥有访问基类权限(不是你能要的全拿走),可以看到此时引用对象是two,在class One中访问方法,向上转型为基类引用访问方法,由于多态(动态绑定)可以调用class Two printA()。关于printB因为是私有方法,没有发生覆盖,此时不能发生多态,只能调用父类的私有方法,所以执行父类的printA()。
第2个回答  2012-09-22
请注意看下父类中 private void printB() 方法,
private修饰本类可见,protected 子类可见
自然子类只能打印 它自己的方法了。追问

那么printAB()方法,是谁在调用的呢,是父类引用吗?

如果是子类拥有了父类的方法,那么方法是子类的一部分,调用的应该是自己的private方法才对。

我觉得有点像父类引用指向子类对象t,
这时候父类方法私有,父类引用只能调用父类自己的方法,
子类覆盖了父类方法,父类引用调用子类方法。

其实我想问的是:子类继承了父类,父类的可以被继承方法是父类再调用,还是子类把方法变成自己的一部分?

追答

子类继承后;
在堆区建立Two对象,在栈区建立Two引用,该引用指向Two对象;

所以应该是子类把方法变为自己的一部分,假如是父类调用的话,那么子类中构造函数 中super()怎么解释呢。所以是 子类调用

其实我 感觉我这么说也有问题,具体应该这么讲:
子类对象中会保存一个实例对象的引用super,该引用指向父类。 在实际的方法调用时,java会先在当前类的对象中寻找名称相同的方法,如果没有,就到super引用的父类对象中去寻找该方法,所以,若在子类中存在和父类方法的签名和返回值类型完全相同的方法(重写)的话,java就会直接调用该对象的方法而不用去父类去寻找调用方法了。而且在子类对象中,可以直接通过super来调用父类对象中的方法。

相似回答