Java学习之旅第二季-7:类成员之构造方法与代码块

除了之前我们介绍的属性和方法之外,类中还可以出现一种称为构造方法的的特殊方法和使用相对较少的代码块。本小节我们来看看这两个类成员的使用语法。

7.1 构造方法

在介绍类的实例化时,我们是提过构造方法的,不过当时只局限在它能实例化对象和使用new关键字调用。

从概念上看构造方法是在创建对象后立即初始化对象的命名代码块,其主要作用是初始化对象的属性。

显式声明构造方法的示例如下:

public class Dog {
    public Dog(){
    }
}

上面的无参构造方法并没有实现任何功能,只是明确把它声明出来了。从上面的代码可以看出来,构造方法的语法特征包括:

  • 方法名与类名完全一致:第2行的方法名和类名是一样的,这并不符合方法的一般命名规范
  • 没有返回值,且不能有返回值类型(包括 void ):方法名前面,除了修饰符之外是不能出现返回值类型的,如果有返回值类型,它就不是合法的构造方法,但可以是一个普通的方法

在之前我们创建对象时,使用new关键字调用的就是构造方法,但是在类中并没有看到有任何构造方法声明,这是因为如果没有为类显式声明构造方法时,编译器会提供一个默认的无参构造方法,与上面显式声明的一样。

但是需要注意的是:一旦声明了显式构造方法,就没有默认的构造方法了。

构造方法除了使用由new关键字调用之外,还可以从其它构造方法(来自本类或子类)里调用。

刚才的例子只是说明了构造方法的特征,并没有体现出其作用。

如果在Dog类中声明几个属性,如下所示:

public class Dog {
    int age;        // 年龄
    float weight;   // 体重
    String breed;   // 品种
    String color;   // 毛色

    public Dog(){

    }
}

那面上面的构造方法应该如何修改呢?既然构造方法是方法,那么就可以接收参数,这样在调用构造方法时将传入的参数赋值到对象的属性上就很简洁

public class Dog {
    int age;        // 年龄
    float weight;   // 体重
    String breed;   // 品种
    String color;   // 毛色

    public Dog(int age, float weight, String breed, String color) {
        this.age = age;
        this.weight = weight;
        this.breed = breed;
        this.color = color;
    }
}

实例化Dog的代码如下:

Dog erHa1 = new Dog(3, 4.2F, "西伯利亚哈士奇", "灰色");
Dog erHa2 = new Dog(10, 9.3F, "阿拉斯加哈士奇", "白色");

这样创建出来的Dog实例就可以从构造方法的参数中获取对应的属性值。

7.2 代码块

定义在大括号中的语句即为代码块,在Java中有几种不同的代码块:普通代码块,构造代码块,静态代码块,同步代码块。普通代码块就是在方法、循环、判断等语句中出现的代码块,这些我们已经很熟悉了,有些代码块也可以出现在其它代码块中,形成嵌套代码块。本小节主要涉及到构造代码块和静态代码块。

构造代码块

在类中定义且没有加任何修饰的代码块就是构造代码块。而作为类成员的代码块是在实例化对象时自动执行的。比如:

public class Dog {
    {
        System.out.println("代码块1");
    }
    
    public Dog(){
        System.out.println("Dog构造方法");
    }
}

上述的Dog类只有实例化一次,其中的代码块就会执行一次。从执行时机上看,代码块是在构造方法之前运行的。不过从更底层的角度分析,代码块是被编译器编译到构造方法体的最前面。下面的测试代码仅仅实例化了两个Dog对象:

new Dog();
new Dog();

结果之后的结果就是:

代码块1
Dog构造方法
代码块1
Dog构造方法

如果有多个代码块,按照出现在类中的顺序依次执行。

public class Dog {
    {
        System.out.println("代码块1");
    }
    {
        System.out.println("代码块2");
    }
    
    public Dog(){
        System.out.println("Dog构造方法");
    }
}

代码块可以直接访问类的成员,但要注意顺序,也就是说代码块只能访问声明在它之前的变量。

public class Dog {
    String breed;   // 品种

    {
        breed = "西伯利亚哈士奇";
    }

    public Dog(int age, float weight, String color) {
        this.age = age;
        this.weight = weight;
        this.color = color;
    }
}

上面的例子中,将Dog的属性breed统一提到了代码块中赋值,这意味着后面实例化Dog时,每个实例的品种都是"西伯利亚哈士奇"。

静态代码块

使用static修饰的代码块即为静态代码块.它在类加载时就会运行,且只会运行一次,如:

public class Dog {
    static {
        System.out.println("静态代码块");
    }
    
     public Dog(){
        System.out.println("Dog构造方法");
    }
}

如果创建多个Dog实例,结果如下,可以看到"静态代码块"只输出了一次:

静态代码块
Dog构造方法
Dog构造方法

如果有多个静态代码块,按照出现在类中的顺序依次执行。

静态代码块可以直接访问类的静态成员,不能直接访问实例成员,还是要使用实例加点运算符来访问。

对于本小节介绍的构造代码块和静态代码块,在实际开发中并不会出现很多,但是在系统需要在初始化时只执行一次的场景,静态代码块还是很有用的,比如读取全局配置文件信息,创建数据库连接池等。

7.3 小结

本小节介绍了Java类中的构造方法和代码块(构造代码块和静态代码块)的使用方法。构造方法是用于初始化对象属性的特殊方法,其特点包括方法名与类名相同、无返回值类型。当类未显式声明构造方法时,编译器会提供默认无参构造方法。此外还解释了构造代码块(在实例化时自动执行)和静态代码块(在类加载时执行一次)的特性及区别,并通过Dog类的示例代码展示了它们的实际应用场景和执行顺序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值