基础知识

1、类中的静态语句块只能访问到在块之前定义的变量,定义在块之后的变量,可以在块中进行赋值,但是不能访问。如下示例:

 1 package com.cfang.loadClassTest;
 2 
 3 public class TestClsStatic {
 4 
 5     //public static int i = 123;  //
 6     
 7     static{
 8         i = 456;
 9         System.out.println(i); //Cannot reference a field before it is defined
10     }
11     
12     public static int i = 123; //
13 }

  上述第9行报错“非法向前引用”,可以注释掉所在行,放开行。

2、调用静态字段,只有直接定义这个字段的类才会被初始化,所以通过子类调用父类的静态字段,只会触发父类的初始化而不初始化子类。如下程序示例:

 1 package com.cfang.loadClassTest;
 2 
 3 public class TestLoadClass {
 4 
 5     public static void main(String[] args) {
 6         //通过子类去调用父类的静态字段,只会触发父类初始化,而子类本身并不初始化
 7         System.out.println(SubClass.value);
 8         
 9         //对自身常量池的引用,不会触发初始化操作
10 //        System.out.println(SubClass.value1);
11         
12         //不会触发初始化操作
13 //        SuperClass[] arr = new SuperClass[10];
14 //        System.out.println(arr.toString());
15         
16 //        SuperClass cls = new SuperClass();
17         
18 //        SuperClass cls = new SubClass();
19 //        System.out.println(cls.value3);
20     }
21 }
22 
23 class SuperClass{
24     static{
25         System.out.println("init superClass");
26     }
27     public static int value = 123;
28     public static final int value1 = 456;
29     public int value3 = 111;
30 }
31 
32 class SubClass extends SuperClass{
33     static{
34         System.out.println("init subClass");
35     }
36 }

  输出结果为:

init superClass
123

3、类成员变量会初始化值,而局部变量必须进行初始化。如下:

 1 package com.cfang.loadClassTest;
 2 
 3 public class TestInit {
 4 
 5     private static String str;
 6     
 7     public static void main(String[] args) {
 8         String str2;
 9         System.out.println(str); //输出:null
10         System.out.println(str2); //编译不通过,报错信息:The local variable str2 may not have been initialized
11     }
12 }

。。。

原文地址:https://www.cnblogs.com/eric-fang/p/10385085.html