package cantellow.text8;
public class TestStaticFinal
{
/**
* @author cantellow
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
String var1 = StaticFinal.stringStaticFinal;
System.out.println(var1);
String var2 = Static2.stringStatic;
System.out.println(var2);
StaticFinal.finalprint();
Static2.Print();
}
}
class StaticFinal
{
final static String stringStaticFinal = "This is Static and Final string";
static
{
System.out.println("开始初始化StaticFinal类的静态变量和静态初始化块");
System.out.println(stringStaticFinal);
}
public final static void finalprint()
{
System.out.println("This is finalprint()");
}
}
class Static2
{
static String stringStatic = "This is static string";
static
{
System.out.println("开始初始化Static2类的静态变量和静态初始化块");
System.out.println(stringStatic);
}
public static void Print()
{
System.out.println("This is print()");
}
}
输出结果:
This is Static and Final string
开始初始化Static2类的静态变量和静态初始化块
This is static string
This is static string
开始初始化StaticFinal类的静态变量和静态初始化块
This is Static and Final string
This is finalprint()
This is print()
问题:为什么访问StaticFinal类的stringStaticFinal字段时,StaticFinal类没有被初始化?
==============================================================
参考理解:
所有的Java虚拟机实现必须在每个类或接口首次主动使用时初始化,当使用某个类的静态方法时和静态字段时,虚拟机就必须保证这个类或接口已经被初始化,如果没有被初始化,就必须要先初始化。但是,用final修饰的静态字段除外,它被初始化为一个编译时的常量表达式。所以,我们这里看到:访问StaticFinal类的stringStaticFinal字段时,StaticFinal类并没有被初始化。而访问没有final修饰的Static2类的静态字段时,引发了Static2类的初始化。而且,静态方法不管有没有final字段修饰都会引发类的初始化。初始化过一次的类就不会再初始化了,这一点也可以从Static2类看出。
分享到:
相关推荐
生成这4条指令的最常见的Java代码场景是:使用new关键字实例化对象的时候、读取或者设置一个类的静态字段(被final修饰、已在编译器把结果放入常量池的静态字段除外)的时候,以及调用一个类静态方法的时候 ...
如果修饰的是引用类型数据变量,则该变量不会再次初始化。 static 修饰的方法是否可以被继承 static 修饰的方法为静态方法,不能被重写,可以被继承。它可以直接使用类名.方法名进行调用,即该方法不属于某个对象...
(1) 被abstract修饰的类是抽象类,编译后生成独立class文件 (2) 抽象类不能单独new对象,但可以声明引用 (3) 抽象类可以定义成员变量和成员方法 (4) 抽象类可以有构造,但不用于new对象,而是用于子类创建对象jvm默认...
"类的初始化过程 当创建一个对象时,对象的各个变量根据其类型被设置为相应的默认初始值,然后调用构造方法,而每次调用构造方法都是要执行三个阶段: 1.调用超类的构造方法; 2.由初始化语句对给变量进行初始化...
类什么时候才被初始化: 58 类的初始化步骤: 59 【*JVM】什么是JVM线程死锁?JVM线程死锁,你该如何判断是因为什么?如果用VisualVM,dump线程信息出来,会有哪些信息? 59 【*JVM】查看jvm虚拟机里面堆、线程的...
141、使用useBean标志初始化BEAN时如何接受初始化参数 36 142、使用JSP如何获得客户浏览器的信息? 36 143、能象调用子程序一样调用JSP吗? 36 144、当我重编译我的JSP使用的一个类后,为什么JVM继续使用我的老CLASS...
141、使用useBean标志初始化BEAN时如何接受初始化参数 36 142、使用JSP如何获得客户浏览器的信息? 36 143、能象调用子程序一样调用JSP吗? 36 144、当我重编译我的JSP使用的一个类后,为什么JVM继续使用我的老CLASS...
注:本系列图书的第I、II卷再版时均相应改名为《xxx开发实例大全》(基础卷)及(提高卷),但内容基本无变化,需要的童鞋可自由匹配查找。 内容简介 《PHP开发实战1200例》分为I、II两卷共计1200个例子,包括了开发...
注:本系列图书的第I、II卷再版时均相应改名为《xxx开发实例大全》(基础卷)及(提高卷),但内容基本无变化,需要的童鞋可自由匹配查找。 内容简介 《PHP开发实战1200例》分为I、II两卷共计1200个例子,包括了开发...
5.6.1 静态类的调用 77 5.6.2 实例类型的判断方法instanceof 78 5.6.3 对象的克隆 78 5.7 一些设计观念 80 5.7.1 策略模式(Strategy Pattern) 81 5.7.2 单例模式(Singleton Pattern) 81 5.7.3 工厂模式(Factory...