`

类初始化时,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 静态非静态 字段方法 子类父类构造_初始化顺序!

    java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...

    Static和Final修饰类属性变量及初始化

    1.static修饰一个属性字段,那么这个属性字段将成为类本身的资源,public修饰为共有的,可以在类的外部通过test.a来访问此属性;在类内部任何地方可以使用.如果被修饰为private私有,那么只能在类内部使用.

    易语言静态变量初始化

    易语言静态变量初始化源码,静态变量初始化,静态变量初始化例子

    C++使用初始化列表的方式来初始化字段的方法

    今天小编就为大家分享一篇关于C++使用初始化列表的方式来初始化字段的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    44.java数组静态初始化.zip

    44.java数组静态初始化.zip44.java数组静态初始化.zip44.java数组静态初始化.zip44.java数组静态初始化.zip44.java数组静态初始化.zip44.java数组静态初始化.zip44.java数组静态初始化.zip44.java数组静态初始化.zip...

    关于Java静态成员变量和静态初始化块等的初始化顺序的详细介绍

    详细介绍了Java的静态成员变量、静态数据块、非静态成员变量和非静态成员变量等初始化顺序

    C++全局变量初始化的一点总结

    注意:本文所说的全局变量指的是 variables with static storage,措词来自 c++ 的语言标准文档。  什么时候初始化 ...  static initialization: 静态初始化指的是用常量来对变量进行初始化,主要包括 zero init

    C++类的静态成员初始化详细讲解

    通常静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域操作符来指出静态成员所属的类.但如果静态成员是整型或是枚举型const,则可以在类声明中初始化

    类继承的初始化顺序类,继承的初始化顺序

    类继承的初始化顺序类继承的初始化顺序类继承的初始化顺序类继承的初始化顺序

    52.java二维数组静态初始化.zip

    52.java二维数组静态初始化.zip52.java二维数组静态初始化.zip52.java二维数组静态初始化.zip52.java二维数组静态初始化.zip52.java二维数组静态初始化.zip52.java二维数组静态初始化.zip52.java二维数组静态初始化....

    C#高级编程_Lambda表达式和LINQ的原理和使用

    静态字段在静态构造器初始化。 字段是与类或类的实例关联的变量。 使用 static 修饰符声明的字段定义了一个静态字段 (static field)。一个静态字段只标识一个存储位置。无论对一个类创建多少个实例,它的静态字段...

    数组动态初始化与静态初始化的区别

    静态初始化: 手动输入数组元素,系统会根据元素个数,计算数组的长度. 数组动态初始化: 数据类型[] 数组名=new 数据类型[数据长度] eg: int[] arry=new int [3]; 数组静态初始化: 数据类型[] 数组名=new 数据类型[]{...

    powermock源码学习 支持模拟静态方法、构造函数、final类和方法、私有方法以及移除静态初始化器的模拟工具

    此外,PowerMock还支持模拟普通方法、私有方法、静态方法和final修饰的方法,这极大地丰富了其在各种不同场景下的应用可能性。在实际应用中,为了引入PowerMock包,需要在项目的pom.xml文件中添加相应的Maven依赖。

    Java静态初始化块和对象初始化块

    NULL 博文链接:https://yuu1987.iteye.com/blog/1113142

    达内 java云笔记 初始化 静态页面

    看到网上不少同学在找云笔记初始资料,正好我这有一份,就打包上传了,5个html静态页面,以及相关的美化页面等都齐全,需要的同学可以下载.

    java编程思想-初始化与清理

    java编程思想-初始化与清理了解this之后,你就能更全面地理解“静态(static)方法”的含义。静态方法就是没有this的方法。在“静态方法”的内部不能调用“非静态方法”,反过来倒是可以的。而且你可以在没有创建...

    java相关的2024面试题集锦

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

    php 静态变量的初始化

    } } 但是php中并没有一个类似java中的静态构造器/静态块的东西,就没有合适的时机对其进行初始化了。 对于共有的成员还有办法解决,例如: class A { static public $child; } A::$child = new B()

    c# 类成员初始化顺序的特殊情况

    这里直接给出C#类成员一般初始化顺序: 子类静态字段 子类静态构造 子类实例字段 父类静态字段 父类静态构造 父类实例字段 父类实例构造 子类实例构造 为什么说是“一般”初始化顺序呢?因为根据类结构的...

    【Java语言基础】final关键字

    final修饰变量时,表示该变量一旦获得了初始值之后就不可被改变,final既可修饰成员变量(包括类变量和实例变量),也可以修饰局部变量,形参。 final修饰成员变量 类变量:当类初始化时,系统会为类变量分配内存,...

Global site tag (gtag.js) - Google Analytics