Java中的代码块

一·普通代码块

1.语法:{};

普通代码块会在新建一个对象时就会执行一次

2.代码

package codeblock;

public class Codeblock01 {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
       Novel a=new Novel("小明");
       Novel b=new Novel("小明","Jack");
       Novel c=new Novel("小明","Jack",10000);
	}

}
class Novel{
	private String author;
	private String lead;
	private int chaper;
	//假如现在有三个构造器
	//想要每个构造器都能提示我:你正在看小说,需要每个构造器都写一句
	//提示吗?
	//可以这样
	{
		System.out.println("你正在看小说");
	};
	public Novel(String author) {
		super();
		this.author = author;
	}
	public Novel(String author, String lead) {
		super();
		this.author = author;
		this.lead = lead;
	}
	public Novel(String author, String lead, int chaper) {
		super();
		this.author = author;
		this.lead = lead;
		this.chaper = chaper;
	}
}

运行结果:

你正在看小说
你正在看小说
你正在看小说

二·静态代码块

1.语法:static{};

静态代码块会在类加载的时候执行一次,之后便不再执行
这里需要知道类什么时候加载
1·创建对象的时候加载(new)
2·创建子类对象时,父类也会被加载
3·使用类的静态成员时(静态方法,静态属性)

2.代码

package codeblock;

public class Codeblock02 {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
       A a=new A();
       B b=new B();
	   System.out.println(A.aa);
	   System.out.println(B.bb);
	}

}
class A{
	public static int aa=0; 
	static {
		System.out.println("这是A的静态代码块");
	};
}
class B extends A{
	public static int bb=1;
	static {
		System.out.println("这是B的静态代码块");
	};
}

运行结果:

这是A的静态代码块
这是B的静态代码块
0
1

如果把下面一句去掉,运行结果和上面一样

A a=new A();

如果把下面两句去掉

A a=new A();
B b=new B();

运行结果是

这是A的静态代码块
0
这是B的静态代码块
1

原因:
第一种运行结果:
a对象被创建时,
先执行了A类静态对象的初始化和A类静态代码块的执行(两者优先级相同)
在到b对象被创建
执行了B类静态对象的初始化和B类静态代码块的执行(两者优先级相同)
后面再分别输出了A的静态属性值和B的静态属性值

第二种运行结果(和第一种一样):
b对象被创建时,
它会先到它父类(A类),然后执行它父类静态对象的初始化和静态代码块的内容
再回到它自己的,然后执行它的静态对象的初始化和静态代码块的内容
后面再分别输出了A的静态属性值和B的静态属性值

第三种运行结果:
A的静态属性被调用时,类被加载,执行A中静态代码块的内容
在输出A的静态属性值
B的静态属性被调用时,类被加载,执行B中静态代码块的内容
在输出A的静态属性值

三·对上面代码块的补充

1.类的调用顺序

1.调用静态代码块和静态属性初始化
2.调用普通代码块和普通属性的初始化
3.调用构造方法

2.构造器隐藏内容

举个例子:

calss A{
     private int a;
     private int b;
     public A(int a,int b)//构造器
     {
     //这里有隐藏的执行要求1super2)调用普通代码块
     //后面再进行一些值的传递
     this.a=a;
     this b=b;
     }
}

3. 创建一个子类时(继承关系)

静态代码块,静态属性的初始化,普通代码块,普通属性的初始化,构造方法。它们的调用顺序如下:
1.父类的静态代码块,静态属性的初始化(两者优先级一样,看代码编写顺序)
2.子类的静态代码块,静态属性的初始化(两者优先级一样,看代码编写顺序)
3.父类的普通代码块,普通属性的初始化(两者优先级一样,看代码编写顺序)
4.父类构造方法
5.子类的普通代码块,普通属性的初始化(两者优先级一样,看代码编写顺序)
6.子类构造方法

4.注意

静态代码块只能直接调用静态成员(静态属性和静态方法),普通代码块可以调用任意成员。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值