简单易懂的理解Java中的static、final以及static final

首先,从最基本的概念上来说:

1.static,static通常修饰方法、成员变量等,强调它所修饰的属性只有一个

首先关于static修饰的方法,称之为静态方法。静态方法可以直接通过类名被调用,任何类生成的实例也可以调用,因而被static修饰过的方法不能有this或者super这种需要有实例的关键字,也不能直接访问所属类的实例变量或实例方法。

关于static修饰的变量,静态变量,表示静态变量在内存中只有一个拷贝,JVM只为静态变量分配一次内存,在加载类的过程中便完成静态变量的内存分配,同静态方法一样,静态变量可以用类名直接访问,同时也是推荐的方法,而不要用对象来访问(因为静态变量不属于单一对象)。

要注意static修饰的方法或者变量初始化在编译期。

2.final,final通常修饰类、方法、成员变量等。

final修饰类时表示类不能被继承,没有子类,类中方法默认是final的。

final修饰方法的时候表示方法不能被子类的方法覆盖,但可以被继承。

final比较关键的就是当它修饰变量时表示常量,即只能被赋值一次,并且赋值后不再改变。

3.static final(同final static一样,一般写作前者),static final在修饰基本数据类型的变量时,表示该变量为常数或者说常量(创建后不能被修改,值为固定的),与final修饰基本数据类型时是相同的,只是两者在变量的初始化顺序上有所不同。

final和static final其实是不容易理解的两个关键词,楼主发现一个比较好的代码例子,感谢@奋斗的蜗牛cn的提供,接下来我们借助代码来理解(以下代码内容并不复杂,希望大家可以耐心阅读

首先定义一个计数的类,其中计数器被static修饰。(带入之前的介绍,counter这个变量应当是唯一的。)

package difStaticFinalAndFinal;

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

然后是一个测试类,在测试类中我们用static final修饰了一个Counter的实例,用final也修饰了一个Counter实例。

package difStaticFinalAndFinal;

class Test {  
    static final Counter staticFinalCounter= new Counter();  
    final Counter finalCounter = new Counter();
    
    public String toString(){
        return "finalCounter=" + finalCounter + ",\n" + "staticFinalCounter=" + staticFinalCounter;
    }
}

最后在main函数中我们建两个测试类的实例并打印。

package difStaticFinalAndFinal;

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

可以看到输出结果如下图:

分析一下输出结果,看到staticFinalCounter中id首先被赋值为0,并且保持没变。原因就是在被static修饰的情况下,staticFinalCounter只被初始化一次,所以第二次便不会经历一个Counter构造的过程,保持了id为0.

而finalCounter值增加了1,可能会有朋友考虑final修饰的不是常量吗,为什么值会改变?是因为这里final修饰的并不是基本类型,而是一个实例化的类(引用),引用的内容是可以改变的,而不可以改变引用指向的对象。

有兴趣的同学可以自己测试一下逐步调试,可以发现static修饰的变量或者对象,只会在程序编译期的时候初始化一次,再之后都会被跳过,(即被JVM分配的内存就在那里,不会再新分配)。

猜你喜欢

转载自blog.csdn.net/VeastLee/article/details/81319412