内部类中的方法可以访问父类方法吗?

时间:2011-04-19 10:06:52

标签: java inner-classes

我不确定我的问题标题是否恰当地描述了我的情况,所以如果不是,我会道歉!无论如何,假设我有以下代码片段(可见性如上所述):

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();

...但显然由于范围问题,它不起作用。

3 个答案:

答案 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()