我不确定我的问题标题是否恰当地描述了我的情况,所以如果不是,我会道歉!无论如何,假设我有以下代码片段(可见性如上所述):
public class ChildClass extends ParentClass {
// more code
private void myMethod() {
MyClass mine = new MyClass() {
public void anotherMethod() {
// insert code to access a method in ParentClass
}
};
}
}
anotherMethod()中的代码是否可以访问ParentClass中的受保护方法?如果是这样,怎么办呢?
我尝试过像......
(ParentClass.this).parentMethod();
...但显然由于范围问题,它不起作用。
答案 0 :(得分:9)
编译好:
class MyClass {
}
class ParentClass {
protected void parentMethod() {
}
}
class ChildClass extends ParentClass {
private void myMethod() {
MyClass mine = new MyClass() {
public void anotherMethod() {
parentMethod(); // this works
}
};
}
}
答案 1 :(得分:7)
非静态内部类可以访问封闭类的所有方法,就好像它是自己的方法一样:
public class Test {
public int getOne() {
return 1;
}
public class Inner {
public int getEnclosingOne() {
return getOne(); // this works...
}
}
}
静态内部类不能,因为静态内部类没有绑定到父类的实例。这只能在封闭类上调用静态方法。
对于考虑继承的方法,非静态内部类中的方法可以使用封闭(外部)类的所有方法。
有趣的部分是Test2.super.getOne()
,它确实从Test2.super
获得了getOne(),这是一个Test
。这就像Test2将访问该方法一样,即使用super
但前缀为Test2
来表示您正在访问外部类的命名空间。
public class Test2 extends Test {
public int getInnerOuterParentOne() {
Inner2 inner2 = new Inner2();
return inner2.getOuterParentOne();
}
public int getInnerOuterOne() {
Inner2 inner2 = new Inner2();
return inner2.getOuterOne();
}
public int getOne() {
return 2;
}
public class Inner2 {
public int getOuterOne() {
return getOne();
}
public int getOuterParentOne() {
return Test2.super.getOne();
}
}
public static void main(String[] args) {
Test2 test2 = new Test2();
System.out.println(test2.getInnerOuterOne()); // 2
System.out.println(test2.getInnerOuterParentOne()); // 1
}
}
答案 2 :(得分:1)
无法在Java中访问“父类方法”,与可见性无关(除了子类super.parentMethod()
中的parentMethod()
)。
也就是说,如果ChildClass
覆盖parentMethod()
,则无法从ParentClass.parentMethod()
的其他方法调用ChildClass.parentMethod()
(绕过ChildClass
)。
但是,如果ChildClass
未覆盖parentMethod()
,则该方法会由ChildClass
继承,以便您可以将其作为ChildClass
的方法进行访问,即简单地称为parentMethod()
。