English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Neste tutorial, você aprenderá sobre classes estáticas aninhadas com exemplos. Você também aprenderá a diferença entre classes estáticas e classes internas.
Como mencionado nos tutoriais anteriores, podemos ter uma classe dentro de outra classe no Java. Essa classe é chamada de classe aninhada. No Java, existem dois tipos de classes aninhadas:
Classe não estática aninhada (classe interna)
classes estáticas aninhadas.
No tutorial anterior, já discutimos sobre classes internas. Se você quiser saber sobre classes internas, acesseClasse aninhada do Java.
Neste tutorial, vamos aprender sobre classes estáticas aninhadas.
Usamos a palavra-chave static para tornar nossa classe aninhada estática.
Atenção:No Java, é permitido que classes aninhadas sejam estáticas.
Como classes convencionais, classes aninhadas podem conter tanto campos estáticos quanto não estáticos e métodos. Por exemplo,
Classe Animal { static class Mammal { // Membros estáticos e estáticos da classe Mammal } // Membros da classe Animal }
As classes aninhadas estáticas estão associadas à classe externa.
Para acessar classes aninhadas estáticas, não precisamos de um objeto da classe externa.
class Animal { //Classe interna class Reptile { public void displayInfo() { System.out.println("Eu sou um réptil."); } } //Classe estática static class Mammal { public void displayInfo() { System.out.println("Eu sou um mamífero."); } } } class Main { public static void main(String[] args) { //Criação de objetos da classe externa Animal animal = new Animal(); //Criação de objetos de classes não estáticas Animal.Reptile reptile = animal.new Reptile(); reptile.displayInfo(); //Criação de objetos de classes aninhadas estáticas Animal.Mammal mammal = new Animal.Mammal(); mammal.displayInfo(); } }
Resultados de saída
Eu sou um réptil. Eu sou um mamífero.
No programa acima, temos duas classes aninhadas Mammal e Reptile dentro da classe Animal.
Para criar um objeto da classe não estática Reptile, usamos
Animal.Reptile reptile = animal.new Reptile()
Para criar um objeto da classe estática Mammal, usamos
Animal.Mammal mammal = new Animal.Mammal()
No Java, as classes aninhadas estáticas estão associadas à classe externa. É por isso que as classes aninhadas estáticas só podem acessar os membros da classe externa (campos e métodos estáticos).
Vamos ver o que acontece se tentarmos acessar os campos e métodos de uma classe externa.
class Animal { static class Mammal { public void displayInfo() { System.out.println("Eu sou um mamífero."); } } class Reptile { public void displayInfo() { System.out.println("Eu sou um réptil."); } } public void eat() { System.out.println("Eu como comida."); } } 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(); } }
Resultados de saída
Main.java:28: erro: símbolo não encontrado mammal.eat(); ^ símbolo: método eat() location: variável mammal do tipo Mammal 1 erro estado de saída do compilador 1
No exemplo acima, criamos um método não estático eat() na classe Animal.
Agora, se tentarmos usar o objeto mammal para acessar eat(), o compilador exibirá um erro.
Isso é porque mammal é um objeto de classe estática, então não podemos acessar métodos não estáticos a partir de uma classe estática.
Como mencionado acima, apenas classes aninhadas podem ser estáticas. Não podemos ter classes top-level estáticas.
Vamos ver o que acontece se tentarmos tornar uma classe top-level estática.
class estática Animal { public static void displayInfo() { System.out.println("Sou um animal"); } } class Main { public static void main(String[] args) { Animal.displayInfo(); } }
Resultados de saída
Main.java:1: erro: modificador estático não permitido aqui class estática Animal { ^ 1 erro estado de saída do compilador 1
No exemplo acima, tentamos criar uma classe estática Animal. Como o Java não permite a utilização de classes top-level estáticas, ocorrerá um erro.