CodeGym /Blogue Java /Random-PT /Classes aninhadas estáticas
John Squirrels
Nível 41
San Francisco

Classes aninhadas estáticas

Publicado no grupo Random-PT
Oi! Continuamos a explorar o tópico de classes aninhadas em Java. No último exercício, falamos sobre classes aninhadas não estáticas, também conhecidas como classes internas. Classes aninhadas estáticas - 1Hoje passamos para outro grupo de classes. Consideraremos classes aninhadas estáticas. Classes aninhadas estáticas - 3Como eles são diferentes de outras classes? Ao declarar esse tipo de classe, usamos a palavra-chave static, com a qual você já está familiarizado:

public class Boeing737 {

   private int manufactureYear;
   private static int maxPassengersCount = 300;

   public Boeing737(int manufactureYear) {
       this.manufactureYear = manufactureYear;
   }

   public int getManufactureYear() {
       return manufactureYear;
   }

   public static class Drawing {
      
       public static int getMaxPassengersCount() {
          
           return maxPassengersCount;
       }
   }
}
Classes aninhadas estáticas - 4Neste exemplo, temos a Boeing737classe externa, que representa um avião deste tipo. Possui um construtor com um parâmetro: o ano de fabricação ( int manufactureYear). Há também uma variável estática: o número máximo de passageiros ( int maxPassengersCount). Terá o mesmo valor para todos os planos do mesmo modelo, então só precisamos de uma instância. Além disso, ele possui uma classe aninhada estática: Drawing(representando os projetos de engenharia do avião). Usamos essa classe para encapsular todas as informações oficiais sobre a aeronave. Em nosso exemplo, para simplificar, limitamos essa classe ao ano de fabricação, mas ela pode conter muitas outras informações. Classes aninhadas estáticas - 5Como dissemos na última lição, criar uma classe aninhada melhora o encapsulamento e contribui para uma abstração mais realista. Qual é a diferença entre classes aninhadas estáticas e não estáticas? 1. Um objeto da Drawingclasse estática não armazena uma referência a uma instância específica da classe externa. Lembre-se do exemplo da bicicleta da última lição:

public class Bicycle {

   private String model;
   private int maxWeight;

   public Bicycle(String model, int maxWeight) {
       this.model = model;
       this.maxWeight = maxWeight;
   }
  
   public void start() {
       System.out.println("Let's go!");
   }

   public class Handlebar {

       public void right() {
           System.out.println("Steer right!");
       }

       public void left() {

           System.out.println("Steer left!");
       }
   }

}
Naquela aula, falamos sobre o fato de que cada instância da Handlebarclasse interna, imperceptivelmente para nós, passa uma referência para a instância da Bicycleclasse externa. Sem uma instância da classe externa, um objeto da classe interna simplesmente não poderia existir. Para classes aninhadas estáticas, esse não é o caso. Um objeto de uma classe aninhada estática é totalmente capaz de existir por conta própria. Nesse sentido, as classes estáticas são mais "independentes" do que as não estáticas. A única coisa que você precisa saber é que, ao criar tal objeto, você deve especificar o nome da classe externa:

public class Main {

   public static void main(String[] args) {

       Boeing737.Drawing drawing1 = new Boeing737.Drawing();
       Boeing737.Drawing drawing2 = new Boeing737.Drawing();
   }
}
Por que tornamos a Drawingclasse estática quando na última lição fizemos oSeatclasse (representando o assento da bicicleta) não estático? Como da última vez, vamos adicionar um pouco de "filosofia" para entender o exemplo :) Ao contrário de um assento de bicicleta, o conceito de desenho de engenharia não está rigidamente vinculado ao conceito de aeronave. Sem uma bicicleta, um objeto de assento de bicicleta separado na maioria das vezes não teria sentido (embora nem sempre, falamos sobre isso na última lição). O conceito de desenho de engenharia faz sentido por si só. Por exemplo, pode ser útil para engenheiros que planejam a manutenção de aviões. O avião não é necessário para fazer o plano e pode ser localizado em qualquer lugar. Apenas o desenho de engenharia é necessário. Além disso, todas as aeronaves do mesmo modelo terão o mesmo desenho do engenheiro, portanto, não existe uma relação tão estreita quanto existe com um assento de bicicleta. Portanto, umDrawingobjeto não precisa de uma referência a um objeto de avião específico. 2. Diferentes acessos às variáveis ​​e métodos da classe externa. Uma classe aninhada estática só pode acessar os campos estáticos de uma classe externa. Em nosso exemplo, a Drawingclasse possui um getMaxPassengersCount()método que retorna o valor da maxPassengersCountvariável estática da classe externa. No entanto, não podemos criar um getManufactureYear()método na Drawingclasse para retornar o valor de manufactureYear. Afinal, a manufactureYearvariável não é estática, o que significa que deve pertencer a uma instância específica de Boeing737. E como já descobrimos, no caso de classes aninhadas estáticas, o objeto da classe externa pode facilmente estar ausente. Portanto, a limitação :) Não importa qual modificador de acesso uma variável estática possui na classe externa. Mesmo que sejaprivate, uma classe aninhada estática ainda terá acesso. Todos os itens acima se aplicam não apenas ao acesso a variáveis ​​estáticas, mas também a métodos estáticos. IMPORTANTE! Na declaração de uma classe interna, a staticpalavra-chave não significa que você pode criar apenas um objeto. Não confunda objetos com variáveis. Se estamos falando de variáveis ​​estáticas, então, sim, existe uma única instância de uma variável de classe estática, por exemplo, maxPassangersCount. Mas quando staticé aplicado a uma classe aninhada, significa apenas que seus objetos não contêm referências a objetos da classe externa. E podemos criar quantos objetos quisermos:

public class Boeing737 {

   private int manufactureYear;
   private static int maxPassengersCount = 300;

   public Boeing737(int manufactureYear) {
       this.manufactureYear = manufactureYear;
   }

   public int getManufactureYear() {
       return manufactureYear;
   }

   public static class Drawing {

       private int id;

       public Drawing(int id) {
           this.id = id;
       }

       public static int getPassengersCount() {

           return maxPassengersCount;
       }

       @Override
       public String toString() {
           return "Drawing{" +
                   "id=" + id +
                   '}';
       }

       public static void main(String[] args) {

           for (int i = 1; i < 6; i++) {

               Boeing737.Drawing drawing = new Boeing737.Drawing(i);
               System.out.println(drawing);
           }
       }
   }
}
Declaramos o main()método diretamente na classe aninhada (não há nenhuma razão especial para isso — apenas para que você saiba que isso é possível) e criamos 5 Drawingobjetos. Apesar do fato de não termos um único objeto da classe externa. Como você pode ver, isso não criou nenhum problema :) Saída do console:

Drawing{id=1} 
Drawing{id=2} 
Drawing{id=3} 
Drawing{id=4} 
Drawing{id=5}
E isso conclui nossa lição! Por precaução, deixarei um link para a seção sobre eles na documentação do Oracle . Se algo ainda não estiver claro, leia. Agora é hora de eu resolver algumas tarefas! :)
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION