Duas classe filhas não atualiza uma classe pai

10 respostas
internetws

Olá.
Me deparei com um problema, simples… mas que me intriga. Tenho 3 classes, Conta.class(pai),Programa.class(filha),SacaEDeposita.class(filha). As duas últimas herdam da classe Conta.class. O problema é que quando sobreponho o valor do atributo da classe pai, na classe SacaEDeposita.class ela não atualiza… quando rodo a classe Programa.class o valor do atributo saldo não atualiza… porque?

class Conta
{
    int numero;
    String nome;
    double saldo;
    double limite;
    
    void saca(double quantidade){
        double novoSaldo = this.saldo - quantidade;
        this.saldo = novoSaldo;
    }
    void deposita(double quantidade){
        this.saldo += quantidade;
    }
}
class Programa{
    public Programa(){
        Conta minhaConta;
        minhaConta = new Conta();
        
        minhaConta.nome = "Duke";        
        
        System.out.println("Saldo atual: " + minhaConta.saldo);        
    }
    public static void main(String [] args){
        new Programa();
    }
}
class SacaEDeposita{
    public static void main(String [] args){
        Conta minhaConta;
        minhaConta = new Conta();
        
        minhaConta.nome = "Duke";
        minhaConta.saldo = 1000.0;
        
        minhaConta.saca(200);
        minhaConta.deposita(500);
        
        System.out.println("Saldo atual: " + minhaConta.saldo);
    }
}

10 Respostas

Mantu

Não vou entrar no mérito da hierarquia que vc criou.
No presente momento, nenhuma as classes Programa e SacaEDeposita não são filhas de Conta, pois você não determinou isso utilizando o extends Conta

foxpv

cara, eu te aconselho estudar um pouco mais de orientação por objetos, pois, entender os conceitos desse assunto é de extrema importância para entender o JAVA. No seu programa, não tem nada herdando de ninguém.

rolemberg

Dá uma olhada no site da caelum, lá tem uma apostila bem maneira para quem esta começando sobre orientação a objetos…

internetws

Mantu:
Não vou entrar no mérito da hierarquia que vc criou.
No presente momento, nenhuma as classes Programa e SacaEDeposita não são filhas de Conta, pois você não determinou isso utilizando o extends Conta

Mas elas estão no mesmo Projeto(diretório)…

Mantu

