该文章中的内容不一定准确,若有错误欢迎指出。
static,final都是Java中的修饰关键字,static final则是static + final 组合,它与 final static 无区别
修饰范围:
static可修饰:属性,方法,代码块,内部类(静态内部类或嵌套内部类)
final可修饰:属性,变量,方法 ,局部变量(在方法中的变量)
static final可修饰:属性,方法
static
static修饰的属性强调它们只有一个
static修饰的属性的初始化在编译期(类加载的时候),初始化后能改变。
static修饰的属性的值只有一个
static修饰的属性、方法、代码段跟该类的具体对象无关,不创建对象也能调用static修饰的属性、方法等
static不可以修饰局部变量。
static还可以修饰代码块,专业名称:静态代码块,初始化在类加载过程中。
static修饰方法后,可以通过类名.方法名()
的方式进行调用。但是在实际开发中也少用到该方式,因为一是static修饰后的方法资源共享,在多线程场景不安全。二是静态资源常驻内存,很难被回收;
static修饰属性时例子:static String name,这个变量是存在静态区,被堆中的对象所共享。如果依次赋值给2个对象name张三、李四。最终2个对象的name为李四(因为后一次的赋值在静态区中将前一次的赋值覆盖)
final
final修饰强调不可变性
(这里指基本数据类型值或对象引用不变,如果是修饰对象,对象内容是可变的)
final修饰的类不能有子类,也不能被继承
final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变。
final修饰的属性跟具体对象有关,在运行期初始化的final属性,不同对象可以有不同的值。
final修饰的属性表明是一个常数(创建后不能被修改)。
final修饰的方法表示该方法在子类中不能被重写
对于基本类型数据,final会将值变为一个常数(创建后不能被修改);但是对于对象句柄(亦可称作引用或者指针),final会将句柄变为一个常数(进行声明时,必须将句柄初始化到一个具体的对象。而且不能再将句柄指向另一个对象。但是,对象的本身是可以修改的。这一限制也适用于数组,数组也属于对象,数组本身也是可以修改的。方法参数中的final句柄,意味着在该方法内部,我们不能改变参数句柄指向的实际东西,也就是说在方法内部不能给形参句柄再另外赋值)。
static final
是static + final组合起来,所以能修饰的是交集:属性,方法
static修饰的属性强调它们只有一个,final修饰的属性表明是一个常数(创建后不能被修改)。static final修饰的属性表示一旦给值,就不可修改,并且可以通过类名访问。
static final也可以修饰方法,表示该方法不能重写,可以在不new对象的情况下调用
static final和final的区别
用一个例子说明:
package com.hq.modified;
import java.util.Random;
/**
* final和static final的区别
* @author Huangqing
* @date 2018/6/29 17:33
*/
public class StaticAndFinalTest {
private static Random rand = new Random(100);
private final int a = rand.nextInt(100);
private static final int B = rand.nextInt(100);
public static void main(String[] args) {
StaticAndFinalTest test = new StaticAndFinalTest();
System.out.println("test : " + "a=" + test.a);
System.out.println("test : " + "B=" + test.B);
System.out.println("********************");
StaticAndFinalTest sf1 = new StaticAndFinalTest();
System.out.println("test : " + "a=" + test.a);
System.out.println("test : " + "B=" + test.B);
}
}
运行结果:
test : a=47
test : B=15
********************
test : a=75
test : B=15
其实说是static final和final的区别,其实是static 和 final的区别
static修饰的属性,只能有一个,所以两次访问的都是同一个对象,而final修饰基本数据类型的属性值不变,而修饰对象时,指明的是对象引用地址不变,对象还是内存中那个地址的对象,但是对象里的属性是可变的。