2012-06-15 3 views
8

Я читал, что в интерфейсах Java невозможно создать экземпляр (in the documentation, Interfaces). Runnable, по определению, является интерфейсом, который должен реализовываться каким-то классом. Но в следующем фрагменте кода из одного из моих приложений Android я вижу, что был использован пустой конструктор - Runnable() ... (я не уверен, является ли это конструктором), и экземпляр был создан - getStatus.Android и Java: использование runnable

final Runnable getStatus = new Runnable() 
{ 
    public void run() 
    { 
     TextView uat = (TextView) findViewById(R.id.useAndThrow); 
     uat.setText(MyThread.getStatus()); 
     return; 
    } 
}; 

То, что я пришел, чтобы узнать:

  1. Это, пожалуй, пример анонимного класса.
  2. Экземпляр не является интерфейсом.

Но я не могу подключить точки. Предполагая, что вышеуказанный код находится внутри класса myActivity, что создается и как этот анонимный класс?

Немного подробно было бы здорово.

ответ

7

Это называется «анонимный класс». Некоторые примечания об этом:

  1. Вы не указали ему имя, поэтому оно создано для вас. Чтобы узнать, каково его настоящее имя, просто напишите его на консоль или прочитайте байт-код.

  2. Анонимный класс, созданный в рамках внешнего класса, имеет ссылку на его поля, как и любой внутренний класс. В общем, он имеет ту же область, в которой он был создан.

  3. Это очень распространенная вещь, если все, что вам нужно, это простая реализация. Чем больше кода есть, тем больше вы должны поместить его в другой файл (для заказа, а не потому, что вы не можете).

  4. Runnable - не единственный интерфейс, который является общим. На Android вы используете OnClickListener, OnTouchListener, ...

  5. Поскольку анонимный класс имеет ту же область действия, где и был объявлен, это означает, что у него есть ссылка. Старайтесь никогда не сохранять анонимный класс слишком долго (например, в статической ссылке), так как это может привести к утечке памяти. На Android это очень важно, так как это показывает sample (речь идет о drawables, но анонимный класс также может иметь ссылку на контекст).

  6. Некоторые из недостатков анонимных классов состоят в том, что у них нет конструктора и он не может реализовать более одного интерфейса.Он имеет очень узкое применение, но он очень популярен, так как он очень прост в использовании (и читается).

1

Что представляет собой анонимный подкласс Runnable. Это называется анонимным, потому что сам тип не имеет имени. В этом подклассе вы реализуете метод run(), который указан в интерфейсе Runnable.

Типа getStatus является Runnable, однако объект, на который ссылается на getStatus на самом деле является реализация Runnable, которая не имеет явное имя типа.

0

Код создает экземпляр класса, который реализует интерфейс Runnable. Класс не имеет имени.

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