public class MyTest3 {
public static void main(String[] args) {
System.out.println(MyParent3.str);
}
}
class MyParent3{
public static final String str = UUID.randomUUID().toString();
static {
System.out.println("MyParent3 static code");
}
}
当str是一个随机数,会输出静态代码块与不同的随机数,上一节str='hello world' 就不会执行static代码块
这时因为,当一个常量的值并非编译期间可以确定的,那么其值就不会被放到调用类的常量池中,这时在程序运行时,会导致主动使用这个常量所在的类,显然会导致这个类被初始化。
public class MyTest4 {
public static void main(String[] args) {
MyParent4 myParent4 = new MyParent4();
}
}
class MyParent4{
static{
System.out.println("MyParent4 static block");
}
}
会输出MyParent4 static block 符合首次主动使用
public static void main(String[] args) {
MyParent4 myParent4 = new MyParent4();
MyParent4 myParent5 = new MyParent4();
}
只会输出一次,因为只有首次主动使用才会初始化
public class MyTest4 {
public static void main(String[] args) {
// MyParent4 myParent4 = new MyParent4();
// MyParent4 myParent5 = new MyParent4();
MyParent4[] myParent5 = new MyParent4[1];
}
}
class MyParent4{
static{
System.out.println("MyParent4 static block");
}
}
什么都不输出,new MyParent4[1] 肯定是生成了实例,使用getClass查看从属类型
MyParent4[] myParent5 = new MyParent4[1];
System.out.println(myParent5.getClass());
[L开头的对象是由JAVA虚拟机在运行期创建出来的
对于引用类型的数组实例来说,其类型是由JVM运行期动态生成的,表示为[L....,这种形式。动态生成的类型,其父类型就是Object(原始类型的每个基本都不太一样,如int[] 是 [I 等)
对于数组来说,JavaDoc经常将构成数组的元素为Component,实际上就是将数组降低一个维度后的类型。
助记符:
anewarray:表示创建一个引用类型的(如类,接口,数组)数组,并将其引用值压入栈顶
newarray:表示创建一个指定的原始类型(如int、float、char等)的数组,并将其引用值压入栈顶