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ó:
OuterClassconté una classe internaInnerClass.InnerClassté un mètodedisplayque accedeix al campouterFielddeOuterClass.- Per crear una instància de
InnerClass, primer es crea una instància deOuterClassi després es crea la instància deInnerClassutilitzantouter.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.StaticInnerClasspot accedir als camps estàtics deOuterClassperò 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.LocalInnerClassnomé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
Threadi 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
