| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2949 人关注过本帖
标题:[讨论]关于私有方法在继承中的疑问
只看楼主 加入收藏
hwoarangzk
Rank: 4
来 自:冰封王座
等 级:贵宾
威 望:12
帖 子:1894
专家分:0
注 册:2007-7-17
收藏
 问题点数:0 回复次数:20 
[讨论]关于私有方法在继承中的疑问

class Test2 extends Test{
public void f1(){
System.out.println("public f1()");
}
}

public class Test {
private void f1(){
System.out.println("private f1()");
}
public static void main(String args[]){
Test t=new Test2();
t.f1();
}
}
该代码结果为:private f1()
主类的私有方法子类是看不见的,所以子类无法调用父类的私有方法。这里相当于子类重新写了一个f1()方法。问题在于,t是指向Test2类的对象,应该调用子类对象的方法啊,为什么结果还是调用父类方法?

搜索更多相关主题的帖子: 疑问 子类 public Test void 
2007-08-10 10:57
hwoarangzk
Rank: 4
来 自:冰封王座
等 级:贵宾
威 望:12
帖 子:1894
专家分:0
注 册:2007-7-17
收藏
得分:0 

class P1{
private void p1(){
System.out.println("p1");
}
}

class P2 extends P1{
public void p1(){
System.out.println("p2");
}
}
public class PrivateOverriding {
public static void main(String args[]){
P1 p=new P2();
p.p1(); //这里出错,因为p1()对于p这个对象来说是不可见的
}
}
为什么这里会出错?而在上面一个例子里面又不会出错?类创建的引用到底是怎么一回事啊?


I'm here, as always...
2007-08-10 11:03
huwangvs
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:34
帖 子:764
专家分:0
注 册:2007-2-4
收藏
得分:0 

因为你的父类方法是私有的,所以不能被继承,没继承也就没覆盖这一说了,也就没多态可言。
而父类不能调用子类里定义的方法。你的p是P1类型的,它就不能访问P2子类里的p1()方法,而P1里的p1()方法是私有的,也不可访问,所以报错了。
你的第一个程序因为main()方法就在父类里,所以可以访问它自己私有的方法。

2007-08-10 11:20
hwoarangzk
Rank: 4
来 自:冰封王座
等 级:贵宾
威 望:12
帖 子:1894
专家分:0
注 册:2007-7-17
收藏
得分:0 

那么我想知道,P1 p=new P2()和P2 p=new P2()有什么区别?他们创建的引用不都是指向P2类的新对象的吗?


I'm here, as always...
2007-08-10 11:31
袁小六
Rank: 1
等 级:新手上路
帖 子:85
专家分:0
注 册:2007-8-3
收藏
得分:0 

啊 不懂啊 Test t=new Test2();
t.f1();

t明明是指向Test2啊 为什么调用 Test的方法? 为什么不是调用Test2里的f1()啊?


這個丗堺還钚夠瘋誑~~~
2007-08-10 12:07
huwangvs
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:34
帖 子:764
专家分:0
注 册:2007-2-4
收藏
得分:0 
对于private,static ,final修饰的方法都不是动态绑定的。
也就是说private方法一开始就知道它被P1调用的。而对于其他方法都是动态调用的,一直到调用其方法时才知道调用哪个方法。
对于P1 p=new P2(),相当于p2=new P2();P1 p=(P1)p2;他被强制转换为P1类型。此时调用p.p1(),它就调用父类里的p1().因为它一开始就已经被绑定了。

对于多态来说,当调用方法时,虚拟机会先用Class来判断类型,然后调用相应的方法。
2007-08-10 14:13
hwoarangzk
Rank: 4
来 自:冰封王座
等 级:贵宾
威 望:12
帖 子:1894
专家分:0
注 册:2007-7-17
收藏
得分:0 
P1 p=new P2()和P2 p=new P2()的具体区别是什么啊?如果P1是P2的父类的话。

I'm here, as always...
2007-08-10 14:18
heilong
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:777
专家分:0
注 册:2007-6-7
收藏
得分:0 
6楼不是讲的好清楚了啊.
相当于: P1 p=(P1)(new P2());被强制转行了.

风水鸡蛋壳,财去人安乐!----->
2007-08-10 14:44
hwoarangzk
Rank: 4
来 自:冰封王座
等 级:贵宾
威 望:12
帖 子:1894
专家分:0
注 册:2007-7-17
收藏
得分:0 
也就是说,P1 p=new P2()实际上p是指向一个P1类的对象了?不能调用P2类有而P1类没有的方法?

I'm here, as always...
2007-08-10 14:56
heilong
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:777
专家分:0
注 册:2007-6-7
收藏
得分:0 
不是的,你在另一类中,怎么能访问一个类的私有方法呢?所以会出错.
而你第一个,是在同一个类中,所以能访问私有方法

风水鸡蛋壳,财去人安乐!----->
2007-08-10 15:01
快速回复:[讨论]关于私有方法在继承中的疑问
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.011672 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved