今天回想这几天走过的Java路程,发现漏了一个点,就是构造代码块,我绞尽脑汁,也没想起来它的做用,我骗不了我本身,就搜相关资料,从新学习,在学习的过程当中发现构造代码块和构造函数有必定的联系,为了捕捉这种联系,我总结了一个案例,这个案例能加深你对构造函数和构造代码块的理解。我写这个博客一是为了不下次再被构造代码块这块石头绊倒,二是为了能给须要解惑的人提供一些帮助,仍是那句话:前端
越懂得与人分享,你的价值增值越大!java
看代码前要先明白一个需求:jvm
使用Java类描述一个婴儿,假设如今两种婴儿,一种婴儿是一出生就有了名字,咱们把这种婴儿叫白户,另外一种婴儿是出生后才有了名字,咱们把这种婴儿叫黑户。(为了方便理解,我把刚出生就已经有名字的叫白户,把出生后才起名的叫黑户)函数
//婴儿类
public class Baby { int id;//身份证 String name;//名字 //哭 public void cry(){ System.out.println(name+"哇哇的哭。。。。"); } } class Test{ public static void main(String[] args) { //建立一个baby对象 Baby baby = new Baby();//婴儿出生 baby.id=111; baby.name="小娃娃";//黑户 baby.cry(); } }
运行结果: 小娃娃哇哇的哭。。。。
因为小娃娃是出生以后才赋的值,因此小娃娃是黑户,咱们如今要让婴儿一出生就有名字,就要用构造函数。学习
构造函数的做用: 给对应的对象进行初始化this
构造函数定义的格式:spa
修饰符 函数名(形式参数){ 函数体。。。 }
构造函数要注意的细节:对象
1.构造函数没有返回值类型blog
2.构造函数的函数名必需要与类名一致生命周期
3.构造函数并非由咱们手动调用的,而是在建立对应的对象时,jvm就会主动调用到对应的构造函数
4.若是一个类没有显式的写上一个构造方法时,Java编译器会为该类添加一个无参的构造方法
5.若是一个类已经显示的写上一个构造方法时,Java编译器不会再为该类添加无参的构造方法
6.构造函数是能够在一个类中以函数重载的形式存在多个的
//婴儿类
public class Baby {
int id;//身份证
String name;//名字
//无参构造函数
public Baby(){
}
//有参构造函数
public Baby(int id, String name) {
this.id = id;
this.name = name;
System.out.println("Baby的属性初始化完毕!!!");
}
//哭
public void cry(){
System.out.println(this.name+"哇哇的哭。。。。");
}
}
class Test{
public static void main(String[] args) {
//建立一个baby对象
Baby baby = new Baby(222,"小可爱");//婴儿出生 白户
baby.cry();
}
}
运行结果: Baby的属性初始化完毕!!! 小可爱哇哇的哭。。。。
经过上面的黑户和白户,咱们能对构造函数有个深入的理解,下面我再引伸出构造代码块,依旧是这个例子,可是需求变了,如今的需求是婴儿一出生就必须哭,可能说到这,要是有人理解了上面的代码,确定立刻就能想到,这还不简单,把哭的方法写到构造函数中不就好了,对,这样确实也能够,可是有弊端,Java要求代码简练,能少写的就很少写,你先看下面的代码就知道了
//婴儿类 public class Baby { int id;//身份证 String name;//名字 //无参构造函数 public Baby(){ cry(); } //有参构造函数 public Baby(int id, String name) { this.id = id; this.name = name; cry(); } //哭 public void cry(){ System.out.println("哇哇的哭。。。。"); } } class Test{ public static void main(String[] args) { //建立一个白户baby对象 Baby baby = new Baby(222,"小可爱");//白户 //建立一个黑户baby对象 Baby baby1 = new Baby();//黑户 } }
运行结果: 哇哇的哭。。。。 哇哇的哭。。。。
虽然白户黑户两种婴儿都在出生的时候哭了,可是在两个构造函数中出现了重复代码,cry()方法重复了两次,为了解决重复代码这个问题,下面就让构造代码块出场吧!
构造函数的做用:给对应的对象进行初始化
构造代码块的做用: 给对象进行统一的初始化
构造代码块的格式:
{ 构造代码块 }
注意:构造代码块的大括号必须位于成员位置上
代码块的类别:
1.构造代码块
2.局部代码块 大括号位于方法以内 做用:缩短局部变量的生命周期,节省一点点内存
3.静态代码块
static{ 静态代码块 }
构造代码块要注意的事项:
1.Java编译器编译一个Java源文件的时候,会把成员变量的声明语句提早至一个类的最前端
2.成员变量的初始化工做其实都是在构造函数中进行的
3.一旦通过Java编译器编译后,构造代码块的代码就会被移动到构造函数中执行,是在构造函数以前执行的,构造函数中的代码是最后执行的
4.成员变量的显式初始化与构造代码块的代码是按照当前代码的顺序执行的
//婴儿类
public class Baby {
int id;//身份证
String name;//名字
//构造代码块
{
cry();
}
//无参构造函数
public Baby(){
}
//有参构造函数
public Baby(int id, String name) {
this.id = id;
this.name = name;
}
//哭
public void cry(){
System.out.println("哇哇的哭。。。。");
}
}
class Test{
public static void main(String[] args) {
//建立一个白户baby对象
Baby baby = new Baby(222,"小可爱");//白户
//建立一个黑户baby对象
Baby baby1 = new Baby();//黑户
//匿名对象
new Baby();
}
}
运行结果: 哇哇的哭。。。。 哇哇的哭。。。。 哇哇的哭。。。。
//婴儿类
public class Baby {
int id;//身份证
String name;//名字
//构造代码块
{
cry();
}
//无参构造函数
public Baby(){
}
//有参构造函数
public Baby(int id, String name) {
this.id = id;
this.name = name;
}
//哭
public void cry(){
System.out.println("哇哇的哭。。。。");
}
}
class Test{
public static void main(String[] args) {
//局部代码块
{
//建立一个白户baby对象
Baby baby = new Baby(222,"小可爱");//白户
//建立一个黑户baby对象
Baby baby1 = new Baby();//黑户
//匿名对象
new Baby();
}
}
}
所有写完了,若是你以为对你有用,记得推荐,若是以为哪不对,欢迎指正!
本文已独家受权给脚本之家(jb51net)公众号独家发布