2012-04-10 2 views
0

Я изучаю кодирование в течение 2 месяцев. Я работаю на Java на платформе Android. Я пытаюсь лучше понять неназванные объекты.Java Без названия Объекты

В отношении 7-й строки этого примера «this.button2.setOnClickListener (новый OnClickListener() {...});"

a) Является ли OnClickListener объектом? (Я думаю, что это так, поскольку было использовано «новое» ключевое слово)

b) Может ли (и должен) быть назван?

c) Как он будет называться?

d) Как можно было бы обратиться к нему в будущем? Является ли это возможным? Могут ли они быть изменены во время выполнения, если это необходимо?

e) Будет ли эта работа ?: "this.button2.setOnClickListener (OnClickListener namedObject = new OnClickListener() {// методы идут здесь});"

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main2);  
    this.button2 = (Button) this.findViewById(R.id.button2);  
    this.button2.setOnClickListener(new OnClickListener() 
    { 
     public void onClick(View v) 
     {      
      Intent i = new Intent(getApplicationContext(), Absolute.class); 
      startActivity(i); 
     } 
    }); 
} 

ответ

4

а) Да, это объект.

b) Да, его можно назвать, но это необязательно должно быть (если вам не нужно будет ссылаться на него в будущем или иметь другой способ ссылаться на него).

с) Вы можете сделать:

OnClickListener myOnClickListener = new OnClickListener() { 
    // Contents of the OnClickListener go here... 
} 
this.button2.setOnClickListener(myOnClickListener); 

d) Если бы вы назвали его (как показано выше), он может упоминаться под именем. Он может быть указан во время выполнения, если у вас есть ссылка на него, вызывая любые методы мутатора для объекта.

e) Этот синтаксис недействителен. См. (C) для правильного способа совершения этого вызова.

+0

Спасибо за ответ! –

+0

Здесь есть некоторая путаница. Объекты не имеют имен. Классы имеют имена или, как в этом случае, нет. Это предмет анонимного класса. Ваш (c) дает имя * ссылке * на объект. – EJP

+0

@EJP. Вы, конечно, правы, хотя я подумал, что, «называя это», он имел в виду предоставление ссылки на него. –

0

OnClickListener, как вы подозреваете, является объектом и называется анонимным классом/объектом. Его не нужно называть, потому что он используется как «обратный вызов» для кнопки объекта2. Это означает, что вы передаете button2 объекту, который button2 делегирует некоторые две работы. В этом случае эта работа - это все, что происходит при нажатии кнопки.

Таким образом, при нажатии кнопки он вызывает объект, который вы здесь устанавливаете. Чтобы функционировать, нужно определить метод «onClick», который вы используете в своем примере кода. Поскольку этот метод существует, кнопка2 может вызвать его и выполнить код, который вы предоставляете, в этом случае создавая объект Intent и начинающий действие.

Поскольку он объявлен внутри вызова функции, как только этот вызов функции завершен, он выходит из области видимости, и вы не можете ссылаться на него. По этой причине нет особых причин, чтобы назвать его (кнопка2 будет иметь внутреннее имя, к которому у вас нет доступа и не заботятся). Если вы объявите класс вне вызова функции, вы можете назвать его и ссылаться на него позже ... но обычно это не требуется.

Я думаю, что его можно модифицировать во время выполнения, но вы должны избегать этой сложности, если это необходимо.

+0

Спасибо, что выяснил, что такое Анонимный объект. –

+0

есть ли способ ссылаться на анонимный объект, созданный внутри ссылочного вызова? –

+0

Не напрямую. Если объект, которому вы передаете анонимный объект, имеет способ ссылаться на него, то возможно. Это зависит от реализации объекта, которому требуется обратный вызов. –

0

Это анонимный класс java.
Вам не нужно называть его, конечно, вы можете назвать его, но если класс используется только один раз, вы можете использовать анонимный класс для удобства.
Новый onclicklistener() означает, что этот анонимный класс получен из onclicklistener.
Вы также можете реализовать некоторые интерфейсы в анонимном классе.

+0

, когда вы говорите: «Этот анонимный класс получен из onClickListener», вы на самом деле имеете в виду «этот анонимный OBJECT происходит от onClickListener»? –

+0

Да, на самом деле анонимный класс используется именно так. Потому что метод должен знать, какие методы имеет анонимный класс. – cloudygoose

+1

@blackscholes: Это на самом деле класс. То, что вы определяете между фигурными фигурными скобками, представляет собой класс, который немедленно создается (с ключевым словом 'new', как вы сказали), а затем выброшен. –

0

a. OnClickListener - это тип (абстрактный класс/интерфейс), в котором появился метод, который необходимо реализовать. В этом случае вы просто реализовали отсутствующий метод «inline» b. Его можно назвать. Но нет такой вещи, как должно быть. Это вопрос выбора. Если вы собираетесь повторно использовать один и тот же объект несколько раз, вы можете назвать его.

c. Либо путем внедрения inline, как:

OnClickListener ocl = new OnClickListener() { 
    public void onClick() { 
     ... 
    } 
} 

OR 

public class MyOnClickListener extends OnClickListener { 
    public void onClick() { 
     ... 
    } 
} 
OnClickListener ocl = new MyOnClickListener() 

Я предположил, что OnClickListener является абстрактным классом здесь. Если это интерфейс, вы просто меняете слово extends на tools. Остальное остается прежним.

d. Если вы назначаете его переменной, вы можете ссылаться как таковой. Вы не можете ссылаться на реализацию, если вы ее внедряете.

e. Присвоение переменной в аргументе недопустимо.

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