2014-12-07 2 views
0
public class ABC extends XYZ 
{ 
      public static class InnerClass1 
      { 
      ... 
      } 
      public static class InnerClass2 
      { 
      ... 
      } 
      public static class InnerClass3 
      { 
      ... 
      } 
      public static class InnerClass4 
      { 
      ... 
      } 
} 

В приведенном выше коде я не могу получить доступ к методам класса XYZ внутри внутренних классов1,2,3 и 4. Как я могу изменить указанную выше структуру так, чтобы внутренняя классы могут получить доступ к методам в классе XYZ?Доступ к методам расширенного класса из внутреннего класса

Заранее благодарен!

+1

Методы, к которым у вас нет доступа, являются ли они статическими методами? –

+0

Помните, что статический класс может получить доступ только к статическим членам. Таким образом, вы не можете получить доступ к нестационарному объекту. – afzalex

ответ

3
public class ABC extends XYZ 
{ 
     public static class InnerClass1 
     { 
     ... 
     } 

InnerClass1 не внутренний класс. Это вложенный класс, из-за слова static.

Если бы не static, это был бы внутренний класс. И любой экземпляр этого внутреннего класса будет иметь скрытую ссылку на ABC (который также является XYZ). Если внутренний класс вызвал любые методы экземпляра ABC или XYZ или ссылался на любые переменные экземпляра в этих классах, он использовал бы эту скрытую ссылку для вызова методов экземпляра или доступа к переменным экземпляра.

Так как это вложенный класс, то нет скрытой ссылки на ABC (или XYZ). Таким образом, если вы вызываете метод экземпляра или ссылаетесь на переменную экземпляра, он не может этого сделать, потому что нет объекта ABC для работы. (Тем не менее, вы все еще можете назвать статический метод с ABC, или обратитесь к статической переменной.)

Я не уверен, что решение - это зависит от ваших потребностей. Возможно, что методы XYZ, которые вы не можете вызвать, на самом деле не нуждаются в объекте XYZ, и поэтому эти методы должны быть статическими. Также возможно, что вложенный класс должен иметь некоторую явную переменную ABC или XYZ, которую он использует для доступа к методам экземпляра; Вы все еще можете вызвать методы экземпляра из вложенного класса, если у вас есть объект для работы на:

public static class NestedClass { 
    XYZ x; 
    void someMethod() { 
     x.instanceMethod(); // legal even if instanceMethod is non-static 
    } 
} 

Другое решение было бы убрать слово static, так что InnerClass1 действительно имеет скрытую ссылку на ABC. Это означает, что при создании экземпляра InnerClass1 вам понадобится объект ABC, на который он ссылается. Если вы создаете это в каком-то другом классе, синтаксис будет что-то вроде

ABC abcObject; 
... 
ABC.InnerClass1 newObject = abcObject.new InnerClass1(); 
+0

Hi ajb, Спасибо за ваш ответ. Я попытался реализовать первое предложенное вами решение. Но, я получаю java.lang.NullPointerException на строке x.instanceMethod(); Любое решение? Заранее спасибо. –

+0

@RajeshSubramanian Убедитесь, что 'x' установлен на то, что не является« null ». Фактический ответ: выяснить, что вы пытаетесь выполнить. Действительно ли экземпляр «InnerClass1» относится к «ABC»? Если это так, лучшим решением является избавление от 'static'. Дело в том, что вам нужно решить, что на самом деле означают классы и как они связаны, и ответ будет зависеть от этого. – ajb

1

статический внутренний класс может получить доступ только к статическим членам внешнего класса

поэтому внутренний класс только будет в состоянии использовать статические член А.

создать внутренний класс нон статичной, если вы хотите получить доступ все

1

У вас есть два варианта, один удалить статический вызов так скрытая эта ссылка на внешний класс доступна для экземпляров внутреннего класса или два , когда вы создаете экземпляр внутреннего прохода класса в этом явно, например:

public class ABC extends XYZ 
{ 
    XYZ.InnerClass innerInst = new InnerClass(this); 

      public static class InnerClass1 
      { 
      private final ABC extref; 
      public void Innerclass(ABC outerref) 
      { 
       extref = outerref; 
      } 

      ... 
      } 
} 
+0

", когда вы создаете экземпляр внутреннего прохода класса в этом явном виде. Не могли бы вы напомнить, как это можно сделать? –

+0

@RajeshSubramanian См. Мой пример: в этом случае вложенный класс имеет переменную 'x' типа' XYZ' (это может быть 'ABC'). Итак, как бы 'x' установить? Обычно либо с установщиком, либо с параметром конструктора, либо каким-либо другим способом. Вам нужно будет выяснить, что лучше всего подходит для вашего приложения. – ajb

+0

как говорит ajb, сеттер или параметр в конструкторе (я бы предпочел путь конструктора, который является потокобезопасным способом настройки экземпляра (установка в конструкторе не гарантирует другого использования объекта перед его набором (в качестве ссылки на объект обычно не известен за пределами объекта до того, как возвращается конструктор (люди могут нарушить это, взяв «это» для экземпляров внутреннего объекта и передав его где-то. – LhasaDad

Смежные вопросы