package test1;
class person_3 {
private int age;
private String name;
person_3() {
System.out.println("age:" + age + " name: " + name);
}
person_3(int i) {
age = i;
System.out.println("age:" + age + " name: " + name);
}
person_3(int i, String s) {
age = i;
name = s;
System.out.println("age: " + age + " name: " + name);
}
{
cry();
}
public void cry() {
System.out.println("孩子哭了!");
}
}
public class shiyan {
public static void main(String[] args) {
person_3 p1 = new person_3();
person_3 p2 = new person_3(15);
person_3 p3 = new person_3(12, "zhangsan");
}
}
上述代码中展示的是构造函数的方式,但是同时在代码中存在一个笔试时常见的问题,就是方法体中的
{
cry();
}
在这段代码中没有任何的提示,不像方法有方法名,但是在执行的结果中我们可以看到孩子哭了!
age:0 name: null
孩子哭了!
age:15 name: null
孩子哭了!
age: 12 name: zhangsan
他确实执行了代码中的cry()方法。那么这是什么呢?答案是:构造代码块。这个概念在实际的应用中并不常见,但是在笔试中却很多,问题的方式有:让你说一下程序中的代码运行的顺序、让你说出该段代码的作用。这说这个之前我,我们首先要搞明白一点就是什么是构造函数。在我们建立对象时,与之对应的构造函数就会被调用,注意是“与之对应的构造函数”,这有牵扯到一个问题,就是构造函数有几种?在我们的类中,如果我们没有为类建立构造函数,那么系统会自己创建一个空的构造函数,但是如果我们自己创建的有的话,不管合适不合适,系统都不在为我们创建构造函数了,例如在函数中我们创建了如下的构造函数
package test1;
public class shiyan{
private int age;
shiyan(int i){
age = i;
System.out.println("name"+age);
}
public static void main(String[] args){
Person p = new Person();
}
}
在类中我们创建了Person(int i)这个构造函数,则系统默认不会给我们创造了,在执行语句的时候会出现如下错误:Person.java:8: 找不到符号 符号: 构造函数 Person() 位置: 类 Person Person p = new Person();
^ 1 错误
因为我们在执行到Person
p = new Person()时,并没有找到构造函数的存在;说了这么多,有人会问构造函数到底有什么用呢?其实构造函数就是用于给对象进行初始化的,每个类在对象建立的同时,构造函数就在运行了,目的是给对象进行初始化。那么我们应该在什么时候定义构造函数,什么时候使用默认的呢?当我们在对事物进行分析时,如果发现事物存在具备一些特性或者行为时,那么我们就可以定义构造函数了,并把这些内容定义在构造函数中。
现在回到开始的那个问题,构造代码块有什么用?它的作用其实很简单,和构造函数一样,也是为对象进行初始化用的,共同点是在对象一建立的时候他们都在运行,但是他们的区别在于:构造代码块要优先于构造函数执行,同时,构造代码块是给所有对象进行统一的初始化,而构造函数则是给对应的对象进行初始化,就像在首段代码中,我们在进行Person p1 = new Person(15);的时候,会运行Person(int i){、、、、、}这个构造函数,在在进行person_2 p3 = new person_2(12, "zhangsan");这个的时候,则系统会运行person_2(int i, String s) {、、、、}这个构造函数,也就是所谓的“给对应的对象进行初始化",然而,不管是运行哪段代码,构造数码块是必须首先运行的,即"构造代码块是给所有对象进行统一的初始化“