Olá Albert!
Como disse o Celso, o problema esta relacionado a você estar utilizando uma Classe Interna, perceba que sua classe Funcionario está dentro da Classe ExercicioTres logo ela é uma Classe Interna. No entanto, creio que cabe um explicação para você entender qual o problema, pois o problema não é a classe interna mas está relacionado com ela.
Veja bem, Classes internas para serem utilizadas necessitam ser Instanciadas a partir de uma Instancia da Classe externa, ou seja, um objeto da classe interna só pode ser criado a partir de um objeto da classe externa.
Logo, para você criar seu objeto Funcionario o correto seria você estanciar da seguinte forma:
Funcionario f1 = new ExercicioTres().new Funcionario();
Caso você faça isso seu código funcionará corretamente sem ter que deixar de usar Classes Internas. Porém sei que você pode estar se perguntando "Porque o erro então acusou o fato de minha classe Funcionario não ser static
?"
É o seguinte, mais para frente no curso você verá sobre a palavra reservada static
, mas adiantando um pouco, você indicar um método como static
significa que esse método se torna um método da Classe, não necessitando de instancias para ser utilizado. Em outras palavras, você por um método como static significa que você não precisará criar um Objeto da classe para utilizar o método que ela possui, simplesmente você pode chamar o método a partir da própria classe e isso também é valido para variáveis que são estáticas.
Um exemplo disso é o System.out.println()
que tanto utilizamos. out
é um nome dado a uma variável estática da classe System, logo veja que você não precisa criar uma instancia da classe System para acessar a variável out, você acessa direto da classe: System.out
.
Mas, outro detalhe sobre métodos estáticos é que ele só pode utilizar variáveis estáticas da própria classe. Pois como eu disse, variáveis estáticas são acessadas diretamente da classe não necessitando de instancia, logo uma variável normal precisa de uma instancia para funcionar e por não termos instancia ao chamar um método estático não é possível utilizar variáveis de instancia.
Assim, é pedido para colocar a palavra static em sua classe interna pois ela é considerada um membro da classe e para utilizar um membro da classe em um método estático é necessário que esse membro seja estático.
Então como disse anteriormente, o problema não é a utilização de classe interna, mas sim um problema relacionado a sua utilização.
Enfim, espero ter ajudado! Bons Estudos!