Isso não quer dizer nada. Classes que estejam fisicamente em um mesmo projeto/diretório não implica em que haja uma relação de herança entre elas. Mesmo porque, imagine o seguinte: Se o fato de estarem em um mesmo diretório estabelecesse uma relação de herança entre as classes, como é que o Java saberia quem é pai e quem é filha?
Uma linguagem de programação é como uma linguagem outra qualquer (Inglês, português, alemão, etc.), utilizada para estabelecer uma comunicação entre duas partes. Para se comunicar com um alemão, você deve falar em alemão com ele, por exemplo. Com computador, a mesma história. No nosso caso, as partes são o programador(Você) e o compilador Java(Chamemos de Java apenas). O compilador só entende e linguagem Java, e é através desta que você deve instruí-lo a montar o seu programa(compilar o seu programa). Como toda linguagem, Java tem um vocabulário e uma sintaxe, a qual você deve observar ao escrever seu programa. Fica claro aqui que você ainda não conhece totalmente a linguagem Java, então proponho que dê uma lida em alguma livro ou em tutoriais básicos no site da sun (http://java.sun.com).
O lance da herança, em Java, deve ser indicado por você, programador. Se vc deseja, por exemplo, que a classe SacaEDeposita seja filha da Conta, você tem que explicar isso pro Java. De que forma? Assim:

public class SacaEDeposita extends Conta {
...

A palavra chave extends serve para estabelecer uma relação de herança. Isto é conhecimento do Vocabulário da linguagem Java.
O extends deve ser utilizado na declaração da uma classe, logo após o nome desta. Imediatamente após a palavra chave extends, deve-se escrever o nome da classe que será pai da classe que estamos declarando. No seu caso, a classe que estamos declarando é a SacaEDeposita, e você quer que ela seja filha de Conta. Por isso que no exemplo acima, na declaração da classe, vem o nome da classe declarada(SacaEDeposita), seguido da palavra chave extends, seguido do nome da classe pai(Conta). Isto é conhecimento da sintaxe da linguagem Java.
Quando disse que não entraria no mérito da estrutura de herança que você bolou, foi porque isso já envolve um conhecimento mais “semântico” da linguagem, por assim dizer… Acredito muito no “um passo de cada vez” e, sendo assim, sugiro que estudo um pouco mais a linguagem quanto ao seu vocabulário (palavras chaves) e sua sintaxe (operadores, estruturas de controle, invocação de métodos, etc). Depois parta para herança.

Divirta-se!

internetws

Isso não quer dizer nada. Classes que estejam fisicamente em um mesmo projeto/diretório não implica em que haja uma relação de herança entre elas. Mesmo porque, imagine o seguinte: Se o fato de estarem em um mesmo diretório estabelecesse uma relação de herança entre as classes, como é que o Java saberia quem é pai e quem é filha?
Uma linguagem de programação é como uma linguagem outra qualquer (Inglês, português, alemão, etc.), utilizada para estabelecer uma comunicação entre duas partes. Para se comunicar com um alemão, você deve falar em alemão com ele, por exemplo. Com computador, a mesma história. No nosso caso, as partes são o programador(Você) e o compilador Java(Chamemos de Java apenas). O compilador só entende e linguagem Java, e é através desta que você deve instruí-lo a montar o seu programa(compilar o seu programa). Como toda linguagem, Java tem um vocabulário e uma sintaxe, a qual você deve observar ao escrever seu programa. Fica claro aqui que você ainda não conhece totalmente a linguagem Java, então proponho que dê uma lida em alguma livro ou em tutoriais básicos no site da sun (http://java.sun.com).
O lance da herança, em Java, deve ser indicado por você, programador. Se vc deseja, por exemplo, que a classe SacaEDeposita seja filha da Conta, você tem que explicar isso pro Java. De que forma? Assim:

public class SacaEDeposita extends Conta {
...

A palavra chave extends serve para estabelecer uma relação de herança. Isto é conhecimento do Vocabulário da linguagem Java.
O extends deve ser utilizado na declaração da uma classe, logo após o nome desta. Imediatamente após a palavra chave extends, deve-se escrever o nome da classe que será pai da classe que estamos declarando. No seu caso, a classe que estamos declarando é a SacaEDeposita, e você quer que ela seja filha de Conta. Por isso que no exemplo acima, na declaração da classe, vem o nome da classe declarada(SacaEDeposita), seguido da palavra chave extends, seguido do nome da classe pai(Conta). Isto é conhecimento da sintaxe da linguagem Java.
Quando disse que não entraria no mérito da estrutura de herança que você bolou, foi porque isso já envolve um conhecimento mais “semântico” da linguagem, por assim dizer… Acredito muito no “um passo de cada vez” e, sendo assim, sugiro que estudo um pouco mais a linguagem quanto ao seu vocabulário (palavras chaves) e sua sintaxe (operadores, estruturas de controle, invocação de métodos, etc). Depois parta para herança.

Divirta-se!

Seus comentários são válidos. Mas há uma confusão ai. Porque eu consigo acessa a classe Conta nas outras sem o Extends?

Marky.Vasconcelos

Sim você consegue acessar a classe sem extendela, mas voce tera apenas uma instancia dessa classe, e não uma relação hierarquica com a classe que esta acessando e qual esta sendo acessada.

internetws

Agora sim, eu entendi. Valeu!

Mantu

Agora sim, eu entendi. Valeu!
Vale notar o seguinte: Nas suas outras classes, você consegue acessar diretamento os campos da classe Conta por que estão na mesma pasta(pacote) e os campos da classe Conta tem uma acessibilidade do tipo package-private (chamamos simplesmente de package ou de pacote), ou seja, não são nem private, nem protected e nem public. Se as classes estivessem em pacotes diferentes, nem sequer conseguiriamos utilizar a classe Conta dentro das outras, uma vez que a acessibilidade dela também é de pacote.

Mais em http://java.sun.com/docs/books/tutorial/java/index.html

Marky.Vasconcelos

Agora sim, eu entendi. Valeu!
Vale notar o seguinte: Nas suas outras classes, você consegue acessar diretamento os campos da classe Conta por que estão na mesma pasta(pacote) [b]e[/e] os campos da classe Conta tem uma acessibilidade do tipo package-private (chamamos simplesmente de package ou de pacote), ou seja, não são nem private, nem protected e nem public. Se as classes estivessem em pacotes diferentes, nem sequer conseguiriamos utilizar a classe Conta dentro das outras, uma vez que a acessibilidade dela também é de pacote.

Mais em http://java.sun.com/docs/books/tutorial/java/index.html

PS: Pelo que ele postou ele está estudando pela aposila FJ-11 da caelum, e mais pra frente ela mostra sobre pacotes e modificadores de acesso.

Então não se preocupe com isso agora.

Criado 13 de fevereiro de 2008
Ultima resposta 13 de fev. de 2008
Respostas 10
Participantes 5