一直对着个不太理解,最近总结了下,如果有不对的,请大家给指正
执行的先后顺序(同一等级按代码的顺序执行)
1.静态变量、静态代码块
2.变量、代码块
3.构造函数
<span style="font-size:18px;"><strong>public class Test2{
static String S = "静态变量";
String ss = "变量";
static{
System.out.println(S);
System.out.println("静态代码块");
}
{
System.out.println(ss);
System.out.println("代码块");
}
public Test2(){
System.out.println("构造函数");
}
public static void main(String[] args){
new Test2();
}
}</strong></span>
执行结果:
静态变量
静态代码块
变量
代码块
构造函数
public class Test3{
/*
* 执行顺序(同一等级按顺序执行)
* 1.静态变量,静态代码块
* 2.变量、代码块
* 3.构造函数
*/
public static void main(String[] args){
new Test33();
}
String ss = "变量";
static String S ="静态变量";
static{
System.out.println(S);
System.out.println("静态代码块");
}
{
System.out.println(ss);
System.out.println("代码块");
}
public Test3(){
System.out.println("构造函数");
}
}
class Test33 extends Test3{
static String s = "子类静态变量";
static
{
System.out.println(s);
System.out.println("子类静态代码块");
}
public Test33(){
System.out.println("子类构造函数");
}
String ss = "子类变量";
{
System.out.println(ss);
System.out.println("子类代码块");
}
}
执行结果:静态变量 静态代码块 子类静态变量 子类静态代码块 变量 代码块 构造函数 子类变量 子类代码块 子类构造函数
忘记从哪个网站看了这段代码了, 感觉挺好的分享给大家(关于static)
public class TestStaticCode {
private static TestStaticCode tsc = new TestStaticCode();
static{
System.out.println("4");
}
private InstanceVariable iv = new InstanceVariable();
private TestStaticCode(){
System.out.println("3");
}
public static void main(String[] args){
}
}
class InstanceVariable {
static{
System.out.println("1");
}
public InstanceVariable(){
System.out.println("2");
}
}
执行的结果是:1234
刚开始挺不理解的为啥是这个结果,后来一分析 明白了
当程序运行时, 会先加载TestStaticCode这个类,然后就执行了静态变量(tsc),tsc 去new了一个对象,
然后执行对象里面的private InstanceVariable iv = new InstanceVariable(); (因为TestStaticCode里面的static的变量和代码块是顺序执行的,所以就直接执行这段代码)
然后就进入InstanceVariable这个类,需要先加载静态的也就输出1了,因为new了一个对象会去加载构造函数也就是2,然后执行TestStaticCode的构造函数也就是3
这就是第一个静态变量,之后执行第二个静态代码块 也就是4了
希望大家多多提意见!!!