Java语言之静态代码块、构造代码块、构造方法

Java语言之静态代码块、构造代码块、构造方法

一、静态代码块

​ 静态代码块是指用static关键字修饰的代码块,静态代码块作用于类,主要用于类的初始化操作,为类的属性初始化和赋值,只要类被加载,静态代码块就会先执行,会在类的构造代码块和构造方法之前执行,并且只执行一次。

​ 由于JVM在加载时会执行静态代码块,所以静态代码块优先于主方法执行。静态代码块不能存在于任何方法体内。静态代码块不能直接访问静态实例变量和实例方法,需要通过类的实例变量来访问。

​ 静态代码块的构成方式以及在类中的位置可以用以下例子说明:

class Student {
        private String name;
        private int age;
        static {
            System.out.println("这是静态代码块");
        }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

二、构造代码块

​ 构造代码块是指直接在类中定义且没有加static关键字的代码块,单纯的由花括号构成的代码块,它出现在成员的位置,其作用于对象,主要用于对象的初始化操作,给对象统一初始化化数据,在创建对象时被调用,每次创建对象都会被调用,也就是说,想要构造代码块执行,就得先建立对象,才能调用代码块中的语句,而且只要有对象创建其都会执行,并且优先级于构造方法,也就是说,构造代码块执行在静态代码快之后,执行在构造方法之前。

​ 在编译时,编译器会将成员属性的声明放到类的前端,成员变量的初始化工作放到构造方法中。如果类中有构造代码块,编译器编译时会将与所有构造方法中相同的部分抽取出来,然后将构造代码块中的代码移到构造方法中执行,构造方法中原有的抽取出相同的部分过后所剩余的代码最后执行。成员属性的初始化和构造代码块的执行顺序是根据源码中的位置执行。

​ 构造代码块的构成方式以及在类中的位置可以用以下例子说明:

class Student {
        private String name;
        private int age;
        static {
            System.out.println("这是静态代码块");
        }
    {
        System.out.println("这是构造代码块");
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

三、构造方法

​ 构造方法指的是创建对象,给对象中的成员进行初始化,或者可以说使用类中的属性和功能,对类进行实例化。构造方法的方法名与类名相同,其没有返回值类型,连同void都没有,同时也没有具体的返回值,也就是说,构造方法中不能写return语句。

​ 如果我们没有给出构造方法,系统将自动提供一个无参构造方法;如果我们给出了构造方法,系统将不再提供默认的无参构造方法。当我们给出了构造方法时,系统默认的无参构造方法就会被有参构造方法取代,如果我们还想使用无参构造方法的话,就必须自己写出来。

​ 一个类的缺省构造方法不可以有参数,缺省的构造方法换句话说就是无参的构造方法,如果要想要定义有参数的构造方法时,那你也可以给一个或几个参数,此时便不能叫缺省构造方法了,而是构造方法重载。

下面展示一个很简单地使用构造方法的例子:

public class MyTest3 {
    public static void main(String[] args) {
        Dog dog = new Dog();//创建对象
        Dog dog2 = new Dog(2);//调用构造方法传递参数
    }
}
class Dog{
    public Dog(){}
    public Dog(int a){
    System.out.println(a);
    }
}

创建有参和无参的构造方法:

class Student {
        public String name;
        public int age;
        public Student() {
            System.out.println("空参的构造方法执行了");
        }
        public Student(String name) {
            System.out.println(name);
            System.out.println("一个参数的构造方法,执行了");
        }
        public Student(String name, int age) {
            this.name = name;
            this.age = age;
            System.out.println("打印名字:"+this.name);
            System.out.println("打印年龄"+this.age);
            System.out.println("两个参数的构造方法,执行了");
    }

}

三、静态代码块、构造代码块、构造方法的区别

​ 静态代码块作用于类,为类的属性初始化和赋值,只要类被加载,静态代码块就会先执行,会在类的构造代码块和构造方法之前执行,并且只执行一次。

​ 构造代码块作用于对象,给对象统一初始化化数据,在创建对象时被调用,每次创建对象都会被调用,也就是说,优先级于构造方法,也就是说,构造代码块执行在静态代码快之后,执行在构造方法之前。

​ 构造方法给对象中的成员进行初始化,或者可以说使用类中的属性和功能,对类进行实例化。

​ 下面用代码来说明其执行的先后顺序:

public class Demo {
    static int i = 1;
    static {
        i=2;
        System.out.println("这是静态代码块"+i);
    }
    {
        i=3;
        System.out.println("这是构造代码块"+i);
    }
    public static void main(String[] args) {
        display(i);
    }
    public static void display(int i) {
        System.out.println("调用方法打印:"+i);
    }
}

输出结果为:
在这里插入图片描述
这里没有创建对象,所以构造代码块不执行。

接下来创建一个对象说明:

class MyTest {
     public static void main(String[] args) {
         Demo demo = new Demo();
         demo.display();
     }
 }
class Demo {
    static int i = 1;
    static {
        i=2;
        System.out.println("这是静态代码块"+i);
    }
    {
        i=3;
        System.out.println("这是构造代码块"+i);
    }
    public static void display() {
        System.out.println("调用方法打印:"+i);
    }
}

输出结果为:
在这里插入图片描述
显然,很简单的例子就可以明白三者的执行顺序。

猜你喜欢

转载自blog.csdn.net/changjinfeng123/article/details/89206828
今日推荐