Medan Statik dan Pemalar
Gunakan medan statik untuk keadaan dikongsi, pemalar dengan static final dan pemula statik.
Medan Statik dan Pemalar ialah pelajaran Java Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Java Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Java Academy merangkumi sejumlah 4 pelajaran.
Medan Statik dan Pemalar
Medan statik dimiliki oleh kelas, bukan oleh instans. Medan ini dikongsi oleh semua objek bagi kelas tersebut. Pemalar menggabungkan static dan final untuk menghasilkan nilai tidak berubah pada peringkat kelas.
Medan Statik berbanding Medan Instans
Medan instans mempunyai salinan berasingan bagi setiap objek. Medan statik mempunyai satu salinan yang dikongsi oleh semua objek bagi kelas tersebut.
class Counter {
private static int totalCount = 0; // shared across all instances
private int instanceId; // unique per instance
Counter() {
totalCount++;
instanceId = totalCount;
}
static int getTotalCount() { return totalCount; }
int getInstanceId() { return instanceId; }
}
Counter c1 = new Counter();
Counter c2 = new Counter();
Counter c3 = new Counter();
System.out.println(Counter.getTotalCount()); // 3
System.out.println(c1.getInstanceId()); // 1
System.out.println(c3.getInstanceId()); // 3Pemalar dengan static final
Isytiharkan pemalar sebagai public static final. Mengikut konvensyen, pemalar menggunakan SCREAMING_SNAKE_CASE.
class MathConstants {
public static final double PI = 3.141592653589793;
public static final double E = 2.718281828459045;
public static final double GOLDEN = 1.618033988749895;
public static final int PRIMES[] = {2, 3, 5, 7, 11, 13};
}
// Access without an instance
System.out.println(MathConstants.PI);
// Constants on domain classes
class HttpStatus {
public static final int OK = 200;
public static final int NOT_FOUND = 404;
public static final int SERVER_ERR = 500;
}Blok Pemula Statik
Apabila pemalar memerlukan pemulaan yang kompleks, gunakan blok pemula statik yang dijalankan sekali apabila kelas dimuatkan.
import java.util.*;
class Config {
public static final Map<String, String> DEFAULTS;
static {
Map<String, String> map = new HashMap<>();
map.put("timeout", "30");
map.put("maxRetry", "3");
map.put("logLevel", "INFO");
DEFAULTS = Collections.unmodifiableMap(map);
}
}
System.out.println(Config.DEFAULTS.get("timeout")); // 30Corak Pembilang Statik
Medan statik biasanya digunakan untuk penjanaan ID, pengiraan metrik atau simpanan sementara yang dikongsi.
import java.util.concurrent.atomic.AtomicLong;
class Order {
private static final AtomicLong ID_SEQUENCE = new AtomicLong(1000);
private final long id;
private final String item;
Order(String item) {
this.id = ID_SEQUENCE.getAndIncrement();
this.item = item;
}
long getId() { return id; }
String getItem() { return item; }
}
Order o1 = new Order("Laptop");
Order o2 = new Order("Mouse");
System.out.println(o1.getId()); // 1000
System.out.println(o2.getId()); // 1001Singleton melalui Medan Statik
Medan statik menyimpan satu-satunya instans dalam Singleton. Gunakan pemulaan malas untuk kelas yang mungkin tidak sentiasa diperlukan.
class DatabasePool {
private static volatile DatabasePool instance;
private final int maxConnections;
private DatabasePool() { this.maxConnections = 20; }
public static DatabasePool getInstance() {
if (instance == null) {
synchronized (DatabasePool.class) {
if (instance == null)
instance = new DatabasePool();
}
}
return instance;
}
public int getMaxConnections() { return maxConnections; }
}
System.out.println(DatabasePool.getInstance().getMaxConnections()); // 20Import Statik
import static membolehkan Anda menggunakan ahli statik tanpa awalan nama kelas — berguna untuk pemalar dan kaedah utiliti.
import static java.lang.Math.PI;
import static java.lang.Math.sqrt;
import static java.lang.Math.pow;
// Without import static: Math.PI * Math.pow(r, 2)
double radius = 5.0;
double area = PI * pow(radius, 2);
System.out.printf("Area: %.2f%n", area); // 78.54
// Caution: overuse of static imports hurts readability
// Acceptable for: Math.*, Assert.* in tests, TimeUnitKeselamatan Benang bagi Medan Statik
Medan statik yang dikongsi merentas benang memerlukan penyegerakan atau jenis atomik bagi mengelakkan keadaan perlumbaan.
import java.util.concurrent.atomic.*;
class RequestMetrics {
private static final AtomicLong requestCount = new AtomicLong(0);
private static final AtomicLong totalLatencyMs = new AtomicLong(0);
public static void record(long latencyMs) {
requestCount.incrementAndGet();
totalLatencyMs.addAndGet(latencyMs);
}
public static double averageLatency() {
long count = requestCount.get();
return count == 0 ? 0 : (double) totalLatencyMs.get() / count;
}
}
RequestMetrics.record(45);
RequestMetrics.record(120);
System.out.println(RequestMetrics.averageLatency()); // 82.5Medan Statik Boleh Ubah: Perangkap
Medan statik boleh ubah adalah berbahaya: keadaan global boleh ubah sukar diuji, tidak selamat untuk benang tanpa pengendalian yang teliti dan mewujudkan gandingan tersembunyi antara kelas.
// BAD: mutable static state
class GlobalConfig {
public static String environment = "dev"; // mutable global!
}
// Any code anywhere can change GlobalConfig.environment
// Very hard to test, unexpected interactions
// BETTER: immutable constant
class GlobalConfig2 {
public static final String ENVIRONMENT =
System.getenv().getOrDefault("APP_ENV", "dev");
}
// BEST: inject via constructor (dependency injection)
class Service {
private final String environment;
Service(String environment) { this.environment = environment; }
}Anti-corak Antara Muka Pemalar
Menggunakan antara muka untuk menyimpan pemalar (anti-corak "Antara Muka Pemalar") tidak digalakkan. Sebaliknya, gunakan kelas dengan pembina private.
// BAD: constant interface — pollutes the namespace of implementing classes
interface FinancialConstants {
double TAX_RATE = 0.08; // implicitly public static final
}
// GOOD: utility class for constants
final class FinancialConstants2 {
private FinancialConstants2() {} // prevent instantiation
public static final double TAX_RATE = 0.08;
public static final double VAT_RATE = 0.20;
public static final int MAX_ITEMS = 100;
}
System.out.println(FinancialConstants2.TAX_RATE); // 0.08Praktikal: Bendera Ciri melalui Pemalar
Menggunakan pemalar boolean static final untuk bendera ciri pada masa kompilasi — penyusun JIT menghapuskan cabang yang tidak diperlukan.
class Features {
public static final boolean ENABLE_ANALYTICS = true;
public static final boolean ENABLE_AI_SEARCH = false;
public static final boolean DEBUG_MODE =
"true".equals(System.getenv("DEBUG"));
}
// The JIT eliminates this if-block when ENABLE_AI_SEARCH is false:
if (Features.ENABLE_AI_SEARCH) {
System.out.println("Running AI search...");
}
if (Features.DEBUG_MODE) {
System.out.println("[DEBUG] Request received");
}Semakan Pantas
Apakah perbezaan antara medan statik dengan medan instans?
Ringkasan: Medan Statik dan Pemalar
Perkara utama:
- Medan statik dimiliki oleh kelas — satu salinan yang dikongsi oleh semua instans
- Pemalar: public static final UPPER_SNAKE_CASE
- Gunakan blok pemula statik untuk pemalar yang memerlukan pemulaan kompleks
- Utamakan AtomicLong/AtomicInteger untuk medan statik boleh ubah dalam kod serentak
- Elakkan medan statik boleh ubah — medan ini mewujudkan keadaan global tersembunyi yang sukar diuji
- Gunakan kelas yang tidak boleh diinstanskan (pembina private) untuk pemalar dan bukannya antara muka
Pelajari Java dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 104
- Pelajaran
- 374
Soalan Lazim
Adakah pelajaran “Medan Statik dan Pemalar” percuma?
Ya — teks penuh “Medan Statik dan Pemalar” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Java Academy, tingkat taraf kepada CoddyKit PRO. Kursus Java Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Medan Statik dan Pemalar”?
Gunakan medan statik untuk keadaan dikongsi, pemalar dengan static final dan pemula statik. Anda berlatih Java Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Java Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Java Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.
Berapa lamakah pelajaran “Medan Statik dan Pemalar” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Java Academy ini?
Ya. Setiap pelajaran Java Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Peraturan Lebihan Muatan Kaedah
- Parameter Varargs
- Medan Statik dan Pemalar
- Kelas Utiliti dan Kaedah Kilang Statik