子类继承了父类的公有方法后又调用了父类的私用方法?

bt9 2005-07-24 04:34:09
大家先看看下面这个例子。我想明白它的工作原理是什么?
它的输出是A.a与A.b。可是我不太明白为什么是这个样子啊,B继承了A后,A的ab()方法不是传给它了吗,这个时候方法ab()不是直接在B中可以调用了吗?
或者按我对继承的原理的理解应该是,主方法调用了B的默认构造函数,B是A的子类,所以先调用A的默认构造函数。但是这之后发生了什么啊,不还是调用了B中从A继承来ab()方法了,为什么结果会是那样??
帮忙给我讲讲它的原理。。。。谢谢。。。

class A{
private void a(){
System.out.println("A.a");
}
private void b(){
System.out.println("A.b");
}
public void ab(){
a();
b();
}
}
public class B extends A{
private void a(){
System.out.println("B.a");
}
protected void b(){
System.out.println("B.b");
}
public static void main(String[] args){
new B().ab();
}
}
...全文
215 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
bt9 2005-07-24
  • 打赏
  • 举报
回复
谢谢各位,现在明白了.
joyco 2005-07-24
  • 打赏
  • 举报
回复
因为你调用 new B().ab();是调用B类继承A类的ab()方法
而A类的ab()中的a(),b()执行的是A类的a(),b()方法啊
而不是B类中重载的方法
mituzhishi 2005-07-24
  • 打赏
  • 举报
回复
呵呵,楼上的一针见血。

就好像通过共有函数访问私有成员一样,这有什么好奇怪的么?
弘石 2005-07-24
  • 打赏
  • 举报
回复
在父类public方法里调用,子类的方法仍然不会调用到父类的private,所以没有违反信息隐藏的原则阿
不徻写代码 2005-07-24
  • 打赏
  • 举报
回复
但是这明显违反了信息隐藏的原则
不徻写代码 2005-07-24
  • 打赏
  • 举报
回复
晕,private显然是不能继承的,但你可以用public的方法间接调用阿
Roy_Sashulin 2005-07-24
  • 打赏
  • 举报
回复
class A{
private void a(){
System.out.println("A.a");
}
private void b(){
System.out.println("A.b");
}
public void ab(){
a();
b();
}
}
public class B extends A{
private void a(){
System.out.println("B.a");
}
protected void b(){
System.out.println("B.b");
}
public static void main(String[] args){
new B().ab();
}
}

----------------------------------------------------------
首先B是继承于A的,当然就继承了了A的所有public 的方法和变量,A中的a()和b()方法都是为public 的ab()服务的,意思是ab()中同步调用了a()和b()。我们再看一下类B,它自己的类体里没有ab()函数,然而在程序入口处调用了new B.ab(),所以这里的调用方法其实就是A.ab()方法,呵呵,谁叫A.ab()方法是public的呢,如果你把权限换成private ,那这段程序将会失败。

------------罗毅
Saro 2005-07-24
  • 打赏
  • 举报
回复
测试了一下,确实如此,见识了。
似乎是因为Class A 中的a,b 2个方法是private的,无法被子类覆写的缘故。把A中的ab()方法copy至B中后,就会输出“B.a,B.b”这说明A中的a(),b()和B中的a(),b()是同时存在的。
interhanchi 2005-07-24
  • 打赏
  • 举报
回复
sor例子给错了:

public class PrivateOverride{
private void f(){
System.out.println("private f()");
}
public static void main(String[] args){
PrivateOverride po = new Derived();
po.f();
}
}
class Derived extends PrivateOverride{
void f(){
System.out.println("public f()");
}
}
hawaii_wx 2005-07-24
  • 打赏
  • 举报
回复
请看清楚你自己给出来的例子,A类有2个私有方法一个共有方法,B类有2个私有方法,虽然A类的私有方法和B类的私有方法同名,但是没有任何关系,由于B类继承A类,所以可以用A类的公有方法,这时A类公有方法调用自己的2个私有方法,当然是输出A.a与A.b
jlbqd 2005-07-24
  • 打赏
  • 举报
回复
运行果然是A.a与A.b
偶也8 知道why
interhanchi 2005-07-24
  • 打赏
  • 举报
回复
只有非private方法才能被覆盖,如果父类的方法是private的话,你下面产生的方法,并不是覆盖,仅是产生了一个新的方法.
private的方法只有类自己看得到,就算子类也看不到.你可以把a,b方法都改为public的话,结果就是B.a和B.b了!
给你个例子:
public class PrivateOverride{
private void f(){
System.out.println("private f()");
}
public static void main(String[] args){
PrivateOverride po = new PrivateOverride();
po.f();
}
}
class Derived extends PrivateOverride{
void f(){
System.out.println("public f()");
}
}
jlbqd 2005-07-24
  • 打赏
  • 举报
回复
咋看之下好像是输出“B.a”,“B.b“

偶运行一下看看在说~

62,615

社区成员

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

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