JavaRush /Blogue Java /Random-PT /Classes aninhadas estáticas

Classes aninhadas estáticas

Publicado no grupo Random-PT
Olá! Continuamos a explorar o tópico de classes aninhadas em Java. Na última lição falamos sobre classes aninhadas não estáticas ou, como também são chamadas, classes internas. Classes aninhadas estáticas - 2Hoje vamos passar para outro grupo e dar uma olhada mais de perto nas classes estáticas aninhadas. Classes aninhadas estáticas - 3Como eles são diferentes de outros grupos? Ao declarar tal classe, usamos a já familiar palavra-chave estática:
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 uma classe externa Boeing737que cria um avião deste modelo. E ele tem um construtor com um parâmetro: o ano de fabricação ( int manufactureYear). Há também uma variável estática int maxPassengersCount- o número máximo de passageiros. Será igual para todas as aeronaves do mesmo modelo, portanto só precisamos de uma cópia. Além disso, possui uma classe interna estática Drawing- planta de avião. Nesta classe podemos encapsular todas as informações de serviço da aeronave. No nosso exemplo, para simplificar, limitamos ao ano de fabricação, mas pode conter muitas outras informações. Classes aninhadas estáticas - 5Conforme discutimos na última aula, a criação de uma classe aninhada aumenta o encapsulamento e promove uma abstração mais realista. Qual é a diferença entre classes aninhadas estáticas e não estáticas? 1. Um objeto de classe estática Drawingnão armazena uma referência a uma instância específica da classe externa. Lembre-se do exemplo da última palestra com uma bicicleta:
public class Bicycle {

   private String model;
   private int mawWeight;

   public Bicycle(String model, int mawWeight) {
       this.model = model;
       this.mawWeight = mawWeight;
   }

   public void start() {
       System.out.println("Go!");
   }

   public class SteeringWheel {

       public void right() {
           System.out.println("Steering wheel to the right!");
       }

       public void left() {

           System.out.println("Steering wheel to the left!");
       }
   }

}
Lá falamos sobre como SteeringWheeluma referência a um objeto da classe externa (bicicleta) é passada para cada instância da classe interna (volante) sem que percebamos Bicycle. Sem um objeto da classe externa, um objeto da classe interna simplesmente não poderia existir. Isso não é verdade para classes aninhadas estáticas. Um objeto de uma classe aninhada estática pode facilmente existir por conta própria. Nesse sentido, as classes estáticas são mais “independentes” do que as classes não estáticas. A única coisa é que ao criar tal objeto você precisa 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 deixamos a aula Drawingestática, mas na última aula a aula Seat(assento de bicicleta) estava não estática? Como da última vez, vamos acrescentar um pouco de “filosofia” para entender o exemplo :) Ao contrário de um assento de bicicleta, a essência do desenho não está tão intimamente ligada à essência do avião. Um objeto de assento separado, sem uma bicicleta, na maioria das vezes não terá sentido (embora nem sempre - falamos sobre isso na última lição). A essência do desenho faz sentido por si só. Por exemplo, pode ser útil para engenheiros que planejam reparos de aeronaves. Eles não precisam do avião para o planejamento e podem ser localizados em qualquer lugar - basta um desenho. Além disso, para todas as aeronaves do mesmo modelo, o desenho ainda será o mesmo, portanto não existe uma conexão rígida como um assento com uma bicicleta. Portanto, o objeto Drawingnão precisa de um link para um objeto específico da aeronave. 2. Diferentes acessos a variáveis ​​e métodos de uma classe externa. Uma classe aninhada estática só pode acessar campos estáticos da classe externa. Em nosso exemplo, a classe Drawingpossui um método getMaxPassengersCount()que retorna o valor de uma variável estática maxPassengersCountde uma classe externa. No entanto, não podemos criar um método getManufactureYear()para Drawingretornar um valor manufactureYear. Afinal, uma variável manufactureYearnão é estática, o que significa que deve pertencer a uma instância específica Boeing737. E como já descobrimos, no caso de classes aninhadas estáticas, o objeto da classe externa pode facilmente estar faltando. Daí a limitação :) Não importa qual modificador de acesso a variável estática na classe externa possui. Mesmo que seja private, ainda haverá acesso de uma classe aninhada estática. Todos os itens acima dizem respeito não apenas ao acesso a variáveis ​​estáticas, mas também a métodos estáticos. IMPORTANTE! A palavra staticem uma declaração de classe interna não significa que apenas um objeto possa ser criado. Não confunda objetos com variáveis. Se estamos falando de variáveis ​​estáticas, sim, uma variável de classe estática, por exemplo, maxPassangersCountexiste em uma única cópia. Mas quando aplicado a uma classe aninhada, staticsignifica 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 método main()diretamente na classe aninhada (não há nenhuma razão específica para isso - apenas para que você saiba que é possível) e criamos 5 objetos Drawing. Apesar de não termos um único objeto de classe externa. Como você pode ver, não houve problemas :) Saída do console:

Drawing{id=1}
Drawing{id=2}
Drawing{id=3}
Drawing{id=4}
Drawing{id=5}
Isso conclui nossa lição! Por precaução, deixarei um link para a seção sobre eles na documentação do Oracle . Leia-o se houver algum ponto pouco claro. Agora é hora de resolver alguns problemas! :)
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION