static、final、static final 用法

static、final、static final 用法

转自:http://blog.csdn.net/tengdazhang770960436/article/details/25156743

1.使用范围:类、方法、变量。

2.区别和联系:

2.1.static 含义:静态的,被 static 修饰的方法和属性只属于类不属于类的任何对象。
2.2.static 用法:
2.2.1.static 可以修饰【内部类】、方法和成员变量。
2.2.2.static【不可以修饰外部类】、【不可以修饰局部变量】(因为 static 本身就是定义为类级别的,所以局部级别的变量是不可以用 static 修饰的)。

2.3 final 含义:【只能赋值一次】的。
2.2.final 用法:
2.2.1.final 修饰属性,表示属性【只能赋值一次】,(1)基本类型:值不能被修改;(2)引用类型:引用不可以被修改该。
2.2.2.final 修饰方法,表示方法不可以重写,但是可以被子类访问(如果方法不是 private 类型话)。
2.2.2.final 修饰类,表示类不可以被继承。

3.联合使用 static final
3.1.适用范围:
3.1.2.两者范围的交集,所以只能修饰:成员变量、方法、内部类。
3.2.含义:也是二者交集:
3.2.1.方法:属于类的方法且不可以被重写。
3.2.2.成员变量:属于类的变量且只能赋值一次。
3.2.3.内部类:属于外部类,且不能被继承

 

java中static final与final的不同

如果只是使用final  那你如果想使用这个属性 需要实例化对象 才能使用
如果加上static 那他就属于类属性 不用实例化 直接使用

 

再如以下例子:http://bbs.csdn.net/topics/350037073

class SelfCounter{
private static int counter;
private int id = counter ++;

public String toString(){
return "SelfCounter :" + id;
}
}

class WithFinalFields{
static final SelfCounter wffs = new SelfCounter();
final SelfCounter wff = new SelfCounter();


public String toString(){
return "wff = " + wff + "\n wffs = " + wffs;
}
}

public class E18_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

 

static的常量在类加载的时候被初始化,而实例常量在实例化的时候被初始化。

其实上面的过程很简单。

第一次实例化WithFinalFields的时候,虚拟机发现该类没有被加载,于是先加载类,加载类的同时需要初始化类的所有static无论是变量、常量还是块,于是wffs需要实例化一个SelfCounter对象,这个时候虚拟机发现SelfCounter类也没有被加载,于是加载SelfCounter类,同时初始化static变量counter为0,加载SelfCounter类完毕,开始实例化SelfCounter对象,初始化id为0(此时counter为0),同时counter变为1,这时SelfCounter对象的实例化完毕,并被赋值给WithFinalFields类的wffs常量,加载WithFinalFields类的过程完毕,开始正式实例化WithFinalFields对象,初始化wff常量,又需要实例化一个SelfCounter对象,这时虚拟机发现SelfCounter类已经被加载,于直接开始实例化SelfCounter对象,初始化id为1(此时counter为1),同时counter变为2,实例化WithFinalFields对象完毕,此时wffs的id为0,wff的id为1。

第二次实例化WithFinalFields的时候,虚拟机发现该类已经被加载,直接实例化,不会初始化static无论是变量、常量还是块,于是直接初始化wff常量,需要实例化SelfCounter对象,该类也已经被加载,于是也直接实例化,初始化id为2(此时counter为2),同时counter变为3,实例化SelfCounter对象完毕,同时实例化WithFinalFields对象完毕,此时wffs的id仍然为0,wff的id为2。

重点是静态的东西只会被初始化一次,发生在类加载的时候。


static的常量在类加载的时候被初始化,而实例常量在实例化的时候被初始化。

final是不可变,但问题是有两个WithFinalFields对象,每个WithFinalFields对象都有它自己的wff常量,而且对于引用类型的常量,所谓不可变仅仅是引用不能重新指向其他对象,而不是对象内部的各种属性的值不可变。

 

posted on 2017-09-20 09:33  小甜瓜安东泥  阅读(303)  评论(0编辑  收藏  举报