English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 基礎教程

Java Controllo dei flussi

Java Array

Java Orientamento ad oggetti (I)

Java Orientamento ad oggetti (II)

Java Orientamento ad oggetti (III)

Java 异常处理

Java List

Java Queue (coda)

Java Map collection

Java Set collection

Java Input/Output (I/O)

Java Reader/Writer

Altri argomenti Java

Java 嵌套静态类

In questo tutorial, imparerai le classi statiche annidate con esempi. Imparerai anche la differenza tra classi statiche e interne.

Come descritto nei tutorial precedenti, possiamo avere una classe in un altro oggetto Java. Questo tipo di classe si chiama classe annidata. In Java, ci sono due tipi di classi annidate:

  • Classi non statiche annidate (classi interne)

  • Classi statiche annidate.

Nel tutorial precedente, abbiamo discusso delle classi interne. Se desideri sapere di più sulle classi interne, visitaClasse annidata Java.

In questo tutorial, impareremo le classi statiche annidate.

Classe statica annidata Java

Usiamo la parola chiave static per rendere la nostra classe annidata statica.

Attenzione:In Java, è permesso che le classi annidate siano statiche.

Come le classi convenzionali, le classi annidate statiche possono contenere contemporaneamente campi e metodi statici e non statici. Ad esempio:

Class Animal {
   static class Mammal {
      // Membri statici e membri statici della classe Mammal
   }
   // Membri della classe Animal
}

La classe annidata statica è associata alla classe esterna.

Per accedere alle classi annidate statiche, non è necessario un oggetto dell'oggetto della classe esterna.

Esempio: classe annidata statica

class Animal {
  // Classi interne
   class Reptile {
      public void displayInfo() {
        System.out.println("Io sono un rettile.");
      }
   }
  // Classi statiche
   static class Mammal {
      public void displayInfo() {
        System.out.println("Io sono un mammifero.");
      }
   }
}
class Main {
   public static void main(String[] args) {
      // Creazione di oggetti della classe esterna
      Animal animal = new Animal();
      // Creazione di oggetti di classi non statiche
      Animal.Reptile reptile = animal.new Reptile();
      reptile.displayInfo();
      // Creazione di oggetti di classi annidate statiche
      Animal.Mammal mammal = new Animal.Mammal();
      mammal.displayInfo();
   }
}

Risultato di output

Io sono un rettile.
Io sono un mammifero.

Nel programma sopra, abbiamo due classi annidate Mammal e Reptile nella classe Animal.

Per creare un oggetto della classe non statica Reptile, abbiamo utilizzato

Animal.Reptile reptile = animal.new Reptile()

Per creare un oggetto della classe statica Mammal, abbiamo utilizzato

Animal.Mammal mammal = new Animal.Mammal()

Accesso ai membri della classe esterna

In Java, le classi annidate statiche sono collegate alla classe esterna. Ecco perché le classi annidate statiche possono accedere solo ai membri della classe esterna (campi statici e metodi).

Vediamo cosa accade se proviamo ad accedere ai campi e ai metodi non statici di una classe esterna.

Esempio: accesso a membri non statici

class Animal {
  static class Mammal {
   public void displayInfo() {
     System.out.println("Io sono un mammifero.");
   }
 }
 class Reptile {
   public void displayInfo() {
     System.out.println("Io sono un rettile.");
   }
 }
 public void eat() {
   System.out.println("Io mangio cibo.");
 }
}
class Main {
 public static void main(String[] args) {
   Animal animal = new Animal();
   Animal.Reptile reptile = animal.new Reptile();
   reptile.displayInfo();
   Animal.Mammal mammal = new Animal.Mammal();
   mammal.displayInfo();
   mammal.eat();
 }
}

Risultato di output

Main.java:28: errore: simbolo non trovato
    mammal.eat();
          ^
  simbolo: metodo eat()
  location: variabile mammal di tipo Mammal
1 errore
stato di uscita del compilatore 1

Nell'esempio sopra, abbiamo creato un metodo non statico eat() nella classe Animal.

Ora, se proviamo ad accedere al metodo eat() utilizzando l'oggetto mammal, il compilatore mostrerà un errore.
Questo è perché mammal è un oggetto di classe statica, quindi non possiamo accedere ai metodi non statici da una classe statica.

Classe di livello superiore statica

Come sopra menzionato, solo le classi annidate possono essere statiche. Non possiamo avere classi di livello superiore statiche.

Vediamo cosa succede se proviamo a rendere statica una classe di livello superiore.

static class Animal {
 public static void displayInfo() {
   System.out.println("Sono un animale");
 }
}
class Main {
 public static void main(String[] args) {
   Animal.displayInfo();
 }
}

Risultato di output

Main.java:1: errore: il modificatore static non è permesso qui
static class Animal {
       ^
1 errore
stato di uscita del compilatore 1

Nell'esempio sopra, abbiamo tentato di creare una classe statica Animal. Poiché Java non consente l'uso di classi top-level statiche, si verificherà un errore.