这个运算符和继承中的私有变量

时间:2014-09-03 10:29:14

标签: java inheritance this private

我有一个名为 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,它说即使私有变量在子类对象中也可用,而不在子类中。怎么样,为什么?

2 个答案:

答案 0 :(得分:1)

1)好的,由于display()访问修饰符,Child类中显示了public方法。实例变量i无法直接访问,例如new Child().i,但通过调用display()来访问它是完全正确的 - 这是面向对象设计的意图

访问修饰符(在java中有四个:publicprotectedpackage-privateprivate)的目的是限制成员的确切位置(例如实例变量或方法)可以直接访问。通过encapsulation等原则,这可以促进更好的设计。

因为intprivate并不意味着它不能被另一个类间接访问 - 它只能直接访问。如果您通过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