静态代码块&&非静态代码块

静态代码块&&非静态代码块--学习笔记

静态随类,非静态随对象
执行顺序
     1.在一个类中,初始化的时候,会直接执行静态代码块中的内容,初始化静态属性,以及方法
     2.当创建对象的时候,会优先执行非静态代码块中的内容,初始化类中的局部变量
     3.然后根据对象创建的类型,来调用是带参构造还是无参构造
     4.最后是调用的对象其他操作


在类中非静态方法,代码块可以调用非静态的方法属性吗? 反之呢
    非静态可以调用静态,静态无法调用非静态,因为加载顺序已经决定了。反之肯定不行。

 package Block;

public class Black {
    private  String name;
    public static int init = 1001;

    // 非静态代码块
    {
        System.out.println("isnot static Block");
    }
    // 静态代码块
    static {
        System.out.println("static Block");
    }

    // 无参构造
    public Black(){
        System.out.println("no args constructor");
    }

    // 带参构造
    public Black(String name) {
        this.name = name;
    }

    // 静态方法
    public static void Show(){
        System.out.println("static method");
    }
}

测试类

package Block;

public class BlockTest {
    public static void main(String[] args) {

        Black black = new Black();
        Black black1 = new Black();
        Black.Show();
    }
}

执行结果
static Block
isnot static Block
no args constructor
isnot static Block
no args constructor
static method

可以看出,先执行静态代码块

当创建对象Black的时候,先执行非静态代码块,再是无参构造

再次创建对象black1的时候,又一次执行非静态代码块,其次是无参构造

最后调用了方法输出。

在一个类中,静态代码块只会执行一次,而非静态代码块,构造器则会随着对象的每一次创建而执行

 

在加上继承,可以看出先执行父类静态代码块,在执行子类静态代码块,其次是父类非静态代码块,父类构造器,子类非静态代码块,子类构造器

package Block;

public class Black extends Blackfather{
    private String name;
    public static int init = 1001;

    {
        System.out.println("Black 非静态代码块");
    }

    static {
        System.out.println("Black 静态代码块");
    }

    public Black() {
        System.out.println("Black 无参构造");
    }

    public Black(String name) {
        this.name = name;
    }

    public static void Show() {
        System.out.println("Black 静态方法");
    }
}


class Blackfather {
    private String name;
    public static int init = 1001;

    {
        System.out.println(" Blackfather非静态代码块");
    }

    static {
        System.out.println("Blackfather 静态代码块");
    }

    public Blackfather() {
        System.out.println("Blackfather无参构造");
    }

    public Blackfather(String name) {
        this.name = name;
    }

    public static void Show() {
        System.out.println("Blackfather 静态方法");
    }
}

测试

package Block;

public class BlockTest {
    public static void main(String[] args) {
        System.out.println("Block and Blockfather Test");
        Black b = new Black();
       // Blackfather bf = new Blackfather();
    }
}


执行结果
Block and Blockfather Test
Blackfather 静态代码块
Black 静态代码块
Blackfather非静态代码块
Blackfather无参构造
Black 非静态代码块
Black 无参构造

如果main方法与Black类写在同一个方法中,则先执行静态代码块中的属性

 

显示赋值和代码块赋值无优先级,看先后顺序

package Block;

public class Demo {
    public static void main(String[] args) {
    Demo1 d = new Demo1();
        System.out.println(d.age);
    }


}

class Demo1 {
    {
        age = 18;
    }
    int age = 12;

    
/*    int age = 12;
    {
        age = 18;
    }*/
}

结果为 12 反过来为18

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
静态代码块是在Java类加载时执行的一段代码,它用于初始化静态成员变量或执行一些静态操作。静态代码块在类加载时只执行一次,并且在类的所有实例之前执行。静态代码块的执行顺序是在类加载时按照代码的顺序执行。 以下是一个示例,演示了Java中的静态代码块的使用和执行顺序[^1]: ```java class StaticTest { // 静态代码块 static { System.out.println("父类静态代码块执行了!!!!"); } // 静态代码块 { System.out.println("父类静态代码块执行了!!!!"); } // 构造函数 public StaticTest() { System.out.println("父类构造函数执行了!!!!"); } } class StaticTestSon extends StaticTest { // 静态代码块 static { System.out.println("子类静态代码块执行了!!!!"); } // 静态代码块 { System.out.println("子类静态代码块执行了!!!!"); } // 构造函数 public StaticTestSon() { System.out.println("子类构造函数执行了!!!!"); } public static void main(String[] args) { // 创建子类对象 StaticTestSon son = new StaticTestSon(); } } ``` 输出结果: ``` 父类静态代码块执行了!!!! 子类静态代码块执行了!!!! 父类静态代码块执行了!!!! 父类构造函数执行了!!!! 子类静态代码块执行了!!!! 子类构造函数执行了!!!! ``` 从输出结果可以看出,静态代码块在类加载时执行,而静态代码块和构造函数在创建对象时执行。父类的静态代码块先于子类的静态代码块执行,而静态代码块和构造函数的执行顺序则按照代码的顺序执行。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值