/**
* 只有继承关系才会按照树的初始化步骤进行,
* 树的初始化,各个部分执行先后顺序,总是先初始化静态树,在初始化实例树
* 初始化静态树: 总体上从Object到目标类,局部上静态变量和静态代码块按先后顺序,
* 初始化实例树: 总体上从Object到目标类,局部上实例变量和实例代码块按先后顺序,再执行构造器
* 内部类的实例化也是按照如上规则进行的,有一点不太理解,似乎枚举有一些不同,代码如下
*
* 为什么枚举类的静态代码块再实例代码块之后?????
*
* 本人水平有限,做了如下测试,现在创建一个A类,并且保证A类代码和C枚举几乎一样,如下
* 1 给A类声明实例变量SUMMER,用public static final修饰(枚举的实例也是如此,而且是默认的)
* 2 给A提供无参的构造器和实例代码块
* 3 在A的静态代码块里给SUMMER创建一个A的实例变量赋值给它(唯一明显的区别)
* 点击运行,哇输出结果居然也一样,大家看出了什么??好像把A类几乎改造成了一个枚举类.
*
* 如下揣测:
* 1 现在知道终于为什么枚举的实例默认public static final修饰了,
* 因为final的静态成员变量,要么声明时赋值,要么在静态代码块里,而且final类型的变量有保证了它的不可变性
* 2 枚举类其实就是把成员变量放在静态代码块里显式赋值执行初始化了.就像在A的静态代码块里出现的SUMMER = new A();
* 现在正好解释了开头我的疑问:为什么枚举类的静态代码块再实例代码块之后?????
* 比如枚举类C在静态代码块里显式创建了一个该类的对象并且赋值了实例变量SPRING,造成了实例代码块与静态代码块同步.
* 3 枚举其实就是普通类(从它默认继承Enum也可以看出),但不能当成完全当成普通类去用
* (想一想@interface注解和interface接口也是一样,注解默认继承了Annotation接口,但不能当成完全当成接口去用)
* 4 人家设计枚举类就是希望这类的实例的个数有限而且是确定的.所以连构造器都是private的,而且加入它一些特殊的语法
*
*
*/
//解释:为什么枚举类的静态代码块再实例代码块之后?????
public class EnumQuestion {
public static void main(String[] args) throws Exception{
System.out.println(C.SPRING);
System.out.println("=====================");
System.out.println(A.SUMMER);
/**运行代码如下
*
* 我是C的实例代码块
* 我是C的构造器
* 我是C的静态代码块
* SPRING
* =====================
* 我是A的实例代码块
* 我是A的参构造器
* 我是A的静态代码块
* com.china.school.疑问.A@2133c8f8
*/
}
}
enum C {
SPRING;
static {
System.out.println("我是C的静态代码块");
}
{
System.out.println("我是C的实例代码块");
}
C(){
System.out.println("我是C的构造器");
}
}
class A{
public static final A SUMMER ;
public A(){
System.out.println("我是A的参构造器");
}
{
System.out.println("我是A的实例代码块");
}
static {
SUMMER = new A();
System.out.println("我是A的静态代码块");
}
}
标签:静态,代码,枚举,实例,println,out 来源: https://www.cnblogs.com/runwithtime/p/16272832.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。