`

类初始化时,final修饰的静态字段的表现方式

    博客分类:
  • j2se
阅读更多
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类看出。

分享到:
评论

相关推荐

    java相关的2024面试题集锦

    生成这4条指令的最常见的Java代码场景是:使用new关键字实例化对象的时候、读取或者设置一个类的静态字段(被final修饰、已在编译器把结果放入常量池的静态字段除外)的时候,以及调用一个类静态方法的时候 ...

    Java-常见面试题.pdf

    如果修饰的是引用类型数据变量,则该变量不会再次初始化。 static 修饰的方法是否可以被继承 static 修饰的方法为静态方法,不能被重写,可以被继承。它可以直接使用类名.方法名进行调用,即该方法不属于某个对象...

    三个修饰符(abstract、static、final)

    (1) 被abstract修饰的类是抽象类,编译后生成独立class文件 (2) 抽象类不能单独new对象,但可以声明引用 (3) 抽象类可以定义成员变量和成员方法 (4) 抽象类可以有构造,但不用于new对象,而是用于子类创建对象jvm默认...

    java面试800题

    "类的初始化过程 当创建一个对象时,对象的各个变量根据其类型被设置为相应的默认初始值,然后调用构造方法,而每次调用构造方法都是要执行三个阶段: 1.调用超类的构造方法; 2.由初始化语句对给变量进行初始化...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    类什么时候才被初始化: 58 类的初始化步骤: 59 【*JVM】什么是JVM线程死锁?JVM线程死锁,你该如何判断是因为什么?如果用VisualVM,dump线程信息出来,会有哪些信息? 59 【*JVM】查看jvm虚拟机里面堆、线程的...

    java面试宝典

    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...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    注:本系列图书的第I、II卷再版时均相应改名为《xxx开发实例大全》(基础卷)及(提高卷),但内容基本无变化,需要的童鞋可自由匹配查找。 内容简介  《PHP开发实战1200例》分为I、II两卷共计1200个例子,包括了开发...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    注:本系列图书的第I、II卷再版时均相应改名为《xxx开发实例大全》(基础卷)及(提高卷),但内容基本无变化,需要的童鞋可自由匹配查找。 内容简介  《PHP开发实战1200例》分为I、II两卷共计1200个例子,包括了开发...

    php网络开发完全手册

    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...

Global site tag (gtag.js) - Google Analytics