java继承,子类继承父类,子类是只允许调用父类的代码,还是子类拥有了这些代码
以前一直以为子类继承了父类,父类的代码就成为自己的一部分,但是测试了一下,好像又不是。代码如下:publicclassOne{protectedvoidprintA(){...
以前一直以为子类继承了父类,父类的代码就成为自己的一部分,但是测试了一下,好像又不是。
代码如下:
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)的就使用父类的?
麻烦指教一下,继承又凌乱了...可以补充加分 展开
代码如下:
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;
Class Two 继承了 Class One ,因此就可以使用 printAB() ,
当执行到 语句: t.printAB(), 时,会跳转到 Class One 中,执行 printAB(),
然后,发现 里面有个 printA(), 于是 去 Class Two中找,因为修饰符为 protected 能被Class One看到,所以 打印 TwoA;
然后,又发现有个 printB() , 于是去Class Two中找,因为修饰符是 private 所以,不能被Class One看到,所以 打印 OneB;
展开全部
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()。
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()。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
请注意看下父类中 private void printB() 方法,
private修饰本类可见,protected 子类可见
自然子类只能打印 它自己的方法了。
private修饰本类可见,protected 子类可见
自然子类只能打印 它自己的方法了。
追问
那么printAB()方法,是谁在调用的呢,是父类引用吗?
如果是子类拥有了父类的方法,那么方法是子类的一部分,调用的应该是自己的private方法才对。
我觉得有点像父类引用指向子类对象t,
这时候父类方法私有,父类引用只能调用父类自己的方法,
子类覆盖了父类方法,父类引用调用子类方法。
其实我想问的是:子类继承了父类,父类的可以被继承方法是父类再调用,还是子类把方法变成自己的一部分?
追答
子类继承后;
在堆区建立Two对象,在栈区建立Two引用,该引用指向Two对象;
所以应该是子类把方法变为自己的一部分,假如是父类调用的话,那么子类中构造函数 中super()怎么解释呢。所以是 子类调用
其实我 感觉我这么说也有问题,具体应该这么讲:
子类对象中会保存一个实例对象的引用super,该引用指向父类。 在实际的方法调用时,java会先在当前类的对象中寻找名称相同的方法,如果没有,就到super引用的父类对象中去寻找该方法,所以,若在子类中存在和父类方法的签名和返回值类型完全相同的方法(重写)的话,java就会直接调用该对象的方法而不用去父类去寻找调用方法了。而且在子类对象中,可以直接通过super来调用父类对象中的方法。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询