Duvida sobre uso do static ao declarar classes

public class Main {
    public static void main(String[] args) {

        Cachorro cachorro01= new Cachorro("Spike", "Buldog");

        Cachorro cachorro02 = new Cachorro("Scoob doo", "Dogue alemao");

        ArrayList<Animal> animais = new ArrayList<>();

        System.out.println(animais);

        // fazendo casting de casting de cachorro para animal
        Cachorro cao = new Cachorro();
        Animal animal = cao;

        System.out.println(cao);
        System.out.println(animal);
    }

     class Animal{
        String nome;

        public Animal(){

        }

        public Animal(String nome) {
            this.nome = nome;
        }

        public void fazerBarulho(){

        }

        @Override
        public String toString() {
            return "Nome: " + nome;
        }
    }
     class Cachorro extends Animal{
        String raca;

        public Cachorro(){
            super();

        }

        public Cachorro(String nome, String raca) {
            super(nome);
            this.raca = raca;
        }

        @Override
        public String toString() {
            return super.toString()+ " raca: "+raca;
        }

        @Override
        public void fazerBarulho() {
            System.out.println("Latindo");

        }
        public void cacar(){
            System.out.println("Modo cacador ativado");
        }
    }
}

Boa noite queria entender o porque de ao criar uma classe dentro da classe Main como eu criei a classe Animal e posteriomente eu criei a classe cachorro herdadando de cachorro porem tive que colocar a classe as classes recem criadas com static pois nao compilavam,

Existem casos em que faz sentido criar uma classe dentro da outra (também chamado de inner class ou nested class).

Para entender melhor, sugiro ler este tutorial, mas pra resumir, alguns usos comuns são: uma classe que só é usada em um único lugar específico, ou uma classe que precisa acessar campos privados da outra, etc. Tem também outros exemplos aqui.

No seu caso, como as classes são usadas dentro do main e sem uma instância da classe Main, elas precisam ser estáticas. Caso não fossem, só seria possível criá-las a partir de uma instância da classe externa, que no caso é Main (no tutorial citado acima explica isso).

Dito isso, no seu caso não vejo motivo nenhum pra usar inner class. Simplesmente declare cada classe em seu próprio arquivo .java e use-as no main.

3 curtidas

Eu tinha declarado cada classe em seu próprio .java, isso era para resolver alguns exercícios, para ficar mais pratico, ai me deparei com essa situação.