我有一个班级User
,只有两个字段:id,name
package test;
public class User {
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
然后在Main
类中,我试图用两种不同的方法初始化User对象:
package test;
/**
* @author lhuang
*/
public class Main {
public static void main(String[] args) {
User u = new User() {
{
setId(1l);
setName("LHuang");
}
};
System.out.println(u.getClass());
User u2 = new User();
u2.setId(1l);
u2.setName("LHuang");
System.out.println(u2.getClass());
}
}
然后我可以得到输出
class test.Main$1
class test.User
有趣的是为什么u类是Main的内部类类型?但实际上我仍然可以使用u.getId()
和u.getName()
方法。
答案 0 :(得分:6)
您正在创建一个anonymous class,其范围为User
:
User u = new User() { //<-- this open bracket defines a new class
{
setId(1l);
setName("LHuang");
}
};
答案 1 :(得分:2)
此
User u = new User() { // here's your derived class
{ // here's the initialiser block
setId(1l);
setName("LHuang");
}
};
创建一个新的匿名子类User(外部大括号),然后在其中定义一个初始化块(内部大括号)。
为了清楚起见,通常建议避免使用上述结构(没有多少人知道它是如何工作的),并且由于你正在创建一个内部类,它会有一个隐式引用外部类。这可能会导致垃圾回收和序列化问题。
话虽如此,我会谨慎地使用上述内容(例如,由于其简洁性,在单元测试等中设置测试集合)