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

ohs*_*kay 7 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
         }
      };
   }
}
Run Code Online (Sandbox Code Playgroud)

anotherMethod()中的代码是否可以访问ParentClass中的受保护方法?如果是这样,怎么办呢?

我尝试过像......

(ParentClass.this).parentMethod();
Run Code Online (Sandbox Code Playgroud)

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

Whi*_*g34 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
            }
        };
    }
}
Run Code Online (Sandbox Code Playgroud)


ext*_*eon 8

非静态内部类可以访问封闭类的所有方法,就好像它是自己的方法一样:

public class Test {
    public int getOne() {
        return 1;
    }

    public class Inner {
        public int getEnclosingOne() {
            return getOne(); // this works...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

静态内部类不能,因为静态内部类不绑定到父类的实例.这只能在封闭类上调用静态方法.

至于考虑继承的方法,非静态内部类中的方法可以使用封闭(外部)类的所有方法.

有趣的部分Test2.super.getOne()确实从中得到了getOne()Test2.super,这是一个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
    }
}
Run Code Online (Sandbox Code Playgroud)