Skip to content

之所以想单独开个Java基础专区,是想总结一下在工作学习中老是会遗漏掉的一些重要知识点,查缺补漏,常看常新。

1.静态代码块、构造方法、代码块、父类与子类之间执行顺序及父类子类实例化对象

1.1 静态代码块

在java中使用static关键字声明的代码块。每个静态代码块只会执行一次。JVM在加载类时会执行静态代码块,静态代码块先于主方法执行。

java
static{
    System.out.println("这是静态代码块");
}

TIP

注意: 静态代码块不能存在于任何方法体内。

1.2 构造代码块(实例初始化块):

直接在类中定义且没有加static关键字的代码块称为{}构造代码,在创建实例对象的时候先于构造函数被调用执行。

java
class Test{
    int id;
    String name;
	// JVM加载class时执行
	static{
		System.out.println("这是静态代码块");
	}
    // 新建对象的时候执行,构造代码块会先于构造函数被调用时执行
    {
        this.id= 5;
        this.name = "测试";
        System.out.println("这是构造代码块");
    }
    
    Test(int id){
        this.id = id;
    }
    
    public String toString(){
        return "name: "+this.name +"  ,   "+"id: "+ this.id ;    
    }
}

1.3 普通代码块:

在方法或语句内出现的{}就称为普通代码块。普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定–“先出现先执行”。

java
public class GeneralCodeBlock01{
    public static void main(String[] args){
        //如下为普通代码块
          {
            int x=3;
            System.out.println("1,普通代码块内的变量x="+x);    
          }
          
          int x=1;
          System.out.println("主方法内的变量x="+x);
          
          {
             int y=7;
             System.out.println("2,普通代码块内的变量y="+y);    
          }
        }
  }

属性、方法、构造方法和代码块都是类中的成员,在创建对象时,各成员的执行顺序如下:

  • 父类静态成员和静态初始化块,按在代码中出现的顺序依次执行;
  • 子类静态成员和静态初始化块,按在代码中出现的顺序依次执行;
  • 父类实例成员和实例初始化块,按在代码中出现的顺序依次执行;
  • 执行父类构造方法;
  • 子类实例成员和实例初始化块,按在代码中出现的顺序依次执行;
  • 执行子类构造方法

2.父类、子类之间代码块与构造方法

java

public class HelloA {
    static{
        System.out.println("static A");
    }
    
    {System.out.println("I'm A class");}
    
    public HelloA(){

        System.out.println("HelloA");
    }
    public HelloA(String s){

        System.out.println(s+"HelloA");
    }
    
    public static void main(String[] args) {
        new HelloB();
    }
}
 class HelloB extends HelloA{
    public HelloB () {
    	//只能调用一个父类的构造方法
//    	super();
    	super("parent");
        System.out.println("HelloB");
    }
    {System.out.println("I'm B class");}
    static{
        System.out.println("static B");
    }
}

结果:

static A
static B
I'm A class
parentHelloA
I'm B class
HelloB

3.父类、子类与super()

java
public class People {
	String name;
	public People() {
		System.out.println(1);
	}
	public People(String name) {
		System.out.println(2);
		this.name = name;
	}
}
 class Child extends People{
	 People father;
	public Child () {
		//super()系统会默认添加的
		System.out.println(4);
	}
	public Child (String name) {
		//super()系统会默认添加的
		System.out.println(3);
		this.name = name;
		father = new People(name+":F");
	}
	public static void main(String[] args) {
		new Child("mike");
	}
}

结果:132

4.类中添加静态变量

java
public class ExA {  
	//静态成员
    private static ExA a = new ExA();  
    //静态代码块
    static {  
        System.out.println("父类--静态代码块");  
    }  
    //构造方法
    public ExA() {  
        System.out.println("父类--构造函数");  
    }  
	  // 实例化代码块
    {  
        System.out.println("父类--非静态代码块");  
    }  
  
    public static void main(String[] args) {  
        new ExB();  
    }  
}  
  
class ExB extends ExA {  
	
    private static ExB b = new ExB();
    
    static {  
        System.out.println("子类--静态代码块");  
    }  
    {  
        System.out.println("子类--非静态代码块");  
    }  
  
    public ExB() {  
        System.out.println("子类--构造函数");  
    }  
}

结果:

// 父类静态成员
父类--非静态代码块
父类--构造函数

//父类静态代码块
父类--静态代码块

父类--非静态代码块
父类--构造函数

子类--非静态代码块
子类--构造函数

子类--静态代码块

父类--非静态代码块
父类--构造函数

子类--非静态代码块
子类--构造函数