Les classes internes són classes definides dins d'una altra classe. Aquestes classes poden accedir als membres de la classe externa, incloent-hi els membres privats. Les classes internes són útils per agrupar lògica que només té sentit dins del context de la classe externa i per augmentar l'encapsulació.
Tipus de Classes Internes
Hi ha quatre tipus principals de classes internes en Java:
- Classes Internes Regulars
- Classes Internes Estàtiques
- Classes Locals
- Classes Anònimes
- Classes Internes Regulars
Les classes internes regulars són definides dins d'una altra classe i poden accedir a tots els membres de la classe externa.
Exemple:
public class OuterClass { private String outerField = "Outer field"; class InnerClass { void display() { System.out.println("Outer field is: " + outerField); } } public static void main(String[] args) { OuterClass outer = new OuterClass(); OuterClass.InnerClass inner = outer.new InnerClass(); inner.display(); } }
Explicació:
OuterClass
conté una classe internaInnerClass
.InnerClass
té un mètodedisplay
que accedeix al campouterField
deOuterClass
.- Per crear una instància de
InnerClass
, primer es crea una instància deOuterClass
i després es crea la instància deInnerClass
utilitzantouter.new InnerClass()
.
- Classes Internes Estàtiques
Les classes internes estàtiques són definides amb la paraula clau static
i no poden accedir directament als membres de la classe externa.
Exemple:
public class OuterClass { private static String staticOuterField = "Static outer field"; static class StaticInnerClass { void display() { System.out.println("Static outer field is: " + staticOuterField); } } public static void main(String[] args) { OuterClass.StaticInnerClass inner = new OuterClass.StaticInnerClass(); inner.display(); } }
Explicació:
StaticInnerClass
és una classe interna estàtica dins deOuterClass
.StaticInnerClass
pot accedir als camps estàtics deOuterClass
però no als camps no estàtics.- Per crear una instància de
StaticInnerClass
, no cal una instància deOuterClass
.
- Classes Locals
Les classes locals són definides dins d'un mètode i només són accessibles dins d'aquest mètode.
Exemple:
public class OuterClass { void outerMethod() { class LocalInnerClass { void display() { System.out.println("Inside local inner class"); } } LocalInnerClass localInner = new LocalInnerClass(); localInner.display(); } public static void main(String[] args) { OuterClass outer = new OuterClass(); outer.outerMethod(); } }
Explicació:
LocalInnerClass
és definida dins del mètodeouterMethod
.LocalInnerClass
només és accessible dins deouterMethod
.
- Classes Anònimes
Les classes anònimes són classes sense nom que s'utilitzen per crear una única instància d'un objecte amb una implementació específica.
Exemple:
public class OuterClass { void outerMethod() { Runnable runnable = new Runnable() { @Override public void run() { System.out.println("Inside anonymous inner class"); } }; Thread thread = new Thread(runnable); thread.start(); } public static void main(String[] args) { OuterClass outer = new OuterClass(); outer.outerMethod(); } }
Explicació:
- Una classe anònima és creada per implementar la interfície
Runnable
. - La classe anònima és passada al constructor de
Thread
i el mètoderun
és executat quan el fil és iniciat.
Exercicis Pràctics
Exercici 1
Crea una classe externa Library
amb una classe interna Book
. La classe Book
ha de tenir un mètode displayBookInfo
que imprimeixi el títol i l'autor del llibre.
Solució:
public class Library { private String libraryName = "City Library"; class Book { private String title; private String author; Book(String title, String author) { this.title = title; this.author = author; } void displayBookInfo() { System.out.println("Library: " + libraryName); System.out.println("Title: " + title); System.out.println("Author: " + author); } } public static void main(String[] args) { Library library = new Library(); Library.Book book = library.new Book("1984", "George Orwell"); book.displayBookInfo(); } }
Exercici 2
Crea una classe externa University
amb una classe interna estàtica Department
. La classe Department
ha de tenir un mètode displayDepartmentInfo
que imprimeixi el nom del departament.
Solució:
public class University { private static String universityName = "Global University"; static class Department { private String departmentName; Department(String departmentName) { this.departmentName = departmentName; } void displayDepartmentInfo() { System.out.println("University: " + universityName); System.out.println("Department: " + departmentName); } } public static void main(String[] args) { University.Department department = new University.Department("Computer Science"); department.displayDepartmentInfo(); } }
Conclusió
Les classes internes són una eina poderosa en Java que permeten agrupar lògica relacionada dins d'una classe externa. Això pot millorar l'encapsulació i la llegibilitat del codi. Hem vist diferents tipus de classes internes i com utilitzar-les amb exemples pràctics. Practicar amb aquests exemples i exercicis t'ajudarà a comprendre millor com i quan utilitzar classes internes en els teus projectes de Java.
Curs de Programació en Java
Mòdul 1: Introducció a Java
- Introducció a Java
- Configuració de l'Entorn de Desenvolupament
- Sintaxi i Estructura Bàsica
- Variables i Tipus de Dades
- Operadors
Mòdul 2: Flux de Control
Mòdul 3: Programació Orientada a Objectes
- Introducció a la POO
- Classes i Objectes
- Mètodes
- Constructors
- Herència
- Polimorfisme
- Encapsulació
- Abstracció
Mòdul 4: Programació Orientada a Objectes Avançada
Mòdul 5: Estructures de Dades i Col·leccions
Mòdul 6: Gestió d'Excepcions
Mòdul 7: Entrada/Sortida de Fitxers
- Lectura de Fitxers
- Escriptura de Fitxers
- Fluxos de Fitxers
- BufferedReader i BufferedWriter
- Serialització
Mòdul 8: Multithreading i Concurrència
- Introducció al Multithreading
- Creació de Fils
- Cicle de Vida dels Fils
- Sincronització
- Utilitats de Concurrència
Mòdul 9: Xarxes
- Introducció a les Xarxes
- Sockets
- ServerSocket
- DatagramSocket i DatagramPacket
- URL i HttpURLConnection