2015-03-02 2 views
0
Animal D = new Animal("Leo") { 
        @Override public void makeNoise() { 
         System.out.println("Roar!"); 
        } 
     }; 
D.makeNoise(); 

Итак, когда я спросил, что в этом мирном синем мире это было, мне сказали, что это анонимный класс. Затем я просмотрел соответствующий материал и понял, что это классы без имени и используются только один раз. Если это так, то что такое D? Почему анонимный класс имеет имя «D» здесь?Анонимный класс на Java?

Во-вторых, делать анонимные классы обязательно должны расширить какой-либо другой класс (будь то сам Космический объект)?

В моем первоначальном коде Animal на самом деле является абстрактным классом. Что этот анонимный класс связан с Animal? Расширяет ли он абстрактный класс?

+0

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

+0

Я закрыл это как дубликат, хотя я согласен с тем, что ответы на ваши исходные вопросы оставляют желать лучшего, поэтому я понимаю необходимость продолжения. В частности, я думаю, что эти ответы действительно должны быть улучшены, чтобы объяснить все в этой теме. – Thilo

+0

Голосование, чтобы repoen. ** ** ** * * * * * * * * * * * Вопросы принципиально разные; даже если следовать за другим. (Я уверен, что это может быть закрыто как * a * дубликат с некоторыми копаниями, но ..) – user2864740

ответ

0

D является экземпляром животных. Это также ваш анонимный класс. Это также экземпляр объекта. Так наследование работает. Он также не должен быть капитализирован. Используйте d, и вы будете соответствовать стилю.

Вот ваша цепочка наследования. Вы не можете отдать его анонимному классу, но это не остановит анонимный класс от переопределения метода makeNoise().

Object 
^
    | 
Animal 
^
    | 
This Anonymous Class 
+2

D - это анонимный класс, который расширяет Animal. Это не анонимный класс. –

+0

Вы уверены, что D является экземпляром анонимного класса, а не ссылочной переменной типа Animal, которая указывает на анонимный класс типа животного? –

+1

@TrentBoult Если вы положили на него тонкую точку, да. У анонимного класса нет имени. Любой экземпляр любого класса также не имеет имени. У них есть адреса. Адреса - это боль, которую нужно помнить, поэтому мы не имеем дело с ними непосредственно на Java. Строго говоря, 'D' является идентификатором. Этот идентификатор связан с адресом. Память по этому адресу является ссылкой. Эта память содержит другой адрес (когда он не является «null»), который является адресом экземпляра. Когда я говорю «D» - это экземпляр, я разыскиваю эту ссылку. – CandiedOrange

0

Класс на самом деле является подклассом, который распространяется на животных. Скобки, которые внутри являются реализацией класса, указывают на то, что makeNoise перезаписывается.

Для второго вопроса да, в основном анонимный класс произошел, когда вы хотите наследовать класс и модифицировать некоторые реализации, но вы не хотите требовать новый класс подробно, поскольку он действительно короткий или просто удобный.

2

Dпеременная, представляющая значение/объект, соответствующий (читается: «присваиваемый») животному.

Фактический объект назначен новый экземпляр анонимного типа, который на самом деле является подтип животного.

+0

Могу ли я просто сказать, что D является ссылочной переменной типа Animal (как обычно указывает на животное), которая указывает на анонимный класс, который расширяет Animal? –

+0

@TrentBoult Да, это так. Обратите внимание, что ваш анонимный класс 'D' также по-прежнему является« Animal ». – m0skit0

+0

@TrentBoult Да; D - переменная, и анонимный класс, показанный [неявно], расширяет Animal. (Хотя мне лично не нравится фраза «ссылочная переменная» .. :) – user2864740

1

Если это так, что такое D? Почему анонимный класс имеет имя 'D' здесь?

Это не имя класса, это имя переменной/ссылки для анонимного класса.

Во-вторых, делать анонимные классы обязательно должны расширить какой-либо другой класс (будь то сам космический объект)?

Да, в Java все классы распространяются от Object. Он также может реализовывать интерфейс (помимо расширения, конечно, Object). Типичным интерфейсом для реализации является Runnable.

final Runnable runnable = new Runnable() { 
     @Override 
     public void run() { 
      // Does amazing stuff 
     } 
    }; 

Что это анонимный класс должен делать с животным? Расширяет ли он Animal abstract?

Да, она расширяет Animal, что на самом деле означает, что являетсяAnimal (проверьте).

+0

Cheers buddy. Почему вы говорите, что класс Animal должен быть абстрактным в вашей последней строке? –

+0

Кроме того, могу ли я просто сказать, что D является ссылочной переменной типа Animal (как обычно указывает на животное), которая указывает на анонимный класс, который расширяет Animal? –

+0

Извините, моя ошибка, она не должна быть абстрактной, исправлена. И да, 'D' является ссылочной переменной типа Animal, которая указывает на анонимный класс, который расширяет Animal. – m0skit0

0

Да, анонимные классы должны реализовать интерфейс или расширить существующий класс. На самом деле, D не является самим Животным; он принадлежит подтипу Animal.

public class Main { 
    public static void main(String[] args) { 
     Object a = new Object() { 
      @Override 
      public String toString() { 
       return ""; 
      } 
     }; 
     System.out.println(a.getClass().toString()); 
     System.out.println(new Object().getClass().toString()); 
    } 
} 

Этот код дает:

класса Main $ 1

класс java.lang.Object

+0

'toString()' не нужно, он вызывается автоматически. – m0skit0

+0

@ m0skit0 Я знаю. Написал только для ясности. – Everv0id

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