关于“调用类中的static final常量时并不会触发该类的初始化,但是调用接口中的static final常量时便会触发该接口的初始化 ”的否定

1、调用运行期常量,接口和类都会触发初始化:
public class MyTest1 {
    public static void main(String[] args) {

        System.out.println(Child.b);
        System.out.println(ChildClass.b);
    }
}

interface Parent {
    public static String a = "Hello World";

}

interface Child extends Parent {
//    public static final String b = "childinterface b";
    public static final String b = UUID.randomUUID().toString();
    public static final Thread thread = new Thread(){
        {
            System.out.println("childinterface thread invoked");
        }
    };
}


class ChildClass{
//    public static final String b = "ChildClass b ";
    public static final String b = UUID.randomUUID().toString();
    public static final Thread thread = new Thread(){
        {
            System.out.println("childClass thread invoked");
        }
    };
}

运行结果如下,

childinterface thread invoked
1f078d18-96f1-4b30-9b26-eba86bcdd417
childClass thread invoked
f9ef3a83-26ed-4ce0-ae46-1a22b5264a24

2.调用编译器常量,都不会触发类或接口的初始化(因为已经放入调用类的常量池中)

public class MyTest1 {
    public static void main(String[] args) {

        System.out.println(Child.b);
        System.out.println(ChildClass.b);
    }
}

interface Parent {
    public static String a = "Hello World";

}

interface Child extends Parent {
    public static final String b = "childinterface b";
//    public static final String b = UUID.randomUUID().toString();
    public static final Thread thread = new Thread(){
        {
            System.out.println("childinterface thread invoked");
        }
    };
}


class ChildClass{
    public static final String b = "ChildClass b ";
//    public static final String b = UUID.randomUUID().toString();
    public static final Thread thread = new Thread(){
        {
            System.out.println("childClass thread invoked");
        }
    };
}

运行结果:

childinterface b
ChildClass b 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于 `static final` 对象,由于其是静态常量,一旦初始化后就不能被修改,因此无法直接通过监听对象的属性变化来实现对其的监听。 不过,可以通过使用代理模式来实现非入侵式的监听。具体步骤如下: 1. 定义一个接口,其包含需要监听的方法 ```java public interface StaticFinalObjectListener { void onObjectChanged(); } ``` 2. 定义一个代理,实现该接口,并记录需要监听的静态常量对象 ```java public class StaticFinalObjectProxy { private static final Object MONITOR = new Object(); private static final StaticFinalObjectProxy INSTANCE = new StaticFinalObjectProxy(); private static final String CONSTANT_OBJECT = "Hello, World!"; private StaticFinalObjectListener listener; private StaticFinalObjectProxy() {} public static StaticFinalObjectProxy getInstance() { return INSTANCE; } public void setListener(StaticFinalObjectListener listener) { this.listener = listener; } public void notifyObjectChanged() { synchronized (MONITOR) { if (listener != null) { listener.onObjectChanged(); } } } public String getConstantObject() { return CONSTANT_OBJECT; } } ``` 3. 在需要监听静态常量对象的地方,获取代理对象并设置监听器 ```java StaticFinalObjectProxy proxy = StaticFinalObjectProxy.getInstance(); proxy.setListener(() -> System.out.println("Static final object changed!")); ``` 4. 在静态常量对象被修改,通过代理对象的方法来通知监听器 ```java // 在需要修改静态常量对象的地方 StaticFinalObjectProxy proxy = StaticFinalObjectProxy.getInstance(); synchronized (StaticFinalObjectProxy.MONITOR) { // 修改静态常量对象 // ... // 通知监听器 proxy.notifyObjectChanged(); } ``` 在这个例子,我们通过代理模式实现了对静态常量对象的非入侵式监听。当静态常量对象被修改,代理对象的 `notifyObjectChanged()` 方法调用,从而触发监听器的回调函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值