初始化属性变量的几种时机
- 定义时初始化;
- 构造器中初始化;
- 在使用之前初试化;
- 使用实例初始化。
package propertiesinit.one;
public class Main {
//1.定义时初始化definitionInit
private int definitionInit=0;
private int constructorInit;
private String usingInit;
private String instanceInit;
//2.构造方法初始化constructorInit
public Main() {
constructorInit=0;
}
@Override
public String toString() {
//3.使用时初始化usingInit
if(usingInit==null){
usingInit="usingInit";
}
return usingInit;
}
{
//4.实例初始化instanceInit
instanceInit="instanceInit";
}
}
执行c2.i会报错(编译期报变量未初始化错误),c.i能正常运行
public class Main {
public static void main(String[] args) {
// ClassAccess c;
ClassAccess c = null, c2;
// The static field ClassAccess.i should be accessed in a static way
System.out.println(c.i);
// Multiple markers at this line
// - The static field ClassAccess.i should be accessed in a
// static way
// - The local variable c2 may not have been initialized
// System.out.println(c2.i);
}
}class ClassAccess {
private ClassAccess() {
}public static int i = 1;
}
注:ClassAccess c; 和ClassAccess c = null; 是有区别的,前者只是定义了c,后者不仅定义c,同时将c初始化为null。在code2中我们可以注意到,在c为null的情况下我们是可以正常访问引用类型静态成员的(这波操作很秀啊?)。
20180705注:
【属性的几种初始化方法】猜测:初始化会有两个动作一个是将引用指向类,一个将引用指向对象。c2未初始化也就没有将引用对应到类,故无法执行c2.i,而c1经过c1=null将c1对应到ClassAccess类,同时对应到一个空对象,i是静态变量,能通过类调用,经过这一步操作足矣。
推荐阅读
- Integer常量池结合源码解析
- Java基础|Java 打印空心等腰三角形(方法2)
- gradle 每次运行都会下载依赖的解决办法
- 使用vector代替数组
- 如何获取ResultSet的行数和列数
- Java 时间戳格式化
- Java基础|Android开发——JVM、Dalvik以及ART的区别
- XML|XML报文转Map
- Java 8 时间,字符串和Long时间戳互转
- JAVA基础|JAVA基础(TreeMap键是Student值是String案例)