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:

  1. Classes Internes Regulars
  2. Classes Internes Estàtiques
  3. Classes Locals
  4. Classes Anònimes

  1. 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 interna InnerClass.
  • InnerClass té un mètode display que accedeix al camp outerField de OuterClass.
  • Per crear una instància de InnerClass, primer es crea una instància de OuterClass i després es crea la instància de InnerClass utilitzant outer.new InnerClass().

  1. 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 de OuterClass.
  • StaticInnerClass pot accedir als camps estàtics de OuterClass però no als camps no estàtics.
  • Per crear una instància de StaticInnerClass, no cal una instància de OuterClass.

  1. 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ètode outerMethod.
  • LocalInnerClass només és accessible dins de outerMethod.

  1. 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ètode run é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

Mòdul 2: Flux de Control

Mòdul 3: Programació Orientada a Objectes

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

Mòdul 8: Multithreading i Concurrència

Mòdul 9: Xarxes

Mòdul 10: Temes Avançats

Mòdul 11: Frameworks i Llibreries de Java

Mòdul 12: Construcció d'Aplicacions del Món Real

© Copyright 2024. Tots els drets reservats