【问题标题】:private fields in parent class - java父类中的私有字段 - java
【发布时间】:2014-04-29 18:21:14
【问题描述】:
class Parent{
    private int a = 10;
    public int getA() {
        return a;
    }
} 

class Child extends Parent{ 
    public int b = 20;
    public void getSuperA() {
        System.out.print(getA()); // getA() instead of a
    }
}

当我们创建一个子类对象时,只会创建一个对象。该对象中的成员是什么? Parent 中的私有字段会发生什么?

【问题讨论】:

    标签: java inheritance private


    【解决方案1】:

    当你实例化一个子类的对象时。

    • 无论访问修饰符如何(私有、受保护或公共),父类和子类的所有字段都已初始化
    • 父类的构造函数被调用。
    • 子类的构造函数被调用。

    因此这些字段将存在(并且它们将存储一个值),但如果它们是私有的,您将无法访问它们。

    返回私有字段的公共方法将授予您该访问权限。简而言之,它会起作用。

    希望这会有所帮助。


    编辑(回应评论):

    该机制直接内置于语言中以确保安全。访问修饰符提供该机制所需的信息。

    • 只能从类内部访问私有字段。
    • 它将存在,但从外部看不到可见
    • 您可以通过它对该类的某些公共方法(使用它的方法)的行为的影响来感知它的存在。由于这些方法是同一类的成员,因此它们可以访问私有字段。

    好处:

    • 您可以从外部隐藏实施细节。
    • 您可以通过方法限制字段的不当使用。

    例子

    private int salary;
    
    public void setSalary(int newSalary) {
        if (newSalary < MAX_SALARY) {
            this.salary = newSalary;
        } else {
            this.salary = MAX_SALARY;
        }
    }
    

    【讨论】:

    • 是的。但是,如果私有字段存在于子对象中,为什么不能直接在子对象中访问它?限制它的背后机制是什么?谢谢
    【解决方案2】:

    如果你做某事似乎你知道

     Child ch = new Child() 
    

    然后

    ch.a;
    

    显然不起作用,因为它是私有的 但是当一个对象从父类扩展时,它会继承所有公共和私有属性,因此您必须在父类中定义一个函数,例如

    public int getA(){
       return a;
    }
    

    以后在 ch 中你可以访问这样的:

    ch.getA();
    

    【讨论】:

    • 是的。但是,如果私有字段存在于子对象中,为什么不能直接在子对象中访问它?限制它的背后机制是什么?谢谢
    • 我不认为这是一个限制,私有字段应该是这样的,只能在定义它的类中访问,首先我们应该了解 Java 中的面向对象,然后开发我们的代码,所以如果我们将某些东西定义为私有,我们应该知道它的行为方式
    【解决方案3】:

    子对象将为父对象的私有字段保存一个值,但因为它在Parent 中是私有的,所以任何人(包括子对象本身)访问该值的唯一方法是通过从父类继承的方法。

    【讨论】:

    • 但是,如果私有字段存在于子对象中,为什么不能直接在子对象中访问它?限制它的背后机制是什么?谢谢
    • 您可以在子对象中访问它。您不能直接从 Parent 访问。
    【解决方案4】:

    智利对象的字段被创建。 首先初始化字段,然后调用构造函数。 在您的情况下,字段 a 将被初始化为值 10。

    【讨论】:

    • 私有字段是否存在于子类对象中?
    • 是的,它是实时的。 Parent 无法直接看到它,它可能会调用 getA()
    猜你喜欢
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 2014-06-01
    • 2014-06-19
    • 2021-08-27
    • 2013-01-09
    • 1970-01-01
    • 2020-11-12
    相关资源
    最近更新 更多