public class MyTest5 {
public static void main(String[] args){
System.out.println(MyChild5.b);
}
}
interface MyParent5 {
public static final int a = 5;
}
interface MyChild5 extends MyParent5 {
public static final int b = 6;
}
程序会输出6,即使删掉MyParent5的class文件程序也能正常运行,(接口里的变量默认都是final的)说明
当一个接口在初始化时,并不要求其父接口都完成了初始化
MyChild5中的b改为
// 如果删掉MyParent5的class文件会报错
public static final int b = new Random().nextInt(2);
public class MyTest5 {
public static void main(String[] args){
System.out.println(MyChild5.b);
}
}
interface MyParent5 {
public static final int a = new Random().nextInt(3);
}
interface MyChild5 extends MyParent5 {
public static final int b = 5;
}
删掉MyParent5是可以正常执行
public class MyTest5 {
public static void main(String[] args){
System.out.println(MyChild5.b);
}
}
interface MyParent5 {
public static final int a = new Random().nextInt(3);
}
interface MyChild5 extends MyParent5 {
public static final int b = new Random().nextInt(4);
}
删掉MyParent5会报错
只要在真正使用到父接口的时候(如引用接口中定义的常量时),才会初始化
public class MyTest6 {
public static void main(String[] args){
Singleton singleton = Singleton.getInstance();
System.out.println("counter1: " + Singleton.counter1);
System.out.println("counter2: " + Singleton.counter2);
}
}
class Singleton{
public static int counter1;
public static int counter2 = 0;
public static Singleton singleton = new Singleton();
private Singleton(){
counter1 ++;
counter2 ++;
}
public static Singleton getInstance(){
return singleton;
}
}
执行结果如下:
将Singleton的counter2放在私有构造方法之后
class Singleton{
public static int counter1;
public static Singleton singleton = new Singleton();
private Singleton(){
counter1 ++;
counter2 ++; // 主动使用,在准备阶段赋上初值
// System.out.println("counter1: " + counter1);
// System.out.println("counter2: " + counter2);
}
// 代码移到这里输出就变成了0,执行到这里时相当于又手工赋值0
public static int counter2 = 0;
public static Singleton getInstance(){
return singleton;
}
}
执行结果如下:
初始化的顺序是在代码里声明的位置从上到下,所以counter2在准备阶段是赋值为默认值0,然后在构造方法里加1,但是之后初始化又被重新赋值为指定的0
在私有构造方法中打印出来:
public class MyTest6 {
public static void main(String[] args){
Singleton singleton = Singleton.getInstance();
System.out.println("counter1: " + Singleton.counter1);
System.out.println("counter2: " + Singleton.counter2);
}
}
class Singleton{
public static int counter1;
public static Singleton singleton = new Singleton();
private Singleton(){
counter1 ++;
counter2 ++; // 主动使用,在准备阶段赋上初值,准备阶段的意义
System.out.println("counter1: " + counter1);
System.out.println("counter2: " + counter2);
}
// 代码移到这里输出就变成了0,执行到这里时相当于又手工赋值0
public static int counter2 = 0;
public static Singleton getInstance(){
return singleton;
}
}