【问题标题】:Can a method in an inner class access a parent class method?内部类中的方法可以访问父类方法吗?
【发布时间】:2011-04-19 10:06:52
【问题描述】:

我不确定我的问题标题是否恰当地描述了我的情况,如果没有,我深表歉意!无论如何,假设我有以下代码 sn-p (可见性如所述):

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

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

【问题讨论】:

  • 你不能直接打电话给parentMethod()而不是(ParentClass.this).parentMethod();
  • 'a protected method found in ParentClass'也可以在孩子中找到,因为继承

标签: java inner-classes


【解决方案1】:

这编译得很好:

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:这仅在 ParentClass 与调用者在同一个包中时才有效。即因为protected 允许访问子类并打包本地类。
  • @Peter:嗯,你确定吗?我只是尝试将所有 3 个类放在 3 个不同的包中。我认为它有效,因为myMethod() 中的MyClass 实际上是一个内部类,它可以访问其外部类ChildClassprotected 方法,因此它扩展了ParentClass
  • @WhiteFang34,你是对的。我没有正确编译我的测试代码。
  • @Peter:你让我去那里待了一分钟。我差点回答“好点”,然后我想“等一下……”,不得不去尝试一下:)
  • @WhiteFang34,如果 ChildClass 没有扩展 ParentClass,我只会是正确的。
【解决方案2】:

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

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
    }
}

【讨论】:

    【解决方案3】:

    在 Java 中无法访问“父类方法”,与可见性无关(子类的 parentMethod() 中的 super.parentMethod() 除外)。

    即如果ChildClass覆盖parentMethod(),则无法从ChildClass的其他方法调用ParentClass.parentMethod()(绕过ChildClass.parentMethod())。

    但是,如果ChildClass 没有覆盖parentMethod(),则该方法由ChildClass 继承,因此您可以将其作为ChildClass 的方法访问,即简单地作为parentMethod()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-06
      • 1970-01-01
      • 2016-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-31
      • 2012-06-03
      相关资源
      最近更新 更多