2012-01-06 113 views
5

如果您从声明了某些成员变量的活动继承,那么如何在执行继承的子类中访问这些成员变量?在java中访问继承类变量

+0

另请检查您是否没有命名冲突:http://java.sys-con.com/node/46344如果您遇到意外的行为 – jefflunt 2012-01-06 19:26:49

回答

7

publicprotected成员名称可以通过this.memberName从任何构造函数或非static方法或初始值设定项来访问。

private或包级别成员(从不同包中的子类访问)不能直接访问,需要通过非特权接口(如public获取器)访问。

2

如果成员被声明为private,或者如果它们是使用默认(包)访问声明的,并且您的子类位于不同的类中,则无法访问这些变量。如果提供访问器,则可以使用这些访问器。否则,他们无法访问。

如果成员宣布protectedpublic,那么你访问他们,如果他们在自己的类(this.var,或者只是var如果没有歧义)被宣布。如果在子类中有一个与超类同名的成员,则可以使用super.var来访问超类变量。

+0

downvoter会谨慎解释吗? – 2012-01-06 19:37:17

+1

+1以反驳无法解释的反对票。 – mre 2012-01-06 19:40:15

4
class A { 
    protected int a = 3; 
} 

class B extends A { 
    protected int b = 2; 

    void doIt() { 
     System.out.println("super.a:" + super.a); 
     System.out.println("this.b: " + this.b); 
    } 
} 
+0

你不需要'super'关键字。 – mre 2012-01-06 19:29:49

+1

没错。但这是一个初学者的问题。所以,我想说清楚。 – ollins 2012-01-06 19:33:13

+2

如果该字段被子类中的字段隐藏,则只需要'super'关键字。 – 2012-01-06 19:38:13

1

如其他人所述,可通过子类中的this.field访问公共和受保护字段。包专用字段也可以用相同的方式访问,但只有当子类与父代在同一个包中。

私有字段不能以这种方式访问​​,但如果安全设置允许,可以使用Java reflection访问它们。一般不建议这样做(私人成员通常是私人的),但在某些情况下它可能很有用,例如访问私人类成员进行代码测试。请参阅the answers to this question了解如何以这种方式使用反射。