代码块,静态代码快,构造代码块,静态方法

1.代码块

代码块又称为初始化块,属于类中的成员(即 是类的一部分),类似于方法,将逻辑语句封装在方法体中,通过用 {} 包围起来。
但和方法不同,没有方法名,没有返回,没有参数,只有方法体,而且不用通过对象或者类显示调用,而是加载类或创建对象时隐式调用。

1)基本语法
[修饰符]{
    
    
  代码
}
2)注意事项
  1. 修饰符可以不写(普通代码块),要写只能写 static (静态代码块)
  2. 代码块分为两类,普通代码块和静态代码块
  3. 逻辑语句可以为任何逻辑语句(输入、输出、方法调用、循环、判断等)
  4. ;可以写上,也可以省略
3)代码块的好处:

相当于另外一种形式的构造器(可以看做是对构造器的补充机制),可以做初始化的操作
场景:如果多个构造器中都有重复的语句,可以抽取到初始化块中,提高代码的复用性

2.静态代码块

static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内。
静态代码块随着类的加载而执行,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个静态代码块只会被执行一次。
普通代码块随着对象的创建而执行。每创建一次就调用一次。

1)语法

static{
    
    
	代码块;
}

类什么时候加载?

  1. 创建对象实例时(new)
  2. 创建子类对象实例,父类也会被加载
  3. 使用类的静态成员时(静态属性、静态方法),父类先被加载,子类再被加载

3. 静态方法:

1)静态方法的作用:

静态方法是属于类的,内存必须为它分配内存空间,这个空间一直由静态方法占用,内存管理器不会由于静态方法没有被调用而将静态方法的存储空间收回,这样如果将所有的方法都声明为静态方法,就会占用大量的内存空间,最后是系统变慢。而普通的成员方法是由对象调用的,内存并不会一直为起分配内存,只有调用的时候才为其分配存储空间,而当其没有被调用时,存储空间就会被内存管理其收回,释放没有用的空间,提高的系统的运行速率!

2)静态方法的优点:

1、如果我们在程序编写的时候需要一个不实例化对象就可以调用的方法,我们就可以使用静态方法.
2、节省内存资源,对于静态方法在内存中只有一个拷贝(节省内存),JVM只为静态成员分配一次内存,在加载类的过程中完成静态成员的内存分配,可用类名直接访问(简单方便调用),当然也可以通过对象来访问(但是这是不推荐的)。

3)代码
package javaoop.bdqn816.demo02;

public class StaticTest {
    
    
    static int num = 100;
    
    //构造代码块
    {
    
    
        num += 100;
        System.out.println("构造代码块:num =" + num);//300
    }

    //静态代码块
    static {
    
    
        num += 100;
        System.out.println("静态代码块:num =" + num);//300
    }

	//主方法
    public static void main(String[] args) {
    
    
        StaticTest obj1 = new StaticTest();
        StaticTest obj2 = new StaticTest();
        StaticTest obj3 = new StaticTest();
        StaticTest obj4 = new StaticTest();
        System.out.println("=========================");
        System.out.println("obj1.num = " + obj1.num);//300
        System.out.println("=========================");
        System.out.println("obj2.num = " + obj2.num);//400
        System.out.println("=========================");
        System.out.println("obj3.num = " + obj3.num);//500
        System.out.println("=========================");
        System.out.println("obj4.num = " + obj4.num);//600
        System.out.println("=========================");

    }
}

结论:静态代码块(初始化1次) -> 构造代码块(每 new 一个对象都会执行 1 次)-> 构造方法(无参有参)
静态代码块内容只会输出一次

创建一个子类对象时(继承关系):他们的静态方法,静态代码块初始化,普通代码块,普通属性初始化,构造方法的调用顺序如下:
  1. 父类的静态代码块和静态属性(优先级一样,按定义顺序执行)
  2. 子类的静态代码块和静态属性(优先级一样,按定义顺序执行)
  3. 父类的普通代码块和普通属性初始化(优先级一样,按定义顺序执行)
  4. 父类的构造方法
  5. 子类的普通代码块和普通属性初始化(优先级一样,按定义顺序执行)

猜你喜欢

转载自blog.csdn.net/qq_44125965/article/details/126361951
今日推荐