iT邦幫忙

2026 iThome 鐵人賽

DAY 4
0
JavaScript

大學以前只看過那隻貓?用白話文帶你從 Python 跨進 JavaScript系列 第 4

【Day 4】印卡機上的跑馬燈:看懂 static 共享與 final 焊死鐵則

  • 分享至 

  • xImage
  •  
  1. static 就是「印卡機頂上的總計數器」,不是印在卡片裡的資料

前面我們說過:
Class 是那台製卡機(藍圖)。new 則是機器匡噹一聲,吐出一張實體身分證。

如果你沒加 static(像之前的 name、age):
那是印在每張卡片自己晶片裡的私人資料。小明有小明的名字,小美有小美的年齡,每按一次 new,記憶體就多印一張卡,各自存各自的,誰也管不著誰。

但如果掛上 static:
代表這項資料根本沒有印進卡片裡!它是直接釘在「那台印卡機外殼上的跑馬燈計數器」。

Java
public class Person {
private String name; // 印在卡片裡的私人名字(非 static)
public static int totalCards = 0; // 釘在印卡機外殼上的大看板(static)

public Person(String name) {
    this.name = name;
    totalCards++; // 機器每吐出一張新卡片,機頂上的數字就跳 +1!
}

}
沒加 static(私人資料):
每個人名字不同、年齡不同,所以每按一次 new,記憶體就必須多割出一塊獨立空間給這張新卡片。小明活 20 歲、小美活 18 歲,記憶體必須各自獨立存放,互不干擾。

加了 static(機頂看板):
計數器是記全廠總發卡量,跟任何單一客人無關。所以記憶體不管三七二十一,從頭到尾只開唯一那一格空間給它。每按一次 new,大家就跑去那一格把數字 +1。
因為這個計數器是在機器(Person 類別)」上面,所以你想看總數,當然不是去翻小明的皮夾
(寫 p1.totalCards),而是直接對著機器問:
System.out.println(Person.totalCards); // 機器本體.計數器,直接報出總數!

final 就是你踢到的鐵板,就算你大費周章開了 Setter 管道、試圖在方法裡用等號改寫,Java 編譯器也絕對不准任何人動它一根汗毛。
以數學常數圓周率 pi為例在真實世界裡,圓周率pi永遠是3.1415926535...,宇宙毀滅它都不會變成 4.0。如果你在寫一個數學計算程式,絕對不希望有糊塗工程師中途手滑把它改成別的數字。這時候,就要祭出關鍵字 final(定終身):
public class MathUtils {
// 1. static:全世界共用這一格記憶體
// 2. final:焊死鎖牢,賦值後終身不許反悔!
public static final double PI = 3.141592653589793;
}工程師之間的默契「看到整串大寫,手就放乾淨點,別想寫任何程式碼去動它!」

為什麼 static 裡面不能寫 this?
時間差:先有機器,卡片根本還沒出生
程式一啟動,印卡機(Class)就已經通電就緒,此時根本還沒執行 new,托盤上空無一物。如果機器的公用零件去要「這張卡片(this)」的資料,等同對著空氣要東西,自然會報錯。

對象不明:機器印出萬張卡,無法一對一鎖定
印卡機是大家共用的總機,經手過成千上萬張卡片。當公用方法運作時,根本無從得知你口中的 this 到底是指小明、小美還是誰,完全沒有特定目標可以對齊。

卡片看機器:拿著卡片的小明,隨時可以看印卡機頂上的總發卡量,因為小明既然拿得到卡片,印卡機早就存在了。
機器不能看特定卡片(不知找誰):
印卡機是為所有人服務的公共設施,它身上沒有哪張卡片的專屬晶片,所以不能在 static 裡寫 this!


上一篇
【Day 3】不能看不能改!帶你走一遍 Getter、Setter 的合法辦事處
下一篇
【Day 5】繼承不是複製貼上!看 Teacher 如何共享 Person 的規格並擴充 subjectName
系列文
大學以前只看過那隻貓?用白話文帶你從 Python 跨進 JavaScript8
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言