詳解static 和 final 和 static final區(qū)別
眾所周知,static 是靜態(tài)修飾關(guān)鍵字:可以修飾變量,程序塊,方法,類(lèi)。
1.修飾變量。
得知:如果static修飾的是變量,則JVM會(huì)將將其分配在內(nèi)存堆上,該變量就與對(duì)象無(wú)關(guān),所有對(duì)該變量的引用都指向同一個(gè)地址。
因此我們使用該變量的時(shí)候,直接指明類(lèi)的靜態(tài)變量,當(dāng)然修飾符必須 public
public class StaticBean {
public static String A = "A";
}
使用方式
public static void main(String[] args) throws Exception{
System.out.println(StaticBean.A);
}
2.修飾程序塊,猜猜輸出結(jié)果是什么?。
public class BaseTest {
static{
System.out.println("B");
}
public static void main(String[] args) throws Exception{
System.out.println("A");
}
}
結(jié)論:JVM就會(huì)優(yōu)先加載靜態(tài)塊中代碼,因此會(huì)優(yōu)先輸出B,static 修飾代碼塊,這主要用于系統(tǒng)初始化。
B
A
3.修飾方法:在外部調(diào)用靜態(tài)方法時(shí),可以使用"類(lèi)名.方法名"的方式,也可以使用"對(duì)象名.方法名"的方式。而實(shí)例方法只有后面這種方式。也就是說(shuō),調(diào)用靜態(tài)方法可以無(wú)需創(chuàng)建對(duì)象,靜態(tài)方法在訪問(wèn)本類(lèi)的成員時(shí),只允許訪問(wèn)靜態(tài)成員,而不允許訪問(wèn)實(shí)例成員變量和實(shí)例方法。
public class StaticBean {
public static String A = "A";
public String D;
public static void getMessage(){
System.out.println(A);
System.out.println(D);
}
}
上面代碼,哪句是錯(cuò)誤的,很顯然。
System.out.println(D);
4.修飾類(lèi)。在我們的熟知之中,static 修飾符一般用于修飾變量,程序塊,方法,但是什么時(shí)候使用static來(lái)修飾類(lèi)呢?
內(nèi)部類(lèi)。如果在外部類(lèi)聲明為static,程序會(huì)編譯都不會(huì)過(guò)。
內(nèi)部類(lèi)特點(diǎn)如下:
- 1.不持有外部類(lèi)的引用(普通內(nèi)部類(lèi)持有)
- 2.可以直接創(chuàng)建實(shí)例,不需要先創(chuàng)建外部類(lèi)(普通內(nèi)部類(lèi)需要)
- 3.可以有靜態(tài)成員變量、方法(普通內(nèi)部類(lèi)不行)和非靜態(tài)成員變量、方法
- 4.只可以直接訪問(wèn)外部類(lèi)靜態(tài)成員,不可以直接訪問(wèn)外部類(lèi)的非靜態(tài)成員(普通內(nèi)部類(lèi)可以),需要通過(guò)傳入外部類(lèi)引用的方式才能訪問(wèn)
- 5.加載一個(gè)類(lèi)時(shí),其內(nèi)部類(lèi)不會(huì)同時(shí)被加載。一個(gè)類(lèi)被加載,當(dāng)且僅當(dāng)其某個(gè)靜態(tài)成員(靜態(tài)域、構(gòu)造器、靜態(tài)方法等)被調(diào)用時(shí)發(fā)生
那就很簡(jiǎn)單引出,什么時(shí)候會(huì)使用靜態(tài)內(nèi)部類(lèi)呢? 我們來(lái)看下以下一個(gè)例子
public class Outer {
private int i = 0;
public Outer() {
i++;
System.out.println("=====init Outer "+i+"====");
}
public static Outer getInstance(){
return Inner.INSTANCE;
}
//靜態(tài)內(nèi)部類(lèi)
public static class Inner{
private static final Outer INSTANCE = new Outer();
}
}
調(diào)用方
public class BaseTest {
public static void main(String[] args) throws Exception{
for(int i = 0; i < 1000;i++) {
Outer.getInstance();
}
}
}
輸出結(jié)果:
=====init Outer 1====
我們總結(jié)下:
由于 INSTANCE 是常量,因此只能賦值一次;它還是靜態(tài)的,因此隨著內(nèi)部類(lèi)一起加載,這種也是單例懶漢模式的一種實(shí)現(xiàn)方式,同時(shí)保證了線程安全。
final 關(guān)鍵字可以用來(lái)修飾類(lèi),方法和變量
1.修飾類(lèi)
表示該類(lèi)不允許被繼承,final類(lèi)中的成員方法都會(huì)被隱式的指定為final方法。
public final class FinalBean {
public void test(){
}
}
2.修飾方法
表示該方法不能被重寫(xiě),一個(gè)類(lèi)的private方法會(huì)隱式的被指定為final方法。
以下例子SunFinalBean的test方法報(bào)錯(cuò)。
public class FinalBean {
public final void test(){
}
public class SunFinalBean extends FinalBean{
public void test(){
}
}
}
3.修飾變量
表示該變量必須初始化,且值不能改變。如果是基本類(lèi)型則值不能改變,如果是引用類(lèi)型,則引用地址不能改變,但是這個(gè)引用所指向的對(duì)象里面的內(nèi)容還是可以改變的。
猜猜看,以下那句通不過(guò)編譯器編譯。
public class FinalBean {
private final int i = 0;
private final int j;
private final String name = "";
public FinalBean(){
j = 1;
this.name.concat("123");
this.name = "123";
}
}
這句,記住final的原理即可理解,那為什么this.name.concat("123");不會(huì)報(bào)錯(cuò)呢,因?yàn)榈讓訉?shí)現(xiàn)是返回一個(gè)新的String對(duì)象
this.name = "123";
那static final 一起用:
static修飾的屬性強(qiáng)調(diào)它們只有一個(gè),final修飾的屬性表明是一個(gè)常數(shù)(創(chuàng)建后不能被修改)。static final修飾的屬性表示一旦給值,就不可修改,并且可以通過(guò)類(lèi)名訪問(wèn)。
static final也可以修飾方法,表示該方法不能重寫(xiě),可以在不new對(duì)象的情況下調(diào)用。
以上所述是小編給大家介紹的static 和 final 和 static final區(qū)別詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- 學(xué)習(xí)Java的static與final關(guān)鍵字
- Java關(guān)鍵字final、static使用總結(jié)
- 淺析對(duì)Java關(guān)鍵字final和static的理解
- Java final static abstract關(guān)鍵字概述
- php類(lèi)中的$this,static,final,const,self這幾個(gè)關(guān)鍵字使用方法
- 詳解Java編程中static關(guān)鍵字和final關(guān)鍵字的使用
- Java修飾符 abstract,static,final 的區(qū)別詳解
- java 中的static關(guān)鍵字和final關(guān)鍵字的不同之處
相關(guān)文章
關(guān)于Java8新特性O(shè)ptional類(lèi)的詳細(xì)解讀
Optional類(lèi)是一個(gè)容器類(lèi),它可以保存類(lèi)型T的值,代表這個(gè)值存在?;蛘邇H僅保存null,表示這個(gè)值不存在,原來(lái)用 null 表示一個(gè)值不存在,現(xiàn)在Optional 可以更好的表達(dá)這個(gè)概念。并且可以避免空指針異常,需要的朋友可以參考下2023-05-05
Java中Array List與Linked List的實(shí)現(xiàn)分析
這篇文章主要給大家介紹了關(guān)于Array List與Linked List實(shí)現(xiàn)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
Java對(duì)象比較之equals與hashCode詳解
這篇文章主要介紹了Java對(duì)象比較之equals與hashCode詳解,equals?方法和?hashCode?方法是?Object?類(lèi)中的兩個(gè)基礎(chǔ)方法,它們共同協(xié)作來(lái)判斷兩個(gè)對(duì)象是否相等,需要的朋友可以參考下2023-12-12
使用Java實(shí)現(xiàn)系統(tǒng)托盤(pán)功能的介紹(附源碼以及截圖)
本篇文章介紹了,在Java中實(shí)現(xiàn)系統(tǒng)托盤(pán)功能的詳解,文中附源碼以及截圖介紹。需要的朋友參考下2013-05-05
java編程之AC自動(dòng)機(jī)工作原理與實(shí)現(xiàn)代碼
這篇文章主要介紹了java編程之AC自動(dòng)機(jī)的有關(guān)內(nèi)容,涉及其應(yīng)用場(chǎng)景,運(yùn)行原理,運(yùn)行過(guò)程,構(gòu)造方法及Java中的實(shí)現(xiàn)代碼,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11
spring導(dǎo)入framework報(bào)紅問(wèn)題
這篇文章主要介紹了spring導(dǎo)入framework報(bào)紅問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
Java中的CAS無(wú)鎖機(jī)制實(shí)現(xiàn)原理詳解
這篇文章主要介紹了Java中的CAS無(wú)鎖機(jī)制實(shí)現(xiàn)原理詳解,無(wú)鎖機(jī)制,是樂(lè)觀鎖的一種實(shí)現(xiàn),并發(fā)情況下保證對(duì)共享變量值更改的原子性,CAS是Java中Unsafe類(lèi)里面的方法,底層通過(guò)調(diào)用C語(yǔ)言接口,再通過(guò)cup硬件指令保證原子性,需要的朋友可以參考下2024-01-01

