这一节我们再看一个特殊的代码块,那就是构造代码块。
这里我们简单的通过例子来说明一下:
~~~
class Person
{
private String name;
{
System.out.println("Person类的第一个代码块被执行");
}
Person()
{
System.out.println("无参数构造函数被执行");
this.name = "小宝宝";
}
Person(String name)
{
System.out.println("有name参数构造函数被执行");
this.name = name;
}
public void speak()
{
System.out.println("名字:"+name);
}
}
class ConBlockTest
{
public static void main(String[] args)
{
Person p1 = new Person();
p1.speak();
Person p2 = new Person("小科比");
p2.speak();
}
}
~~~
我们在这个例子中看到了Person类中有一个代码块,它没有被static关键字修饰,这就是我们这一节所说的构造代码块,为什么这么说呢,我们看运行结果:
![](https://box.kancloud.cn/2016-05-18_573c422a9c286.jpg)
我们很显然就看到了在我们创建两个对象时,该代码块都被执行了,而构造函数只是当创建对应对象时被调用。
所以构造代码块的作用就是:**给所有对象进行相同部分的初始化。**
而我们的构造方法是对对应的对象进行有针对性的独特的初始化。
那么构造代码块的构造函数哪个先执行呢?我们看代码:
~~~
class Person
{
private String name;
{//第一个构造代码块
System.out.println("Person类的第1个代码块被执行");
}
Person()
{
System.out.println("无参数构造函数被执行");
this.name = "小宝宝";
}
Person(String name)
{
System.out.println("有name参数构造函数被执行");
this.name = name;
}
public void speak()
{
System.out.println("名字:"+name);
}
{//第二个构造代码块
System.out.println("Person类的第2个代码块被执行");
}
}
~~~
我们看结果:
![](https://box.kancloud.cn/2016-05-18_573c422aae4e6.jpg)
我们看到两个不同位置的构造代码块都在构造函数被执行之前就已经执行了,所以说**构造代码块优先于构造函数执行。**
**
**
所以,当我们需要把所有对象都有相同的初始化时,我们可以使用构造代码块来实现,比如上面的例子中,人一出生都会哭,那么我们就可以用构造代码块来初始哭这个功能:
~~~
class Person
{
private String name;
{
cry();
}
Person()
{
this.name = "小宝宝";
}
Person(String name)
{
this.name = name;
}
public void cry()
{
System.out.println("哇哇");
}
public void speak()
{
System.out.println("名字:"+name);
}
}
~~~
这样我们就把所有对象哭的功能封装到了一个构造代码块中,在创新对象是会优先执行,很好的实现了我们想要的功能。
![](https://box.kancloud.cn/2016-05-18_573c422abf8e0.jpg)
- 前言
- 1.1 基本常识
- 1.2 Java语言概述
- 1.3 Java语言的环境搭建
- 1.4 Java程序开发之初体验--Hello World
- 2.1 关键字
- 2.2 标识符
- 2.3 注释
- 2.4 常量
- 2.5 进制扫盲
- 2.6 变量和数据类型(1)
- 2.7 变量和数据类型(2)
- 2.8 运算符
- 3.1 if语句
- 3.2 switch语句
- 3.3 while和do-while语句
- 3.4 for语句
- 3.5 for循环的嵌套
- 3.6 break语句与continue语句
- 4.1 函数的定义
- 4.2 定义函数的两个明确
- 4.3 函数的内存加载过程
- 4.4 函数的重载
- 5.1 数组的定义
- 5.2 数组的内存分配及特点
- 5.3 数组操作中常见问题
- 5.4 数组常用操作(1)
- 5.5 数组常用操作(2)
- 5.6 二维数组
- 6.1 面向对象的概述
- 6.2 类与对象的关系
- 6.3 对象的内存体现
- 6.4 成员变量与局部变量
- 6.5 类类型参数与匿名对象
- 6.6 基本数据类型参数与引用数据类型参数的传递过程
- 6.7 封装
- 7.1 构造函数概述与默认构造函数
- 7.2 构造函数与一般函数的区别
- 7.3 构造函数的重载
- 7.4 构造函数的内存加载
- 7.5 构造函数需要注意的几个细节
- 7.6 this关键字的原理
- 7.7 this关键字的细节与应用
- 8.1 static关键字之特点
- 8.2 成员变量与静态变量的区别
- 8.3 static关键字使用的注意细节
- 8.4 main函数的解析与细节
- 8.5 static关键字的使用场景
- 8.6 静态的内存加载
- 8.7 静态代码块
- 8.8 构造代码块
- 9.1 继承
- 9.2 单继承与多重继承
- 9.3 子父类中成员变量特征体现