类的成员之四:代码块(初始化块)
一、代码块的作用
用来初始化 类 和 对象
只能用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();
}
}