Java 基础(代码块)

类的成员之四: 代码块(或初始化块)

1.代码块的作用:用来初始化类、对象

2.代面树如果有修饰的话,只能使用 static.

3.分类:静态代码块 VS 非静态代码块

4.静态代码块

内部可以有输出语句
随着类的加载而执行,而且只执行一次
作用: 初始化类的信息
如果一个类中定义了多个静态代码块,则按照声明的先后顺序执行
静态代码块的执行要优先于非静态代码块的执行
静态代码块内只能调用静态的属性、静态的方法,不能调用非静态的结构

 

5.非静态代码块

内部可以有输出语句
随着对象的创建而执行
每创建一个对象,就执行一次非静态代码块
作用:可以在创建对象时,对对象的属性等进行初始化
如果一个类中定义了多个非静态代码块,则按照声明的先后顺序执行
非静态代码块内可以调用静态的属性、静态的方法、或非静态的属性、非静态的方法

对属性可以赋值的位置:
① 默认初始化
② 显式初始化/⑤ 在代码块中赋值
③ 构造器中初始化
④ 有了对象以后,可以通过 "对象.属性" 或 "对象.方法"的方式,进行赋值

执行的先后顺序:① - ②/⑤ - ③ - ④

实例化子类对象时,涉及到父类、子类中静态代码块、非静态代码块、构造器的加载顺序:
由父及子,静态先行。

BlockTest.java

package com.klvchen.java3;

public class BlockTest {
    public static void main(String[] args) {
        String desc = Person.desc;
        
        Person p1 = new Person();
        Person p2 = new Person();
        System.out.println(p1.age);
        
        Person.info();
    }
}

class Person{
    String name;
    int age;
    static String desc = "我是一个人";
    
    public Person() {
        
    }
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    //非 static 的代码块
    {
        System.out.println("hello, block - 1");
        age = 1;
        eat();
        desc = "我是一个爱学习的人";
        info();
    }
    
    {
        System.out.println("hello, block - 2");
    }
    
    //static 的代码块
    static {
        System.out.println("hello, static block-2");
    }
    
    static {
        System.out.println("hello, static block-1");
        desc = "我是一个爱学习的人";
        info();
//        eat();
//        name = "Tom";
    }
    
    public void eat() {
        System.out.println("吃饭");
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }
    
    public static void info() {
        System.out.println("我是一个快乐的人!");
    }
}

StaticBlockTest.java

package com.klvchen.java3;

public class StaticBlockTest {
    public static void main(String[] args) {
        System.out.println("total = " + MyPerson.total);
        System.out.println("total = " + MyPerson.total);
    }

}

class MyPerson{
    public static int total;
    
    static {
        total = 100;
        System.out.println("in static block!");
    }
}

LeafTest.java

package com.klvchen.java3;

class Root{
    static {
        System.out.println("Root的静态初始化块");
    }
    {
        System.out.println("Root的普通初始化块");
    }
    public Root() {
        System.out.println("Root的无参数的构造器");
    }
}

class Mid extends Root{
    static {
        System.out.println("Mid的静态初始化块");
    }
    {
        System.out.println("Mid的普通初始化块");
    }
    public Mid() {
        System.out.println("Mid的无参数的构造器");
    }
    public Mid(String msg) {
        //通过this调用同一类中重载的构造器
        this();
        System.out.println("Mid的带参数构造器,其参数值: " + msg);
    }
}

class Leaf extends Mid{
    static {
        System.out.println("Leaf的静态初始化块");
    }
    {
        System.out.println("Leaf的普通初始化块");
    }
    public Leaf() {
        //通过 super 调用父类中有一个字符串参数的构造器
        super("klvchen");
        System.out.println("Leaf的构造器");
    }
}

public class LeafTest {
    public static void main(String[] args) {
        new Leaf();
        System.out.println();
        new Leaf();
    }

}

Son.java

package com.klvchen.java3;

class Father{
    static {
        System.out.println("11111111111111111111");
    }
    {
        System.out.println("22222222222222222222");
    }
    
    public Father() {
        System.out.println("33333333333333333333");
    }
}

public class Son extends Father {
    static {
        System.out.println("44444444444444444444");
    }
    {
        System.out.println("55555555555555555555");
    }
    public Son() {
        System.out.println("66666666666666666666");
    }
    
    public static void main(String[] args) {
        System.out.println("77777777777777777777");
        System.out.println("**********************");
        new Son();
        System.out.println("**********************");
        new Father();        
    }
}

OrderTest.java

package com.klvchen.java3;

public class OrderTest {
    public static void main(String[] args) {
        Order order = new Order();
        System.out.println(order.orderId);
    }

}


class Order{
    {
        orderId = 4;
    }
    int orderId = 3;
    
}

posted @ 2021-11-29 13:42  民宿  阅读(45)  评论(0)    收藏  举报