代码之家  ›  专栏  ›  技术社区  ›  lfaraone

从子类访问父类的私有实例变量?

  •  21
  • lfaraone  · 技术社区  · 16 年前

    假设我们有一节课 foo 它有一个私有实例变量 bar

    现在让我们再上一节课, baz 哪一个 extends foo . 非静态方法是否可以在 巴兹 通道 酒吧 如果中未定义访问器方法 ?

    8 回复  |  直到 16 年前
        1
  •  34
  •   Wim Coenen    16 年前

    不,不是根据 java language specification, 3rd edition

    6.6.8示例:私有字段、方法和构造函数

    只能在主体内访问 成员的声明或 构造器。它不是继承人

    但不管这种语言限制,你 可以 access private fields through reflection :

    Field privateStringField = 
       MyClass.class.getDeclaredField("privateString");
    privateStringField.setAccessible(true);
    
    String fieldValue = (String) privateStringField.get(privateObject);
    System.out.println("fieldValue = " + fieldValue);
    
        2
  •  22
  •   RichieHindle    16 年前

    protected.

        3
  •  6
  •   Sandro    16 年前

    对于这样的问题,网站上的表格在哪里 http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html

    基本上,您希望在foo中声明public或protected变量,因为这些变量是子类从其父类继承的,因此可以在baz中看到。

        4
  •  2
  •   Sushim Mukul Dutta    12 年前

    要在子类中使用超类的私有变量,需要访问器方法。 否则,请使用受保护的修改器而不是专用修改器。

        5
  •  1
  •   alphazero    16 年前

    子类不能访问私有成员(这是私有访问控制的全部要点)。

        6
  •  1
  •   cort    16 年前

    你需要访问者。此外,注意继承,var真的应该在父级中吗?记住这是一张支票。。

        7
  •  1
  •   George Armhold    16 年前

    不能访问子类中的私有变量。通常,您希望对此使用“受保护”或“包”(默认)级别的访问。然而,如果你想变得非常棘手,你可以求助于使用反射和 AccessibleObject 我不建议在生产代码中这样做,除非你真的陷入困境;对于测试等,这是很好的。

        8
  •  0
  •   neeranzan    8 年前

        9
  •  0
  •   user12333979    6 年前

    私有成员存在(继承)在子类的实例中。因为,子类的对象也是超类的对象,但子类不可见

    它们可以通过超类的非私有方法间接访问。这些方法可以访问和操作私有成员

        10
  •  0
  •   Rakhi jha    4 年前