Java中static與final關(guān)鍵字詳解(簡單易懂)
一、static(靜態(tài)關(guān)鍵字)
1. 核心概念
static修飾的成員(變量、方法、代碼塊、內(nèi)部類)屬于類本身,而不是類的某個(gè)實(shí)例(對(duì)象)。
- 比喻:班級(jí)的公共飲水機(jī)(static),屬于整個(gè)班級(jí),所有同學(xué)(對(duì)象)都能使用,且只有 1 份;而每個(gè)同學(xué)的水杯(非 static),屬于各自的實(shí)例,有多個(gè)副本。
- 內(nèi)存角度:static 成員在類加載時(shí)就被初始化,存放在方法區(qū)(而非堆內(nèi)存),生命周期與類一致,直到 JVM 卸載該類。
2. 常見用法及示例
(1)static 變量(類變量)
- 所有實(shí)例共享同一個(gè) static 變量,修改一個(gè)實(shí)例的 static 變量,其他實(shí)例的該變量也會(huì)同步變化。
- 訪問方式:
類名.變量名(推薦)或對(duì)象名.變量名(不推薦,易混淆)。 - 命名規(guī)范:通常配合
final使用(常量),全大寫,下劃線分隔;普通 static 變量小寫開頭。
public class Student {
// 非static變量(實(shí)例變量):每個(gè)學(xué)生有獨(dú)立的姓名
private String name;
// static變量(類變量):所有學(xué)生共享同一個(gè)班級(jí)名稱,只有1份
public static String className = "高一(1)班";
public Student(String name) {
this.name = name;
}
public static void main(String[] args) {
Student s1 = new Student("張三");
Student s2 = new Student("李四");
// 訪問static變量:推薦用類名訪問
System.out.println(Student.className); // 輸出:高一(1)班
// 修改static變量
Student.className = "高一(2)班";
// 所有實(shí)例的static變量都被修改
System.out.println(s1.className); // 輸出:高一(2)班
System.out.println(s2.className); // 輸出:高一(2)班
}
}
(2)static 方法(類方法)
- 屬于類,無需創(chuàng)建對(duì)象即可調(diào)用(
類名.方法名)。 - 核心限制:不能直接訪問非 static 成員(因?yàn)?static 方法沒有
this引用,無法指向具體實(shí)例),但可以訪問 static 成員。 - 典型場(chǎng)景:工具類方法(如
Math.random()、Arrays.sort())、工具性操作(如對(duì)象創(chuàng)建的靜態(tài)工廠方法)。
public class Calculator {
// static方法:無需創(chuàng)建Calculator對(duì)象即可調(diào)用
public static int add(int a, int b) {
// 可以訪問static成員,不能訪問非static成員
return a + b;
}
// 非static方法:必須創(chuàng)建對(duì)象才能調(diào)用
public int subtract(int a, int b) {
return a - b;
}
public static void main(String[] args) {
// 調(diào)用static方法:直接用類名
int sum = Calculator.add(10, 20);
System.out.println(sum); // 輸出:30
// 調(diào)用非static方法:必須創(chuàng)建對(duì)象
Calculator cal = new Calculator();
int diff = cal.subtract(20, 10);
System.out.println(diff); // 輸出:10
}
}
(3)static 代碼塊
- 類加載時(shí)執(zhí)行,且只執(zhí)行一次(無論創(chuàng)建多少個(gè)實(shí)例)。
- 用于初始化 static 變量(如加載配置、初始化靜態(tài)資源)。
public class Config {
public static String DB_URL;
// static代碼塊:類加載時(shí)執(zhí)行,初始化靜態(tài)變量
static {
System.out.println("static代碼塊執(zhí)行");
DB_URL = "jdbc:mysql://localhost:3306/test";
}
public static void main(String[] args) {
// 首次訪問類,觸發(fā)類加載,執(zhí)行static代碼塊
System.out.println(Config.DB_URL); // 輸出:static代碼塊執(zhí)行 + jdbc:mysql://localhost:3306/test
// 再次創(chuàng)建實(shí)例,static代碼塊不會(huì)重復(fù)執(zhí)行
Config c1 = new Config();
Config c2 = new Config();
}
}
(4)static 內(nèi)部類
- 屬于外部類本身,無需依賴外部類的實(shí)例即可創(chuàng)建。
- 不能訪問外部類的非 static 成員(只能訪問 static 成員)。
public class OuterClass {
private static String staticField = "靜態(tài)字段";
private String nonStaticField = "非靜態(tài)字段";
// static內(nèi)部類
public static class StaticInnerClass {
public void print() {
// 可以訪問外部類的static成員
System.out.println(staticField);
// 錯(cuò)誤:不能訪問外部類的非static成員
// System.out.println(nonStaticField);
}
}
public static void main(String[] args) {
// 創(chuàng)建static內(nèi)部類:無需外部類實(shí)例
OuterClass.StaticInnerClass inner = new OuterClass.StaticInnerClass();
inner.print(); // 輸出:靜態(tài)字段
}
}
二、final(最終關(guān)鍵字)
1. 核心概念
final表示 “最終的、不可改變的”,修飾不同成員時(shí),含義略有差異,但核心都是 “不可修改”。
- 比喻:刻在石碑上的文字(final 變量)無法修改;密封的箱子(final 方法)無法被打開重寫;絕版的書籍(final 類)無法再版(繼承)。
2. 常見用法及示例
(1)final 變量(常量)
- 一旦賦值,不可修改(引用類型變量:引用不可變,但對(duì)象內(nèi)容可變)。
- 初始化要求:
- 局部 final 變量:聲明時(shí)或使用前賦值即可;
- 成員 final 變量:必須在聲明時(shí)、構(gòu)造方法、初始化塊中賦值(三者選其一),且只能賦值一次。
- 命名規(guī)范:final 常量(通常配合 static)全大寫,下劃線分隔(如
PI、MAX_VALUE)。
public class FinalDemo {
// 1. 成員final變量:聲明時(shí)直接賦值(推薦)
private final String NAME = "張三";
// 2. 成員final變量:構(gòu)造方法中賦值
private final int AGE;
// 3. static final常量(類級(jí)常量,最常用)
public static final double PI = 3.1415926;
public FinalDemo(int age) {
this.AGE = age; // 構(gòu)造方法中初始化final變量
}
public static void main(String[] args) {
FinalDemo demo = new FinalDemo(18);
// 錯(cuò)誤:final變量不可修改
// demo.NAME = "李四";
// demo.AGE = 20;
// 引用類型final變量:引用不可變,但對(duì)象內(nèi)容可變
final StringBuilder sb = new StringBuilder("hello");
sb.append(" world"); // 合法:修改對(duì)象內(nèi)容
System.out.println(sb); // 輸出:hello world
// 錯(cuò)誤:引用不可變
// sb = new StringBuilder("new");
// static final常量:類名訪問,不可修改
System.out.println(FinalDemo.PI); // 輸出:3.1415926
}
}
(2)final 方法
- 不能被子類重寫(override),保證方法的邏輯穩(wěn)定(如父類的核心業(yè)務(wù)邏輯不允許子類修改)。
public class Parent {
// final方法:子類不能重寫
public final void sayHello() {
System.out.println("Hello from Parent");
}
}
public class Child extends Parent {
// 錯(cuò)誤:無法重寫final方法
// @Override
// public void sayHello() {
// System.out.println("Hello from Child");
// }
public static void main(String[] args) {
Child child = new Child();
child.sayHello(); // 輸出:Hello from Parent
}
}
(3)final 類
- 不能被繼承(extend),保證類的完整性(如 Java 核心類
String、Math、Integer都是 final 類,避免被篡改)。
// final類:不能被繼承
public final class FinalClass {
public void print() {
System.out.println("這是final類的方法");
}
}
// 錯(cuò)誤:無法繼承final類
// public class SubClass extends FinalClass {
// }
三、static final 組合使用(最常用)
static final修飾的變量是類級(jí)常量,具備兩大特性:
static:屬于類,內(nèi)存中只有 1 份,類加載時(shí)初始化;final:一旦賦值,不可修改。
- 典型場(chǎng)景:定義系統(tǒng)常量(如
Math.PI、Integer.MAX_VALUE)。
public class Constants {
// 數(shù)據(jù)庫連接常量
public static final String DB_URL = "jdbc:mysql://localhost:3306/test";
public static final String DB_USER = "root";
public static final String DB_PWD = "123456";
// 工具類:私有化構(gòu)造方法,避免創(chuàng)建實(shí)例
private Constants() {}
}
總結(jié)
- static 核心:屬于類而非實(shí)例,類加載時(shí)初始化,所有實(shí)例共享,可通過類名直接訪問;常用于工具方法、共享變量、靜態(tài)初始化。
- final 核心:“不可變”,修飾變量則值 / 引用不可改,修飾方法則不可重寫,修飾類則不可繼承;常用于定義常量、保護(hù)核心邏輯 / 類結(jié)構(gòu)。
- static final:類級(jí)常量,內(nèi)存唯一且不可修改,是 Java 中定義常量的標(biāo)準(zhǔn)方式。
到此這篇關(guān)于Java中static與final關(guān)鍵字的文章就介紹到這了,更多相關(guān)Java static與final關(guān)鍵字內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 詳解Java編程中static關(guān)鍵字和final關(guān)鍵字的使用
- java 中的static關(guān)鍵字和final關(guān)鍵字的不同之處
- java多線程關(guān)鍵字final和static詳解
- Java中final、static關(guān)鍵字與方法的重寫和繼承易錯(cuò)點(diǎn)整理
- Java中的static和final關(guān)鍵字的使用詳解
- Java關(guān)鍵字final、static使用總結(jié)
- 學(xué)習(xí)Java的static與final關(guān)鍵字
- Java關(guān)鍵字詳解之final static this super的用法
- Java static 與 final關(guān)鍵字實(shí)例詳解
相關(guān)文章
SpringBoot中最常用的5個(gè)內(nèi)置對(duì)象使用方法
這篇文章主要給大家介紹了關(guān)于SpringBoot中最常用的5個(gè)內(nèi)置對(duì)象使用的相關(guān)資料,在學(xué)習(xí)springboot的過程中,發(fā)現(xiàn)了springboot非常多的優(yōu)點(diǎn)和特性,需要的朋友可以參考下2023-08-08
springboot+vue實(shí)現(xiàn)阿里云oss上傳的示例代碼
文件上傳是常用的功能,本文主要介紹了springboot+vue實(shí)現(xiàn)阿里云oss上傳的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-06-06
MyEclipse設(shè)置Console輸出到文件的實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄狹yEclipse設(shè)置Console輸出到文件的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07
調(diào)用java.lang.Runtime.exec的正確姿勢(shì)分享
這篇文章主要介紹了調(diào)用java.lang.Runtime.exec的正確姿勢(shì),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
基于Spring Boot的Logback日志輪轉(zhuǎn)配置詳解
本篇文章主要介紹了基于Spring Boot的Logback日志輪轉(zhuǎn)配置詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10
jstl之map,list訪問遍歷以及el表達(dá)式map取值的實(shí)現(xiàn)
下面小編就為大家?guī)硪黄猨stl之map,list訪問遍歷以及el表達(dá)式map取值的實(shí)現(xiàn)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03

