学习型 ASP/PHP/ASP.NET 主机 30元/年全能 ASP/PHP/ASP.NET 主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付
 21 123
发新话题
打印

[讨论]关于私有方法在继承中的疑问

[讨论]关于私有方法在继承中的疑问

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类的对象,应该调用子类对象的方法啊,为什么结果还是调用父类方法?

TOP

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这个对象来说是不可见的
}
}
为什么这里会出错?而在上面一个例子里面又不会出错?类创建的引用到底是怎么一回事啊?

Time to raise hell!

TOP

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

TOP

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

Time to raise hell!

TOP

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

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

這個丗堺還钚夠瘋誑~~~

TOP

对于private,static ,final修饰的方法都不是动态绑定的。
也就是说private方法一开始就知道它被P1调用的。而对于其他方法都是动态调用的,一直到调用其方法时才知道调用哪个方法。
对于P1 p=new P2(),相当于p2=new P2();P1 p=(P1)p2;他被强制转换为P1类型。此时调用p.p1(),它就调用父类里的p1().因为它一开始就已经被绑定了。

对于多态来说,当调用方法时,虚拟机会先用Class来判断类型,然后调用相应的方法。

TOP

P1 p=new P2()和P2 p=new P2()的具体区别是什么啊?如果P1是P2的父类的话。
Time to raise hell!

TOP

6楼不是讲的好清楚了啊.
相当于: P1 p=(P1)(new P2());被强制转行了.
风水鸡蛋壳,财去人安乐!----->

TOP

也就是说,P1 p=new P2()实际上p是指向一个P1类的对象了?不能调用P2类有而P1类没有的方法?
Time to raise hell!

TOP

不是的,你在另一类中,怎么能访问一个类的私有方法呢?所以会出错.
而你第一个,是在同一个类中,所以能访问私有方法
风水鸡蛋壳,财去人安乐!----->

TOP

 21 123
发新话题