为什么这两个看似相同的对象有不同的类类型?

时间:2015-05-29 14:22:37

标签: java

我有一个班级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()方法。

2 个答案:

答案 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(外部大括号),然后在其中定义一个初始化块(内部大括号)。

为了清楚起见,通常建议避免使用上述结构(没有多少人知道它是如何工作的),并且由于你正在创建一个内部类,它会有一个隐式引用外部类。这可能会导致垃圾回收和序列化问题。

话虽如此,我会谨慎地使用上述内容(例如,由于其简洁性,在单元测试等中设置测试集合)