今天我遇到这样的代码块,理解甚久,现在理解了,举一些例题给你看看
先创建一个One类:
package accp.com;
/**
* 其中一个类
* @author xuxiaohua
*
*/
public class One {
public One(String str){ //定一个构造函数
System.out.println(str);
}
}
再创建一个Two类:
package accp.com;
public class Two {
One one=new One("one1");
One one2=new One("one2");
static One one3=new One("one3");//为什么这句话只执行了一次,是因为静态块只执行一次,是从java虚拟机开始加载的时候
public Two(String str){
System.out.println(str);
}
}
然后编写测试类:
package accp.com;
public class Test {
static Two two = new Two("two");//静态块是java加载时最先走的方法,所以这句话无论放在哪里,都先走的静态方法
public static void main(String args[]){
Two t=new Two("two2");
System.out.println("开始main方法=========");
Two tw=new Two("two3");
System.out.println("执行完毕。");
}
}
运行结果为:
one3------解释:静态块先执行,所以自然走到Two类中,然后Two类中也存在static One one3=new One("one3");静态的,所以先走这句话了。
one1------解释:测试类中,static Two two = new Two("two");中的Two two 是定义,所以先走定义的类Two然后执行里面的方法,注意不会出现one3了,因为静态块只执行一次
one2
two----解释:static Two two = new Two("two");前面的定义走完之后就走new Two("two");实例化对象,输出two
one1---解释:Two t=new Two("two2");跟上面一样,先看前半部分,Two t是定义变量,所以走Two中的方法,但不会执行静态块了,原因已说了,是因为静态块只执行一次。好了,前部分定义看完了,接着看实例化后半部分:new Two("two2");,实例化对象,然后输出two2
one2
two2
开始main方法=========//这几句话没啥可解释的吧!
one1------解释:理由同上
one2
two3
执行完毕。
最后总结那么几句:要想看明白,你需要理解静态块和构造函数,还有定义和实例化。
Two two;//这属于在定义一个变量
new Two();//属于在实例化Two对象,Two two=new Two();//合起来就是定义和实例化对象。
其次就是静态块了,静态块是在java加载的时候只运行一次的,并且是先执行的代码块。
学如逆水行舟,不进则退。