Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Dúvida no Ex. 3 da Aula 3 - Começando com Orientação a objetos

Boa noite. Tenho uma dúvida quanto a instancia da Classe Funcionario. Quando tento instancia a classe Funcionario (Funcionario f1 = new Funcionario();), o compilador apresenta o erro: " error: non-static variable this cannot be referenced from a static context"

Fiquei com dúvida se o códio que criei está correto, pois pelo que entendi a Classe Funcionário só vai ser acessada se estiver com a propriedade 'static'.

Desde já agradeço o apoio, e anexo abaixo o código.


class ExercicioTres { //Classe Funcionário class Funcionario{ String nome; String departamento; double salario; String dataEntradaBanco; String rg;

void recebeAumento(double valor){ this.salario += valor; }

double calculaGanhoAnual(){ return (this.salario* 12); }

void mostra(){ System.out.println("Nome : " + this.nome); System.out.println("Departamento : " + this.departamento); System.out.println("Salário : " + this.salario); System.out.println("Entrada no Banco : " + this.dataEntradaBanco); System.out.println("RG : " + this.rg); } }

//MAIN public static void main (String[] args) {

Funcionario f1 = new Funcionario(); f1.nome = "João"; f1.departamento ="Auditoria"; f1.salario = 1000.0; f1.dataEntradaBanco = "05-10-2015"; f1.rg = "100808090-1"; }

}


4 respostas
solução!

Albert, Bom dia !

pelo que entendi em seu código , a classe funcionário está dentro de outra classe a ExercicioTres , neste caso por isso que está ocorrendo o erro .

tente realizar a seguinte mudança em seu código .

class Funcionario{ 
    String nome; 
    String departamento; 
    double salario;
     String dataEntradaBanco; 
    String rg;

void recebeAumento(double valor){ this.salario += valor; }

double calculaGanhoAnual(){ return (this.salario* 12); }

void mostra(){ System.out.println("Nome : " + this.nome); System.out.println("Departamento : " + this.departamento); System.out.println("Salário : " + this.salario); System.out.println("Entrada no Banco : " + this.dataEntradaBanco); System.out.println("RG : " + this.rg); } }

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

        Funcionario f1 = new Funcionario(); 
        f1.nome = "João";             
        f1.departamento ="Auditoria"; f1.salario = 1000.0; 
        f1.dataEntradaBanco = "05-10-2015"; 
        f1.rg = "100808090-1"; }

}

Espero ter ajudado , Bons estudos

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!

Desde já agradeço muito as respostas. Agora consigo entender o erro que esta cometendo e como utilizar o Static de forma correta.

Que bom Albert! Peço apenas que feche o tópico e marque uma resposta como solução. Bons Estudos!