13、代码块

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


一、代码块的作用

用来初始化 类 和 对象

只能用satatic 修饰

分类:静态代码块 vs 非静态代码块

静态代码块

  • 内部可以有输出语句

  • 随着 类 的加载而执行,而且只执行一次

  • 可以定义多个,执行顺序 按照声明的先后顺序(一般不会声明多个 代码块)

  • 静态代码块 在 非静态代码块之前执行

  • 静态代码块中 只能 调用 静态的 方法和属性

  • 作用:初始化类的信息

非静态代码块

  • 内部可以有输出语句
  • 随着 对象 的创建而执行
  • 每创建一个对象, 就执行一次
  • 可以定义多个,执行顺序 按照声明的先后顺序(一般不会声明多个 代码块)
  • 非静态代码块中既可以调用 静态的, 也可以调用非静态的 方法和属性
  • 作用:在创建对象时 ,对对象的属性,初始化

二、总结:可以对属性赋值的位置

默认初始化

显式初始化

构造器

创建了对象以后,通过 ” 对象.属性 “

在代码块中赋值

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

三、完整示例

1、示例
public class CodeBlocksTest {
    public static void main(String[] args) {
        String description = Person.description;//静态,直接调
        //静态代码块也被调用了

        System.out.println(description);//利用静态代码块,给description赋初始化值

        Person p1 = new Person();
        //非静态代码块被调用了


    }
}
class Person{
    String name;
    int age;
    static String description;

    //构造器
    public Person() {}
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //代码块

//  不用static修饰  非静态代码块
    {
        System.out.println("你好。。。");
        age = 1;//利用非静态代码块,赋值
    }

//  用static修饰  静态代码块
    static {
        System.out.println("你好,static");
        description = "我是一个爱学习的人";
    }

    //方法
    public void eat(){
        System.out.println("吃饭");
    }
    @Override
    public String toString(){
        return "person [name" + ",age=" + age + "]";
    }
    public static void info(){
        System.out.println("我是人");
    }

}


2、习题1

判断程序执行的先后顺序,并画图

总结:由父及子


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("尚硅谷");
		System.out.println("Leaf的构造器");
	}
}
public class LeafTest{
	public static void main(String[] args){
		new Leaf(); 
		//new Leaf();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值