2013-06-08 1 views
3

У меня есть сомнение, если у меня есть нестатический вложенный класс, почему мне нужно использовать ключевое слово «this» для вызова метода или переменной моего вмещающего класса? Что я думаю о следующем: если нестатический вложенный класс может обращаться к методам и переменным своего охватывающего класса, а экземпляр нестатического вложенного объекта уже связан с его экземпляром окружающего объекта, почему мне нужно использовать «этот», ? Например, у меня есть следующий код:Зачем мне нужно использовать ключевое слово «this» для вызова моих закрытых методов или переменных

public class ClassA { 

    public class ClassB { 

     public void bye() { 
      ClassA.this.hello(); 
      // Why not just ClassA.hello()? 
     } 
    } 

    public void hello() { 

    } 
} 

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

+1

Вы можете просто набрать hello(). Без этого ключевого слова возникла бы двусмысленность со статическими методами внешнего класса. –

+1

Определение находится здесь: http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.8.4 – flup

ответ

6

Прежде всего, вы можете просто позвонить hello().

ClassA.hello() будет искать статический метод с именем hello() в ClassA. ClassA.this.hello() ищет метод экземпляра.

+0

Спасибо! если из метода моего охватывающего класса я хочу вызвать метод одного из моих нестатических классов, как я должен это делать? Например, если из моего метода hello() я хочу позвонить bye(), как я должен набирать? – zer0uno

+1

@antox Вам нужно вызвать его на экземпляр внутреннего класса, например 'new ClassB(). Bye()'. –

1

Рассмотрим случай, когда как внутренний и внешний класс имеет метод с той же подписью, вы должны быть в состоянии определить, какой один позвонить:

public class ClassA { 

    public class ClassB { 

     public void hello(){ 
      System.out.println("Hello b!); 
     } 
    } 

    public void hello() { 
     System.out.println("Hello a!); 
    } 
} 

Что произойдет, если вы звоните привет () из классB? Вы получаете Hello b!

Что произойдет, если вы позвоните это.hello() из классаB? Вы получаете Hello b!

Эти два эквивалента.

Что касается звонка ClassA.hello() из классB? Вы получаете исключение, не существует статического метода, называемого hello().

Но если вы позвоните ClassA.this.hello() из классB? Вы получаете Привет! Это синтаксис для получения ссылки на внешний класс из внутреннего класса, если у них обоих есть метод с одной и той же сигнатурой, иначе было бы лишним использовать этот синтаксис, поскольку внутренние классы уже имеют доступ к методам внешних классов.

+0

Но вопрос в том, почему 'ClassB.hello() 'не хватает – flup

+0

, что является синтаксисом вызова статического метода. Но не существует статического метода, называемого hello(), объявленного – Zavior

+0

. Вам не нужно вводить 'this.hello()' для вызова нестатического метода, называемого 'hello()' в обычных классах. – flup

1

ClassA.hello() будет работать, если hello() были объявлены как static. Но поскольку это метод , его нужно вызвать в экземпляре.

Синтаксис ClassA.this называется квалифицированного this в JLS 15.8.4, и это единственный способ, чтобы обратиться к this экземпляра типа вмещающей.

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

  • Нет связанных вопросов^_^