Java Academy · Pelajaran

Medan Statik dan Pemalar

Gunakan medan statik untuk keadaan dikongsi, pemalar dengan static final dan pemula statik.

Pelajaran 3 daripada 413 langkah

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());       // 3

Pemalar 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")); // 30

Corak 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()); // 1001

Singleton 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()); // 20

Import 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, TimeUnit

Keselamatan 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.5

Medan 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.08

Praktikal: 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
Percuma untuk bermula

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

  1. Peraturan Lebihan Muatan Kaedah
  2. Parameter Varargs
  3. Medan Statik dan Pemalar
  4. Kelas Utiliti dan Kaedah Kilang Statik
← Kembali ke Java Academy