计划从今天开始,模仿一下jythoner大哥,不过不是Java每日一题,而是Java每日一惑。主要是以Java的基本语法和一些虚拟机的特性为出发点,巩固一下自己Java基础知识,并抛砖引玉。我想这个对有些面试还是很有帮助的,所以搜集了一些书上的,网上的Tips。供大家参考,并在每个题目附上自己的理解,如有理解有错的地方和做的不好的地方请大家指出,我们共同进步。我尽量每天都出个Tips,当然大家的支持就是我最大的动力。
下面就先看今天的第一惑,直接上代码:
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 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...
03_JavaSE面试题:类初始化和实例初始化等
1.static修饰一个属性字段,那么这个属性字段将成为类本身的资源,public修饰为共有的,可以在类的外部通过test.a来访问此属性;在类内部任何地方可以使用.如果被修饰为private私有,那么只能在类内部使用.
易语言静态变量初始化源码,静态变量初始化,静态变量初始化例子
注意:本文所说的全局变量指的是 variables with static storage,措词来自 c++ 的语言标准文档。 什么时候初始化 ... static initialization: 静态初始化指的是用常量来对变量进行初始化,主要包括 zero init
Java类加载器:静态变量初始化.docx
Spring源码学习六:bean初始化1
44.java数组静态初始化.zip44.java数组静态初始化.zip44.java数组静态初始化.zip44.java数组静态初始化.zip44.java数组静态初始化.zip44.java数组静态初始化.zip44.java数组静态初始化.zip44.java数组静态初始化.zip...
今天小编就为大家分享一篇关于C++使用初始化列表的方式来初始化字段的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
1、预备知识 2、为何初始化 3、几种初始化方式 5、Tensorflow2.0中的权重初始化函数
详细介绍了Java的静态成员变量、静态数据块、非静态成员变量和非静态成员变量等初始化顺序
Spring源码学习九:DispatcherServlet初始化源码分析1
final修饰变量时,表示该变量一旦获得了初始值之后就不可被改变,final既可修饰成员变量(包括类变量和实例变量),也可以修饰局部变量,形参。 final修饰成员变量 类变量:当类初始化时,系统会为类变量分配内存,...
一个页面表格初始化的源代码,希望对你们有帮助!
动态初始化: 手动输入数组的长度,由系统给出默认初始值.(只明确元素的个数,不明确具体的值) ...数组静态初始化: 数据类型[] 数组名=new 数据类型[]{元素1,元素2...} eg: int [] arry=new int[]={11,22,33}
通常静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域操作符来指出静态成员所属的类.但如果静态成员是整型或是枚举型const,则可以在类声明中初始化
52.java二维数组静态初始化.zip52.java二维数组静态初始化.zip52.java二维数组静态初始化.zip52.java二维数组静态初始化.zip52.java二维数组静态初始化.zip52.java二维数组静态初始化.zip52.java二维数组静态初始化....
类继承的初始化顺序类继承的初始化顺序类继承的初始化顺序类继承的初始化顺序
当爱数-超易备服务器,设置备份策略时,提示以下错示 可先使用使用手册的方法,如下: 当问题没解决时,请安装以下路径的补丁: IT软件安装 (\\top-fp2)(S):\其它software\爱数-超易备客户端\SQLServer2005_BC_64....
大家在安装完Revit或者卸载后重装Revit时是否遇到外部工具无法初始化附加模块的问题,每次打开不停的弹出对话框,烦得要死。 无法初始化附加模块“CollaborateDB”,因为程序集“C:\Program Files\Autodesk\...