java继承中的一个小问题

william_yao 2012-12-09 12:02:33
首先代码贴出来

public class TestExtends {
public static void main(String[] args) {
new Person().printPerson();
new Student().printPerson();
}
}

class Student extends Person {
private String getInfo() {
return "Student";
}
}

class Person {
private String getInfo() {
return "Person";
}

public void printPerson() {
System.out.println(getInfo());
}
}


student继承了person类,private不能访问,但是printPerson是public的,是可以访问的,但是它里面调用了person里的private的方法,这种情况,结果是两个person,等于还是去调用了父类person里的private的getInfo方法。

这里有点不明白,为什么不是去掉子类中的重写的getInfo()方法呢?
...全文
302 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
呀_番茄 2012-12-09
  • 打赏
  • 举报
回复
怎么能调用printPerson()方法?
傲雪kimi 2012-12-09
  • 打赏
  • 举报
回复
private修饰的方法只能在类内部访问,不会被子类继承或者被创建的对象调用
amwfhv115 2012-12-09
  • 打赏
  • 举报
回复
student类没有printPerson()方法,所以调用父类的,父类怎么调用子类的方法?
Jacky-止涯 2012-12-09
  • 打赏
  • 举报
回复
引用 楼主 yzw19932010 的回复:
调用【new Student().printPerson();】的时候,是一层一层往上找的,Student里面没有,所以找到了Person里面去。 在Person.printPerson()里面又调用了Person.getInfo();由于getInfo是私有的,所以Student没有继承下来,Student.getInfo()也覆盖不了Person.getInfo(),所以printPerson()调用的时候还是Person.getInfo(),所以出现楼主这种情况! 如果把两者的getInfo()都改成public,那么Student.getInfo()就能覆盖Person.getInfo(),那么Student调用Person.printPerson()就能访问到Student.getInfo()。
书断华 2012-12-09
  • 打赏
  • 举报
回复
这样有没有觉得是变相的让子类的对象去调用父类的私有方法?私有的东西是只能在类内使用的,外面是不能访问到的(用反射是可以的),知道这个东西应该就不是很难理解上面的代码。
倾听技术的美 2012-12-09
  • 打赏
  • 举报
回复
实际上父类的所有方法都被继承到子类中了,只是私有的不能直接访问(就好像被屏蔽了一样)而是通过给出的方法间接的访问了!
zhaoming262350 2012-12-09
  • 打赏
  • 举报
回复
public class TestExtends { public static void main(String[] args) { System.out.println("1-------------1"); //通过new父类实例化后,调用了printPerson(); //而printPerson(); 里面又调用了 getInfo()方法 //所以输出肯定是Student new Person().printPerson(); System.out.println("2-------------2"); //通过new子类实例化后,Student是Person的子类,所以 //Student类会继承父类除private修饰的关键字外的属性和方法 //调用了printPerson(),调用的这个方法是子类从父类继承而来的, //但是父类的这个方法在输出时,又会调用父类本身的这个 getInfo() new Student().printPerson(); System.out.println("3--------------3"); } } class Student extends Person { private String getInfo() { return "Student"; } } class Person {
yongger520 2012-12-09
  • 打赏
  • 举报
回复
引用 4 楼 invincible_lanqi 的回复:
class Person { private String getInfo() { return "Person"; } public void printPerson() { System.out.println(this.getInfo()); } 实际上父类中调用的是当前的getInfo方法。而这个方……
这个是正解!
x-boy 2012-12-09
  • 打赏
  • 举报
回复
你犯了一个错误,我按逻辑来给你分析一下,先诞生了父类,按照前面说的那个例子,父类里面有两个方法,如果把getInfo()方法去掉,那么是不是应该在printPerson()中调用getInfo()方法的时候应该说明调用的是那个类里面的getInfo()方法。以此来推算,父类里面有这个方法那么就会调用父类里面的方法。如果没有就会报错,所以父类不会调用子类里面的方法,原因就是父类先诞生的,子类后诞生的。在构造父类的时候怎么能提前调用子类的方法呢?
猿来是妳 2012-12-09
  • 打赏
  • 举报
回复
class Person { private String getInfo() { return "Person"; } public void printPerson() { System.out.println(this.getInfo()); } 实际上父类中调用的是当前的getInfo方法。而这个方法子类中有,但是由于是私有的并没有被继承下去。 这就相当于调用的是this.getInfo();

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