final在java的有趣问题?

final可以修饰类、变量、方法。被final修饰的类不能被继承,被final修饰的变量值不能改变,被final修饰的方法不能重写。

再次探讨一个有趣的问题,如下面代码

package com.test;

public class StaticPojo {

    public static final String a = "2";
    
    public static final int c = 3;
    
    public static final double b = Math.random();
    
    static {
        System.out.println("静态代码块被执行了");
    }
    
    public StaticPojo() {
        System.out.println("我是构造方法,我被调用了");
    }
    
    public static final void syso() {
        System.out.println("我是静态方法");
    }
    
    public static void main(String[] args) {
        System.out.println(StaticPojo.a);
    }
}

在方法内调用main方法时,输出为

静态代码块被执行了
2

当在外部调用时:


package com.test;

public class TestStatic {
    
    static {
        System.out.println("我是TestStatic的静态代码块");
    }

    public static void main(String[] args) {
        System.out.println(StaticPojo.a);
    }
}
 

输出结果为:

我是TestStatic的静态代码块
2

上面两个比较:

  说明main方法执行时需要实例化本对象,main方法所属的class的静态代码块都执行了,为什么外部调用StaticPojo.a时,StaticPojo的静态代码块没有执行?

当调用:

package com.test;

public class TestStatic {
    
    static {
        System.out.println("我是TestStatic的静态代码块");
    }

    public static void main(String[] args) {
        System.out.println(StaticPojo.b);
    }
}

输出:

我是TestStatic的静态代码块
静态代码块被执行了
0.8097364644291586

此时StaticPojo的静态代码块也执行了,main方法所属类的静态代码块执行,打印的变量类型不同,对对象的实例化有什么影响?

posted on 2018-09-10 17:01  魏先生的Weisir  阅读(120)  评论(0)    收藏  举报

导航