首页 > 代码库 > static final 和final的区别 2016.12.07

static final 和final的区别 2016.12.07

学习java的时候常常会被修饰符搞糊涂,这里总结下static final和final的区别。

1、static 强调只有一份,final 说明是一个常量,final定义的基本类型的值是不可改变的,但是fianl定义的引用对象的值是可以改变的,下面举个例子来说明:

package DifStaticFinalAndFinal;

class SelfCounter {
    private static int counter;
    private int id=counter++;
    
    public String toString(){
        return "SelfCounter: "+id;
    }
}
package DifStaticFinalAndFinal;

class WithFinalFields {
    static final SelfCounter wffs=new SelfCounter();
    final SelfCounter wff=new SelfCounter();
    
    public String toString(){
        return "wff= "+wff+",\n wffs= "+wffs;
    }
}

主函数:

package DifStaticFinalAndFinal;

public class StaticFinal {
    public static void main(String[] args) {
        System.out.println("First Object:");
        System.out.println(new WithFinalFields());
        System.out.println("Second Object:");
        System.out.println(new WithFinalFields());
    }
}

运行结果:

First Object:
wff= SelfCounter: 1,
 wffs= SelfCounter: 0
Second Object:
wff= SelfCounter: 2,
 wffs= SelfCounter: 0

分析为什么wff两次的运行结果不同,而wffs两次的运行结果相同?

因为wffs这个容器是用static final来定义的,static 强调只有一份,因此只有一个值,

而final修饰的引用是可以变化的,因此wff的值是可以变化的,这也是final修饰基本类型和引用的不同。

 

static final 和final的区别 2016.12.07