类的成员之四: 代码块
@[toc]
初步理解代码块
- 代码块的作用:用来初始化类、对象(初始化块)
- 代码块如果有修饰的话只能用static
分类:静态代码块和非静态代码块
3.1、静态代码块:a.内部可以有输出语句 b.随着类的加载而执行,而且只会执行一次 c.作用:初始化类的信息 d.如果一个类中定义了多个静态代码块,则按照声明的先后顺序执行(没必要) e.静态代码块的执行优先于非静态代码块
3.2、非静态代码块
a.内部可以有输出语句 b.随着对象的创建而执行 c.每创建一个对象,就执行一次非静态代码块 d.作用:可以在创建对象时,对对象的属性进行初始化 e.如果一个类中定义了多个非静态代码块,则按照声明的先后顺序执行(没必要)
- 静态的属性和方法随着类的加载而加载,而静态的代码块不但加载,而且执行
- 因为有static的使用,所以静态代码块不能调用非静态结构,但是非静态代码块可以调用静态结构也可以调用非静态的结构
- 代码块在开发中使用的频率不是太高,可以选择不用代码块,因为很多地方可以替代它的作用
对属性可以赋值的位置
1.默认初始化
2.显式初始化
3.构造器中初始化
4.有了对象以后,可以通过"对象.属性"或者"对象.方法"的方式进行赋值
5.在代码块中进行赋值
执行顺序:1—2/5—3—4
对应代码举例说明
package day2.DayBlock;
//类的成员之四:代码块(初始化块)
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);//创建对象时,对对象的属性进行初始化
}
}
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("静态代码块");
desc="哈哈哈";
}
{//非静态代码块
System.out.println("非静态代码块");
age=1;
}
//方法
public void eat(){
System.out.println("吃饭");
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
代码块的执行过程练习
- 通过以下代码和执行结果,去思考代码块是啥时候运行的,运行的前后顺序
package day2.LXT;
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();
}
}
运行结果:
Root的静态初始化块
Mid的静态初始化块
Leaf的静态初始化块
Root的普通初始化块
Root的无参数的构造器
Mid的普通初始化块
Mid的无参数的构造器
Mid的带参数构造器,其参数值:金士曼
Leaf的普通初始化块
Leaf的构造器