我有一个名为 Parent 的类,它有一个私有变量和一个名为display的方法来显示该变量值。在名为 Child 的类中,父项是继承的。
public class GoodDay {
public static void main(String[] args) {
new Child().display();
}
}
class Parent
{
private int i=5;
public void display()
{
System.out.println(this.i +" "+this.getClass());
}
}
class Child extends Parent
{ }
输出 5 class p1.Child
1)this.getClass()
将p1.Child
作为值。因此,此显示方法是一个继承的方法副本,可在Child类中使用。那么如何在不使用公共getter和setter的情况下访问Parent类私有变量?
2)为什么this.i
中这个关键字没有给出任何错误,因为在子类中没有i?
我检查了这个link,它说即使私有变量在子类对象中也可用,而不在子类中。怎么样,为什么?
答案 0 :(得分:1)
1)好的,由于display()
访问修饰符,Child
类中显示了public
方法。实例变量i
无法直接访问,例如new Child().i
,但通过调用display()
来访问它是完全正确的 - 这是面向对象设计的意图。
访问修饰符(在java中有四个:public
,protected
,package-private
和private
)的目的是限制成员的确切位置(例如实例变量或方法)可以直接访问。通过encapsulation
等原则,这可以促进更好的设计。
因为int
是private
并不意味着它不能被另一个类间接访问 - 它只能直接访问。如果您通过int
方法将public
公开给外界,那就完全没问题,因为类的公共方法可以访问同一类的所有私有成员。
2)this.i
没有给出错误,因为它是在Parent
类(不是Child
)的上下文中引用的。
顺便说一句,在大多数情况下你可以避免this.
。试试这个,它是一样的。
System.out.println(i +" " + getClass());
第三,当代码从class p1.Child
类执行时,为什么会打印Parent
?很简单,因为getClass()
被每个类重载,并且通过多态和方法重载/动态调度,您正在执行getClass()
(并且,通过print语句,隐式地使用toString()
方法......)来自Child
类。
这会让事情更清楚吗?
答案 1 :(得分:0)
如果Child
未覆盖display()
方法,则由于多态super.display()
方法,即Parent
display()
方法。如果您想要访问i
课程中的Child
变量,则必须声明protected
此变量,而不是private
。