我前面的文章已经说了代码块的作用了,但我好像没说static 的,不重要了。
先补充几点情况就是,static+代码块的化是只有在类加载的情况下才有,而普通代码块只能在创建对象实例时才能使用
而类加载有以下几种情况
1,创建对象实例就是new 对象,不演了
2.调用静态变量时
3.有继承关系的子类被调用时,其实就是内存图吗
静态与普通和构造器的先后顺序(类创建时)在单个类中,静态大于普通,普通大于构造器。
package codeblock;
public class CodeBlock_Text
{
public static void main(String[] args)
{
new AAA();
}
}
class AAA
{
static
{
System.out.println("我是static 代码块");
}
public static int a =getN1();
public static int getN1()
{
System.out.println("我是个工具人");
return 1000;
}
{
System.out.println("我是普通方法");
}
public AAA()
{
System.out.println("我是fw");
}
}
如果有多个就看谁先谁后。
结果如下
细节2
这个跟构造器有关,为什么呢,因为我一直忘记在super时默认无参构造器的父类,如果不说明调用那个super,就会找父类的无参构造器,然后找普通代码块
class AAA extends BBB
{
//static
// {
// System.out.println("我是static 代码块");
// }
// public static int a =getN1();
public static int getN1()
{
System.out.println("我是个工具人");
return 1000;
}
{
System.out.println("我是普通方法");
}
public AAA()
{
System.out.println("我是fw");
}
}
class BBB
{
{
System.out.println("haha, i am BBB" );
}
public BBB()
{
System.out.println("bbblll");
}
}
new AA,会找构造器,因为super放在第一句默认的,就会找父类的object没什么输出,然后父类找本类的代码块,接着是输出”bbblll“,然后AAA,再找本类代码块,构造器,结果如下
当有多个类进行时,父类静态>子类静>父类普>依次类推,就这么简单记住内存图就行了,父类加载完静态,子类,然后在堆中普通方法也是父类先,构造器更不用说,默认有个super,不表演了。



