在java中,私有访问修饰符具有高度限制性,只能在定义它们的类中访问。
考虑一下这个例子。
package x;
public class Boom {
protected String name;
public Boom() {
}
private void aConfidentialInfo(){
System.out.println("Some confidential information...");
}
protected void display(){
System.out.println("In display method..");
aConfidentialInfo();
}
}
package y;
import x.Boom;
public class Hack extends Boom{
public Hack{
display();
}
}
当我运行类Hack
时,它会调用display,后跟aConfidentialInfo
,它是类Boom
的私有成员。类Hack
如何能够访问类Boom
的私有成员?是不是私人访问修饰符的侵权。如何用一些体面的推理来理解和解释这个?
答案 0 :(得分:5)
不,它访问Boom- display的受保护成员。这是合法的 - 子类或包中的任何东西都可以访问受保护的成员。受保护的函数可以访问私有成员,因为受保护的函数是Boom类的一部分。
答案 1 :(得分:3)
由于多态性的 magic ,这是可能的。
Hack 扩展 Boom,因此可以访问所有公共,包和受保护的字段和方法。因此,它可以调用受保护的display()
方法。借助多态的魔力,在Hack中调用display会调用Boom的方法,该方法可以调用aConfidentialINfo()