1.被static final修饰的变量分为两种,一种是不带new,另一种带new,不带new的一开始就加载,带new的有没有final调用顺序都和static调用顺序一样。如:
//第一种,会在一开始的时候就放入常量池。并且直接引用的时候不会加载所在类的任何其它静态方法或函数
public static final String name = "张三"
//第二种,有new的,会像普通static修饰的变量或方法的调用过程一样
public static final String name = new String("张三");
2.static修饰的变量或方法,会在类初始化时优先调用,并且只调用一次。
3.如果B继承A,调用B的构造函数,不管是有参还是无参的构造函数,默认都会先调用父类的无参构造函数,再调用自己的构造函数。
4.如果类里面有{}括起来的函数会在静态方法之后,构造方法之前执行。
以下代码,可以自己复制去调试一下,根据需要去掉注释
public static void main(String[] args) {
new B("张三");
// System.out.println(B.astr2);
// new B();
// System.out.println(B.astr1);
}
}
class A{
A(){
System.out.println("父亲构造函数被调用!");
}
A(String name){
System.out.println("父亲带参构造函数被调用:"+name);
}
// public static B b = new B();
// public static final B b2 = new B();
public static final String astr1 = "父亲静态常量字符串";
public static String astr2 = "父亲静态普通字符串";
static {
System.out.println("执行父类静态函数");
}
{
System.out.println("父亲普通函数被调用!");
}
}
class B extends A{
B(){
System.out.println("孩子构造函数被调用!");
}
B(String name){
System.out.println("孩子带参构造函数被调用:"+name);
}
public static final String str2 = "孩子静态常量字符串!";
static {
System.out.println("执行子类静态函数");
}
{
System.out.println("孩子普通函数被调用!");
}
}