2014-12-10 2 views
1

У меня есть два вложенных класса внутри класса с внешним классом, расширяющим другой класс. Структура что-то вроде этого.Как получить доступ к методу расширенного класса из вложенного класса?

public class EXTENSION_CLASS 
{ 
    public int Get_Value() 
    { 
     return(100); 
    } 
} 

public class OUTER extends EXTENSION_CLASS 
{ 
    public static class NESTED1 
    { 
     public void Method1() 
     { 
      int value=0; 
      value=Get_Value(); 
      System.out.println("Method1: "+value); 
     } 
    } 
    public static class NESTED2 
    { 
     NESTED1 Nested1_Instance=new NESTED1(); 
     public void Method2() 
     { 
      Nested1_Instance.Method1(); 
     } 
    } 
    public void run() 
    { 
     NESTED2 Nested2_Instance=new NESTED2(); 
     Nested2_Instance.Method2(); 
    } 
    public static void main (String[] args) 
    { 
     OUTER New_Class=new OUTER(); 
     New_Class.run(); 
    } 
} 

Я ожидаю выход: «Метод1: 100». Но я получаю вывод: «OUTER.java:16: ошибка: нестатический метод Get_Value() не может ссылаться на значение статического контекста = Get_Value();». Как я могу заставить это работать?

Приветствия!

Rajesh.

+0

Не могли бы вы попытаться объявить метод Get_Value также статическим? –

+0

Разве вы не задавали этот вопрос пару дней назад? http://stackoverflow.com/questions/27339664/accessing-methods-of-extended-class-from-inner-class/27339698#27339698. – ajb

+0

Этот вопрос основан на любом реальном приложении, или вы просто играете, чтобы увидеть, что работает, а что нет на Java? Если это реальное приложение, я думаю, нам нужно знать больше о том, что представляют собой эти классы. Вы получили ряд решений, которые помогут программе скомпилировать и вывести '100', но не все из них будут уместны в реальной программе. – ajb

ответ

1

Удалить модификатор static из декларации NESTED1 и NESTED2, например, так:

public class NESTED1 
+0

По некоторым причинам я не хочу удалять статический модификатор. Есть ли другое решение? Благодаря ! –

+0

Если вы не хотите удалять статический модификатор, это означает, что 'NESTED1' не имеет отношения к объекту' OUTER' или 'EXTENSION_CLASS'. Но если вы собираетесь называть 'Get_Value', для этого вам нужен объект' OUTER' или 'EXTENSION_CLASS'. Поэтому вам нужно решить: на каком объекте вы пытаетесь сделать «Get_Value»? – ajb

+0

См. Ответ Рошита - если вы хотите получить доступ к методу экземпляра из статического контекста, у вас должен быть экземпляр класса. – gknicker

1

Вы пытаетесь сделать static ссылки на нестатический член.

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

Чтобы устранить проблему, удалите модификатор static как из кластеров NESTED1, так и из NESTED2.

С другой стороны, если вы не хотите, чтобы удалить модификатор static, вам придется создать объект из OUTER или EXTENSION_CLASS классов, а затем вызвать Get_Value() с помощью объекта.

Например:

public void Method1() 
{ 
     int value=0; 
     EXTENSION_CLASS ext = new EXTENSION_CLASS(); 
     value=ext.Get_Value(); 
     System.out.println("Method1: "+value); 
} 

ИЛИ

public void Method1() 
{ 
     int value=0; 
     OUTER outer = new OUTER(); 
     value=outer.Get_Value(); 
     System.out.println("Method1: "+value); 
} 
+0

По некоторым причинам я не хочу удалять статический модификатор. Есть ли другое решение? Благодаря ! –

+0

Можете ли вы использовать метод 'EXTENSION_CLASS.Get_Value()' static'? – anacron

+0

Вы можете получить доступ к методу Get_Value() 'без удаления статического элемента, создав объект классов' OUTER' или 'EXTENSION_CLASS'. См. Обновленный ответ. – anacron

0

ошибка говорит каждую вещь. Вы не можете вызывать нестатические методы из статических методов/классов. Чтобы заставить его работать, просто добавьте статическое ключевое слово в метод Get_Value в EXTENSION_CLASS.

1

Если вы хотите, чтобы вложенные классы были статичными, вам нужно создать экземпляр OUTER в Method1() для доступа к Get_Value().

public void Method1() 
    { 
     int value=0; 
     OUTER outer = new OUTER(); 
     value=outer.Get_Value(); 
     System.out.println("Method1: "+value); 
    } 
Смежные вопросы