2015-12-01 3 views
1
class MyClass { 

} 

public class Test { 
    public static void main(String[] args) { 
     MyClass g = new MyClass(); 
     System.out.println(g.getClass()); //print MyClass 

     MyClass g2 = new MyClass(){}; 
     System.out.println(g2.getClass()); //print Test$1 
    }  
} 

Может кто-то пожалуйста, объясните мне:Интересный способ для создания нового экземпляра в Java

  1. Что нового MyClass() {} на самом деле означает?
  2. Почему разные выходы?
+6

Это анонимный класс. – SLaks

ответ

5

При размещении брекетов после new MyClass() вызова, то есть синтаксис для анонимного класса, который подклассы явного класса. {} - это пустое тело класса, поэтому ничего не переопределяется, и конструкторы не объявляются.

Test$1 Выход отличается тем, что анонимный подкласс имеет неявное имя, которое является класс вшита (Test), то знак доллара $, то порядковый номер (1). При компиляции Test.java вы можете заметить, что кроме Test.class и MyClass.class, Test1.class также существует - файл класса для анонимного класса. Если бы вы объявили еще один анонимный подкласс в классе Test, после вашего первого анонимного подкласса, он будет иметь имя Test$2, независимо от того, какой класс он фактически подклассы.

+0

Я немного смущен. Если g является подклассом MyClass (и поэтому он может переопределить любой метод в MyClass), почему g.getClass.getName() не возвратил MyClass? – xcoder

+0

Переменная 'g' относится к экземпляру анонимного класса, который является типом среды выполнения объекта. (Второй 'g'; вы повторно объявили' g'.) Метод getClass возвращает объект класса, соответствующий типу времени выполнения объекта, на который он вызван. – rgettman

0

Что нового означает MyClass() {}?

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

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

Например,

класса А { }

//somewhere i wrote like, 
Class A = new A(){...}; 
Means new A(){...} is subclass of A. 
for example, Class B extends A{...}, in this case Class B is sub class of A. 

Так в конечном счете класс, который является подклассом А, который не имеет никакого имя, это называется анонимного класса.

так что имейте в виду, что здесь вы запрашиваете анонимное [no name].

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