在Java中,代码块{}分为好几种,其中一种就是构造代码块,何为构造代码块呢?简单来说就是用{}包起来的代码片段,在创建对象时会被调用,每次创建对象时都会被调用。
在刷题的时候,发现有这样一种用法:
object a=new object(){
一个构造方法
};
可以看到, 我们在new对象的时候,没有立即用“;”结束,而是在构造代码块中使用了一个构造方法。问题来了,这样的表达,是什么意思呢?上面不是提到,构造代码块在创建对象时会被调用,每次创建对象时都会被调用。在上面代码中,我们new后并没有立即用“;”结束,而是调用了代码块中构造方法,因此这相当于创建对象直接调用了方法。在new的时候,会在堆中开辟空间,并检查class是否存在,在上面的代码中,object是超类,因此可以直接进行调用。我大胆的发散思维一下,假如我们用的不是object,这样的代码块还能不能这样调用里面的构造方法呢?做了如下的试验:
package FF;
public class TestStu{
public static void main(String[] args)
{ Student o=new Student(){
public boolean equals(Student ss)
{
return true;
}
};
System.out.println(o.equals("hs"));
}
}
class Student{
}
运行结果为:
false
为什么结果是false呢?说明并未能成功调用equals()方法,因为equals(“hs”)中的“hs”不是Student类。那么,假如我们将构造方法equals(“hs”)换成equals(o)会不会成功调用呢?
package FF;
public class TestObj{
public static void main(String[] args)
{ Student o=new Student(){
public boolean equals(Student ss)
{
return true;
}
};
System.out.println(o.equals(o));
}
}
class Student{
}
结果如下:
true
说明是完全OK的。
我们还可以发现new对象然后加个构造代码块,与构造方法是非常像,都是这样形式的:
A(){
}
细心的我们可以看到,若是构造方法的话,不会出现new和“;”等字眼。