Java中static,final,static final的区别

该文章中的内容不一定准确,若有错误欢迎指出。

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修饰基本数据类型的属性值不变,而修饰对象时,指明的是对象引用地址不变,对象还是内存中那个地址的对象,但是对象里的属性是可变的。

猜你喜欢

转载自blog.csdn.net/qq_20492999/article/details/80860772