final在java的有趣问题?
final可以修饰类、变量、方法。被final修饰的类不能被继承,被final修饰的变量值不能改变,被final修饰的方法不能重写。
再次探讨一个有趣的问题,如下面代码
package com.test; public class StaticPojo { public static final String a = "2"; public static final int c = 3; public static final double b = Math.random(); static { System.out.println("静态代码块被执行了"); } public StaticPojo() { System.out.println("我是构造方法,我被调用了"); } public static final void syso() { System.out.println("我是静态方法"); } public static void main(String[] args) { System.out.println(StaticPojo.a); } }
在方法内调用main方法时,输出为
静态代码块被执行了
2
当在外部调用时:
package com.test;
public class TestStatic {
static {
System.out.println("我是TestStatic的静态代码块");
}
public static void main(String[] args) {
System.out.println(StaticPojo.a);
}
}
输出结果为:
我是TestStatic的静态代码块
2
上面两个比较:
说明main方法执行时需要实例化本对象,main方法所属的class的静态代码块都执行了,为什么外部调用StaticPojo.a时,StaticPojo的静态代码块没有执行?
当调用:
package com.test; public class TestStatic { static { System.out.println("我是TestStatic的静态代码块"); } public static void main(String[] args) { System.out.println(StaticPojo.b); } }
输出:
我是TestStatic的静态代码块
静态代码块被执行了
0.8097364644291586
此时StaticPojo的静态代码块也执行了,main方法所属类的静态代码块执行,打印的变量类型不同,对对象的实例化有什么影响?
posted on 2018-09-10 17:01 魏先生的Weisir 阅读(120) 评论(0) 收藏 举报
浙公网安备 33010602011771号