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

Dúvida no Ex. 4 da Aula 2 - Herança, reescrita e polimorfismo

Meu código se chama Conta.java e não estou conseguindo superar os seguintes erros de compilação:

  • non- static variable this connot be referenced from a static context

  • illegal static declaration in inner class conta.TestaContas

    public static void main (String[]args) {

modifier "static" is only allowed in constant variable declarations.

Vi uma dúvida muito similar no fórum, mas o conteúdo dela não resolveu meu problema. Eu deixei apenas a classe Conta como public enquanto que a classe TestaContas não. Também tentei compilar a classe TestaContas separadamente, mas tb não funciona, segue meu código:

public class Conta {
      protected double saldo;


 public double getSaldo () {
    return this.saldo;
 }

 public void deposita(double valor) {
    this.saldo += valor;
 }

 public void saca(double valor) {
      this.saldo -= valor;
 }

 public void atualiza(double taxa){
     this.saldo += this.saldo*taxa;
 }


 class ContaCorrente extends Conta {

 public void atualiza(double taxa){
     this.saldo += this.saldo*(taxa*2);
 }

 }

 class ContaPoupanca extends Conta {

 public void atualiza(double taxa){
     this.saldo += this.saldo*(taxa*3);
 }

 public void deposita(double valor) {
        this.saldo += saldo+(valor - 0.10);
  }

 }

 class TestaContas {
            public static void main(String[] args) {
                Conta c = new Conta();
                ContaCorrente cc = new ContaCorrente();
                ContaPoupanca cp = new ContaPoupanca();

                c.deposita(1000); 
                cc.deposita(1000); 
                cp.deposita(1000);

                c.atualiza(0.01);
                cc.atualiza(0.01);
                cp.atualiza(0.01);

                System.out.println(c.getSaldo());
                System.out.println(cc.getSaldo());
                System.out.println(cp.getSaldo());

            }
        }


 }
7 respostas
solução!

Olá Thiago,

Os erros estão acontecendo porque você possui um único arquivo Conta.java e várias classes dentro do mesmo arquivo. Nesse caso o ideal seria criar um arquivo para cada classe do seu sistema. Por exemplo, o arquivo Conta.java teria apenas o seguinte conteúdo:

public class Conta {
    protected double saldo;

    public double getSaldo () {
        return this.saldo;
    }

    public void deposita(double valor) {
        this.saldo += valor;
    }

    public void saca(double valor) {
        this.saldo -= valor;
    }

    public void atualiza(double taxa){
        this.saldo += this.saldo*taxa;
    }
}

Depois você criaria um outro arquivo chamado ContaCorrente.java com o seguinte conteúdo:

class ContaCorrente extends Conta {
    public void atualiza(double taxa){
        this.saldo += this.saldo*(taxa*2);
    }
}

E assim por diante para cada classe do sistema.

Por fim, para compilar, caso você não esteja no Eclipse, será necessário compilar cada um desses arquivos separadamente com o comando javac. Para evitar fazer isso manualmente utilize o comando abaixo para compilar todas as classes:

javac *.java

Finalmente, para executar seu código basta utilizar o comando:

java TestaContas

Obrigado pela contribuição Jeferson, mas como disse no corpo de texto da dúvida já tentei compilar individualmente e mesmo assim não funciona. A classe TestaContas não compila em conjunto e nem individualmente.

Olá,

Cole aqui o código do seu arquivo TestaContas.java para tentarmos descobrir o que pode estar errado.

Qndo eu coloco todos os códigos juntos eu acabo retirando o PUBLIC, mas nesse caso ele esta incluso.

public class TestaContas { public static void main(String[] args) { Conta c = new Conta(); ContaCorrente cc = new ContaCorrente(); ContaPoupanca cp = new ContaPoupanca();

c.deposita(1000); cc.deposita(1000); cp.deposita(1000);

c.atualiza(0.01); cc.atualiza(0.01); cp.atualiza(0.01);

System.out.println(c.getSaldo()); System.out.println(cc.getSaldo()); System.out.println(cp.getSaldo());

} }

Fala ai Thiago suas classes e métodos estão corretos porém acredito não ser uma boa prática deixa-las tudo dentro de uma única classe, você pode deixa-las no mesmo arquivo mas não uma classe dentro da outra, para resolver separe as classes em arquivos distintos.

Conta.java

public class Conta {
  protected double saldo;

  public double getSaldo () {
    return this.saldo;
  }

  public void deposita(double valor) {
    this.saldo += valor;
  }

  public void saca(double valor) {
    this.saldo -= valor;
  }

  public void atualiza(double taxa){
    this.saldo += this.saldo*taxa;
  }

}

ContaCorrente.java

class ContaCorrente extends Conta {

    public void atualiza(double taxa){
        this.saldo += this.saldo*(taxa*2);
    }

}

ContaPoupanca.java

class ContaPoupanca extends Conta {

    public void atualiza(double taxa){
        this.saldo += this.saldo*(taxa*3);
    }

    public void deposita(double valor) {
        this.saldo += saldo+(valor - 0.10);
    }

}

TestaContas.java

class TestaContas {
    public static void main(String[] args) {
        Conta c = new Conta();
        ContaCorrente cc = new ContaCorrente();
        ContaPoupanca cp = new ContaPoupanca();

        c.deposita(1000); 
        cc.deposita(1000); 
        cp.deposita(1000);

        c.atualiza(0.01);
        cc.atualiza(0.01);
        cp.atualiza(0.01);

        System.out.println(c.getSaldo());
        System.out.println(cc.getSaldo());
        System.out.println(cp.getSaldo());

    }
}

Feito isso compile um por vez:

javac Conta.java
javac ContaCorrenta.java
javac ContaPoupanca.java
javac TestaContas.java

E por fim rode a classe TestaContas

java TestaContas

Espero ter ajudado

Jeferson e matheus muito obrigado. Eu simplesmente tinha presumido que não daria certo compilar individualmente porque as classes ContaCorrente e ContaPoupanca estavam sendo compiladas com a classe Conta sem apontar erro. Estou começando a me envolver com programação agora, lição aprendida, da próxima eu vou tentar tudo que me indicarem antes de simplesmente presumir.

Apenas faço uma observação Thiago em relação, no seu código tinha classe dentro de classes, exemplo:

public class ClasseUm {
    public class ClasseDois {

    }
}

Não lembro de já ter visto ou feito algo parecido, então não posso te afirmar se esta correto ou não depois vou até fazer um teste para ver.

O que eu ja vi e cheguei a fazer foi classes no mesmo arquivo mas não uma dentro da outra, exemplo:

public class ClasseUm {

}
public class ClasseDois {

}

Espero ter ajudado