Может ли метод во внутреннем классе получить доступ к методу родительского класса? - PullRequest
6 голосов
/ 19 апреля 2011

Я не уверен, что название моего вопроса точно описывает мою ситуацию, поэтому извиняюсь, если это не так! В любом случае, допустим, у меня есть следующий фрагмент кода (видимость такая, как указано):

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 ]

9 голосов
/ 19 апреля 2011

Это прекрасно компилируется:

class MyClass {
}

class ParentClass {
    protected void parentMethod() {
    }
}

class ChildClass extends ParentClass {
    private void myMethod() {
        MyClass mine = new MyClass() {
            public void anotherMethod() {
                parentMethod(); // this works
            }
        };
    }
}
7 голосов
/ 19 апреля 2011

Нестатический внутренний класс может обращаться ко всем методам включающего класса, как если бы это были его собственные методы:

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

    public class Inner {
        public int getEnclosingOne() {
            return getOne(); // this works...
        }
    }
}

Статический внутренний класс не может, так как статический внутренний класс не связан сэкземпляр родительского класса.Это может вызывать только статические методы в классе включения.

Что касается методов, учитывающих наследование, то метод в нестатическом внутреннем классе может использовать все методы вмещающего (внешнего) класса.

Интересная часть - 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
    }
}
1 голос
/ 19 апреля 2011

Нет способа получить доступ к «методу родительского класса» в Java, независимо от видимости (за исключением super.parentMethod() в подклассе parentMethod()).

То есть, если ChildClass переопределяет parentMethod(), невозможно вызвать ParentClass.parentMethod() (в обход ChildClass.parentMethod()) из других методов ChildClass.

Однако, еслиChildClass не переопределяет parentMethod(), этот метод наследуется ChildClass, поэтому вы можете обращаться к нему как к методу ChildClass, то есть просто как parentMethod().

...