【问题标题】:private member accessible via public method可通过公共方法访问的私有成员
【发布时间】:2012-09-27 22:17:13
【问题描述】:

private 修饰符指定该成员只能在其自己的类中访问。但是我是否能够使用从基类继承的公共方法来访问它。有人可以解释我为什么吗?这是否意味着 Child 类的对象包含一个名为 b 的成员?

代码如下:

package a;

public class Base {
    private int b;

    public int getB() {
        return b;
    }

    public void exposeB() {
        System.out.println(getB());
    }

    public Base(int b) {
        this.b = b;

    }
}

package b;

public class Child extends Base {

    Child(int b) {
        super(b);
    }

    public static void main(String args[]) {
        Child b = new Child(2);
        // Prints  2
        System.out.println("Accessing private base variable" + b.getB());
    }
}

【问题讨论】:

    标签: java oop inheritance


    【解决方案1】:

    您没有直接访问超类中的私有变量。您正在实施封装的概念。您正在使用 public getter 方法(在本例中为 getB()) 来让其他类访问您的私有数据。因此,您可以通过公共 getter 访问私有变量 b,但您永远不能直接从另一个/子类访问 b 的实例

    【讨论】:

    • @Brian 谢谢:)。我记得这是我在一年前的工作面试中的一个问题...... :)
    • @questborn 不客气 :) 不要忘记接受最佳答案,因为这里有很多答案。 :)
    【解决方案2】:

    Base 类中,字段b 是私有的,但getB() 是公共的,因此任何人 都可以调用该方法。

    可以期望编译失败的情况类似于:

    System.out.println( "Accessing private base variable" + b.b );
    

    (除非该行是从Base 本身的方法中调用的)。

    【讨论】:

      【解决方案3】:

      您将无法在Child直接访问b,因为它是private。但是,您可以使用基类的getB 方法,即public(因此可以在任何地方调用)。

      只允许扩展包中的类和其他类访问该字段,可以将其声明为protected


      class A {
          private int n;
          public A(int n) { this.n = n; }
          public int n() { return n; }
      }
      
      class B extends A {
          public B(int n) { super(n); }
          public void print() { System.out.println(n); }  // oops! n is private
      }
      

      class A {
          protected int n;
          public A(int n) { this.n = n; }
          public int n() { return n; }
      }
      
      class B extends A {
          public B(int n) { super(n); }
          public void print() { System.out.println(n); }  // ok
      }
      

      【讨论】:

      • +1 表示“直接”这个词,应该更加强调这一点,也许可以举个例子说明直接访问如何允许操纵。
      【解决方案4】:

      private 修饰符意味着您不能在类之外引用该字段。但是,因为 getB() 是公共的,所以您可以引用该方法。 getB() 方法可以引用私有 b 字段,因为它在类内部,因此可以访问它。

      【讨论】:

        【解决方案5】:

        私有变量意味着你不能直接从它的类中访问变量....声明这个变量私有意味着你不能这样做

        Myclass.myprivatevariable = 3

        这将引发编译错误,抱怨 myprivatevariable 在外部不可见

        但是,正如您所做的那样...。将内部方法声明为 getter 或 setter,public,您允许用户仅通过该方法间接访问该变量...这始终是首选的方法做。

        【讨论】:

        • 这意味着父类中的私有变量被继承到子类中,因为可以使用子对象对其进行操作?
        • 不,不完全是......在这种情况下,子类继承了可以修改的父类的public方法**getB()**父类私有变量..检查这个文档来自.. Oracle docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html>
        猜你喜欢
        • 2016-06-06
        • 1970-01-01
        • 1970-01-01
        • 2014-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多