Java基础系列7: 代码块和执行顺序
本文是作者的读书笔记和心得整理,部分内容来源于网络,如有侵权,请联系作者。
构造方法
构造方法不能被static、final、synchronized、abstract 和 native 修饰,原因是构造方法用于初始化一个新对象,所以用 static 修饰没有意义;构造方法不能被子类继承,所以用 final 和 abstract 修饰没有意义;多个线程不会同时创建内存地址相同的同一个对象,所以用 synchronized 修饰没有必要。
一个类可以有多个构造方法,维持传入参数不同即可.
注意构造方法是可以private的,也就是可以在本类的内部实例化,但是不能被外部实例化(也就是不能被其他函数new)
子类调用父类的构造方法
核心:子类无论如何都要调用父类的构造方法,而且子类是不能继承父类的构造方法的.
Java代码块
普通代码块
类中方法的方法体
构造代码块
在创建对象事被调用,每次创建时也被调用,优先于构造函数执行.
class A{
int i = 1;
int initValue;//成员变量的初始化交给代码块来完成
{
//代码块的作用体现于此:在调用构造方法之前,用某段代码对成员变量进行初始化。
//而不是在构造方法调用时再进行。一般用于将构造方法的相同部分提取出来。
//
for (int i = 0;i < 100;i ++) {
initValue += i;
}
}
{
System.out.println(initValue);
System.out.println(i);//此时会打印1
int i = 2;//代码块里的变量和成员变量不冲突,但会优先使用代码块的变量
System.out.println(i);//此时打印2
//System.out.println(j);//提示非法向后引用,因为此时j的的初始化还没开始。
//
}
{
System.out.println("代码块运行");
}
int j = 2;
{
System.out.println(j);
System.out.println(i);//代码块中的变量运行后自动释放,不会影响代码块之外的代码
}
A(){
System.out.println("构造方法运行");
}
}
public class 构造代码块 {
@Test
public void test() {
A a = new A();
}
}
静态代码块
只会执行一次,优先于构造代码块执行.只会执行一次.
同步代码块
使用synchronized(){}包起来的代码块.
有继承关系时的执行顺序:
父类的静态成员和代码块
子类静态成员和代码块
父类成员初始化和代码快
父类构造方法
子类成员初始化和代码块
子类构造方法