静态代码块与静态方法的区别?
- 什么情况下使用
- 静态代码块:在项目启动的时候就需要执行的代码,这些代码是主动执行的;
- 静态方法:在项目启动的时候就初始化,在不创建对象的情况下,能够直接使用的,这种代码是被动的。静态方法在类加载的时候就已经初始化,可以用类名直接调用;
- 使用静态方法的注意几点
- 静态方法只能调用同类中静态成员,不能访问非静态成员
- 静态方法不能以任何方式引用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("---子类的静态代码块---");
}
}
执行结果
结论
- 单个类中类先执行静态变量和静态代码块,然后非静态代码快,再就是构造方法,最后就是具体的方法
- 当有继承关系时,子类在构造对象时,先执行父类的静态代码块,然后再执行子类的静态代码块。因为静态代码块是在类加载的时候就已经在执行,然后执行父类的非静态代码块,父类的无参构造方法,子类的非静态代码块,子类的构造方法
- 注意:子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方法,否则编译不能通过。