一·普通代码块
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)//构造器
{
//这里有隐藏的执行要求
(1)super
(2)调用普通代码块
//后面再进行一些值的传递
this.a=a;
this b=b;
}
}
3. 创建一个子类时(继承关系)
静态代码块,静态属性的初始化,普通代码块,普通属性的初始化,构造方法。它们的调用顺序如下:
1.父类的静态代码块,静态属性的初始化(两者优先级一样,看代码编写顺序)
2.子类的静态代码块,静态属性的初始化(两者优先级一样,看代码编写顺序)
3.父类的普通代码块,普通属性的初始化(两者优先级一样,看代码编写顺序)
4.父类构造方法
5.子类的普通代码块,普通属性的初始化(两者优先级一样,看代码编写顺序)
6.子类构造方法
4.注意
静态代码块只能直接调用静态成员(静态属性和静态方法),普通代码块可以调用任意成员。