代码执行顺序

静态代码块与静态方法的区别?

  • 什么情况下使用
    • 静态代码块:在项目启动的时候就需要执行的代码,这些代码是主动执行的;
    • 静态方法:在项目启动的时候就初始化,在不创建对象的情况下,能够直接使用的,这种代码是被动的。静态方法在类加载的时候就已经初始化,可以用类名直接调用;
  • 使用静态方法的注意几点
    • 静态方法只能调用同类中静态成员,不能访问非静态成员
    • 静态方法不能以任何方式引用this和super关键字,加载静态方法时,this所用的对象根本没有创建。
    • 静态变量是所以不能定义在方法体内,因为静态变量是针对整个类的
      ##静态代码块,构造方法的初始化顺序
package com.cjm.mvnbook.test1;

public class FatherTest {

	public String name;
	public static String staticName = "22";

	FatherTest(){
		System.out.println("--父类的无参构造函数--静态变量为:" + this.staticName + "--非静态变量为:" + this.name);
	}

	FatherTest(String name){
		this.name=name;
		System.out.println("--父类的有参构造函数--"+this.name);
	}

	static{
		System.out.println("--父类的静态代码块--静态变量为=" + staticName );
	}

	{
		System.out.println("--父类的非静态代码块--静态变量为=" + staticName + "--非静态变量为=" + this.name );
	}

	public void speak(){
		System.out.println("--父类的方法--");
	}
}

package com.cjm.mvnbook.test1;

public class SonTest extends FatherTest {
	private String name;
	
	private static String staticName = "33";
	
    @Override
    public void speak(){
       System.out.println("--子类Override了父类的方法--" + super.staticName);
    }
    
    public SonTest(){
    	System.out.println("----子类无参的构造方法------");
    }
    
    public SonTest(String name){
    	System.out.println("----子类有参的构造方法 "+this.name+ "------");
    	this.name = name;
    }
    
    {
    	System.out.println("---子类的非静态代码块---");
    }
    
    static {
    	System.out.println("---子类的静态代码块---");
    }
    
}

执行结果

代码执行顺序_第1张图片
代码执行顺序_第2张图片

结论

  • 单个类中类先执行静态变量和静态代码块,然后非静态代码快,再就是构造方法,最后就是具体的方法
  • 当有继承关系时,子类在构造对象时,先执行父类的静态代码块,然后再执行子类的静态代码块。因为静态代码块是在类加载的时候就已经在执行,然后执行父类的非静态代码块,父类的无参构造方法,子类的非静态代码块,子类的构造方法
  • 注意:子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方法,否则编译不能通过。

你可能感兴趣的:(继承执行顺序,静态代码块,代码执行顺序,Java)