Kelas Setempat dan Tanpa Nama
Isytiharkan kelas dalam kaedah dan cipta pelaksanaan tanpa nama bagi antara muka secara terus.
Kelas Setempat dan Tanpa Nama 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.
Kelas Setempat dan Tanpa Nama
Kelas setempat ditakrifkan di dalam kaedah. Kelas tanpa nama ialah kelas setempat tanpa nama — kedua-duanya menggabungkan pengisytiharan kelas dengan penciptaan instans. Kedua-duanya menangkap pemboleh ubah setempat yang secara efektif muktamad.
Pengisytiharan Kelas Setempat
Kelas setempat diisytiharkan di dalam badan kaedah. Kelas ini boleh mengakses ahli kelas yang melingkunginya serta pemboleh ubah setempat yang secara efektif muktamad.
static void greet(String language) {
// Local class — defined inside the method
class Greeter {
String sayHello(String name) {
// Can access 'language' — it is effectively final
return switch (language) {
case "EN" -> "Hello, " + name;
case "ES" -> "Hola, " + name;
case "FR" -> "Bonjour, " + name;
default -> "Hi, " + name;
};
}
}
Greeter g = new Greeter();
System.out.println(g.sayHello("Alice"));
}
greet("ES"); // Hola, AlicePemboleh Ubah yang Secara Efektif Muktamad
Kelas setempat dan kelas tanpa nama hanya boleh menangkap pemboleh ubah setempat yang secara efektif muktamad — pemboleh ubah tersebut tidak pernah diberikan nilai baharu selepas pemulaan.
void process(int threshold) {
// threshold is effectively final (never reassigned)
Runnable r = new Runnable() {
public void run() {
System.out.println("Threshold: " + threshold);
}
};
r.run();
// threshold = 10; // If you add this, the anonymous class won't compile
}Asas Kelas Tanpa Nama
Kelas tanpa nama melaksanakan antara muka atau melanjutkan kelas secara sebaris, dalam satu ungkapan.
interface Comparator<T> {
int compare(T a, T b);
}
// Anonymous class implementing Comparator
java.util.Comparator<String> byLength = new java.util.Comparator<String>() {
@Override
public int compare(String a, String b) {
return Integer.compare(a.length(), b.length());
}
};
List<String> words = new ArrayList<>(List.of("banana", "fig", "apple", "kiwi"));
words.sort(byLength);
System.out.println(words); // [fig, kiwi, apple, banana]Kelas Tanpa Nama berbanding Lambda
Bagi antara muka kaedah abstrak tunggal (SAM), lambda menggantikan kelas tanpa nama. Kelas tanpa nama masih diperlukan untuk antara muka yang mempunyai berbilang kaedah atau apabila melanjutkan kelas abstrak.
// Anonymous class for single-method interface
Runnable r1 = new Runnable() {
public void run() { System.out.println("Running!"); }
};
// Lambda — cleaner for SAM interfaces
Runnable r2 = () -> System.out.println("Running!");
// Must use anonymous class for multi-method interface:
java.io.FilenameFilter filter = new java.io.FilenameFilter() {
public boolean accept(java.io.File dir, String name) {
return name.endsWith(".java");
}
}; // FilenameFilter is not a SAM — no lambda shorthandKelas Tanpa Nama dengan Keadaan
Kelas tanpa nama boleh mempunyai medan, tidak seperti lambda. Ini berguna apabila anda perlu mengekalkan keadaan dalam pelaksanaan tanpa nama.
interface Counter { int increment(); int get(); }
Counter counter = new Counter() {
private int count = 0;
public int increment() { return ++count; }
public int get() { return count; }
};
System.out.println(counter.increment()); // 1
System.out.println(counter.increment()); // 2
System.out.println(counter.get()); // 2Corak Listener Tanpa Nama
Sebelum lambda diperkenalkan, kelas tanpa nama merupakan corak piawai untuk listener acara dalam pengaturcaraan GUI dan Android.
// Modern Android/Swing style: anonymous class listener
Button loginButton = new Button(); // hypothetical
loginButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick() {
System.out.println("Login button clicked!");
}
});
// Modern equivalent with lambda (if OnClickListener is SAM):
loginButton.setOnClickListener(() -> System.out.println("Clicked!"));Kelas Setempat untuk Logik Kompleks
Kelas setempat sesuai digunakan apabila anda memerlukan kelas dengan berbilang kaedah di satu tempat sahaja — terlalu kompleks untuk lambda tetapi terlalu khusus untuk kelas aras teratas.
static List<String> processData(List<String> data, String prefix) {
// Local class: complex enough for a class, used only here
class DataProcessor {
List<String> result = new ArrayList<>();
void process(String item) {
// prefix is effectively final
if (item.startsWith(prefix)) {
result.add(item.toUpperCase());
}
}
}
DataProcessor dp = new DataProcessor();
data.forEach(dp::process);
return dp.result;
}
System.out.println(processData(List.of("apple","avocado","banana"), "a"));
// [APPLE, AVOCADO]Kelas Tanpa Nama untuk Kelas Abstrak
Kelas tanpa nama boleh melanjutkan kelas abstrak serta mengatasi kaedah abstrak tanpa mencipta subkelas bernama.
abstract class ReportFormatter {
abstract String formatHeader(String title);
abstract String formatBody(List<String> rows);
String format(String title, List<String> rows) {
return formatHeader(title) + "\n" + formatBody(rows);
}
}
ReportFormatter csvFormatter = new ReportFormatter() {
public String formatHeader(String t) { return "\"" + t + "\""; }
public String formatBody(List<String> rows) {
return String.join("\n", rows);
}
};
System.out.println(csvFormatter.format("Sales", List.of("a,1","b,2")));Anti-Corak Pemulaan Kurungan Berganda
Helah pemulaan kurungan berganda menggunakan kelas tanpa nama untuk memulakan koleksi. Helah ini mencipta subkelas dengan pemula instans. Elakkannya — kaedah ini tidak cekap dan mudah menyebabkan ralat.
// Anti-pattern: double-brace initialization
Map<String, Integer> map = new HashMap<String, Integer>() {{
put("a", 1);
put("b", 2);
}};
// Creates an anonymous HashMap subclass — wasteful!
// GOOD: use Map.of() or Map.ofEntries()
Map<String, Integer> better = Map.of("a", 1, "b", 2);
// Or a mutable map:
Map<String, Integer> mutable = new HashMap<>(Map.of("a", 1, "b", 2));Memilih: Lambda, Kelas Tanpa Nama atau Kelas Setempat
Panduan membuat keputusan:
- Lambda: satu kaedah abstrak, tiada keadaan tambahan dan tiada pewarisan
- Kelas tanpa nama: berbilang kaedah, memerlukan keadaan atau melanjutkan kelas abstrak
- Kelas setempat: perlu digunakan semula dalam kaedah, mempunyai berbilang kaedah atau keadaan kompleks
Semakan Pantas
Apakah yang sentiasa dilakukan oleh kelas tanpa nama dalam satu ungkapan?
Ulang Kaji: Kelas Setempat dan Tanpa Nama
Perkara penting:
- Kelas setempat ditakrifkan di dalam kaedah dan boleh mengakses pemboleh ubah setempat yang secara efektif muktamad
- Kelas tanpa nama menggabungkan pengisytiharan kelas dengan penciptaan instans dalam satu ungkapan
- Kelas tanpa nama boleh mempunyai medan dan berbilang kaedah — tidak seperti lambda
- Lambda menggantikan kelas tanpa nama untuk antara muka kaedah abstrak tunggal
- Gunakan kelas setempat apabila logiknya cukup kompleks untuk memerlukan kelas tetapi khusus kepada satu kaedah
- Elakkan pemulaan kurungan berganda — kaedah ini mencipta subkelas tanpa nama yang tidak diperlukan
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 “Kelas Setempat dan Tanpa Nama” percuma?
Ya — teks penuh “Kelas Setempat dan Tanpa Nama” 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 “Kelas Setempat dan Tanpa Nama”?
Isytiharkan kelas dalam kaedah dan cipta pelaksanaan tanpa nama bagi antara muka secara terus. 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 “Kelas Setempat dan Tanpa Nama” 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
- Kelas Bersarang Statik
- Kelas Dalaman dan Akses Luaran
- Kelas Setempat dan Tanpa Nama
- Memilih Strategi Pembenaman yang Sesuai