Dúvida com getters e setters

Desculpem pela pergunta idiota: Alguém saberia me dizer porque quando eu tento visualizar o saldo, ele me mostra 0? Criei inclusive mais de um método para tentar visualizar, para comprovar a visibilidade e o funcionamento dos getters e setters, mas sempre dá zero na saída…


package pac2;

public class Conta {
	private double saldo;
	private double deposito;
	
	private double pegaSaldo(){
		return this.saldo;
	}
	
	public double getSaldo() {
		return saldo;
	}
	
	

	public void setSaldo(double saldo) {
		this.saldo = saldo;
	}

	public double getDeposito() {
		return deposito;
	}

	public void setDeposito(double deposito) {
		this.deposito = deposito;
	}

	private void deposita(int deposito){
		saldo = saldo + deposito;
	}
	/*Getter para mostrar saldo*/
	public double mostraSaldo(){
		return getSaldo();
	}
}

package pac2;

public class TestaAcessoComPegaSaldo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Conta minhaconta = new Conta();
		minhaconta.setDeposito(1000);
		System.out.println(minhaconta.getSaldo());
		System.out.println("Saldo: "+minhaconta.mostraSaldo());

	}

}

ué… você setou deposito e não saldo.

Se você quer que o método altere o saldo, você mesmo tem que fazer isso. Ex:public void depositar(double valor){ this.saldo += valor; }E uma dica, eu acho que você não precisa de um membro deposito na sua classe.

O valor padrão de um atributo do tipo primitivo double é zero.
E isto ocorre por que você faz um depósito, mas não associa o depósito ao saldo (não atualiza o saldo).

Use o metodo “Deposita” que vc tem aí nessa classe para passar o valor do deposito :wink:

Seria algo do tipo …

setSaldo(minhaconta.deposita(1000));

[quote=rodrigorfcs]Seria algo do tipo …

setSaldo(minhaconta.deposita(1000)); [/quote]

Não, nem precisa desse setSaldo.
E airmigjr, seria melhor se o método deposita recebe-se um double por parametro, não um int.

Graças a ajuda de vocês, encontrei o erro. Tudo que fiz foi chamar o método que calcula o saldo, dae funfou…

Agora fiz outro código, e este está com o mesmo problema. Mas pra mim ele deveria mostrar a idade… Desculpem, mas gostaria que isso ficasse bem explicado para mim… Qual será meu erro dessa vez?



public class Cliente {

	private String cpf;
	private int idade;
	
	public String getCpf() {
		return cpf;
	}

	public void setCpf(String cpf) {
		this.cpf = cpf;
	}

	public int getIdade() {
		return idade;
	}

	public void setIdade(int idade) {
		this.idade = idade;
	}

	public void testaCPFEIdade(String cpf, int idade) {
		if  (idade <=60){
			validaCPF(cpf);
		}else{
			System.out.println("Não é necessário validar o CPF");
		}
		this.cpf = cpf;
	}
	
	private void validaCPF(String cpf){
		if (cpf.length()>=11){
			System.out.println("CPF valido");
		}else{
			System.out.println("CPF invalido");
		}
	}
}

import javax.swing.JOptionPane;


public class Swing {
	private String cpf;
	private int idade;
	
	public void PerguntaCPFEIdade(){
		Cliente cli = new Cliente();
		cpf = JOptionPane.showInputDialog("Qual o cpf?");
		cli.setIdade(idade = Integer.parseInt(JOptionPane.showInputDialog("Qual a idade?")));
		
		
		cli.testaCPFEIdade(cpf, idade);
	}
	
	
}


public class App {


	public static void main(String[] args) {
		

		Swing sw = new Swing();
		
		
		sw.PerguntaCPFEIdade();
		Cliente cli = new Cliente();
		System.out.println(cli.getIdade());
		

		

	}

}

O objeto Cliente que esta na sua Classe App é diferente do objeto que esta na sua Classe Swing.

Na sua Classe App você estancia o objeto Cliente, mas não guarda nenhum valor no seus atributos por isso eles fica com valor padrão e chama o método desse objeto getIdade().

Na sua Classe Swing você estancia um outro objeto Cliente e nesse você coloca valor no seus atributos.

Está retornando 0 porque você instanciou 2 classes do tipo cliente. Na primeira vez que instanciou, você passou valores pra ela:

   public static void main(String[] args) {  
            
        Swing sw = new Swing();  
                    
        sw.PerguntaCPFEIdade();  // quando vc chama esse método, dentro dele vc instancia a classe cliente uma vez
        Cliente cli = new Cliente();  // aqui você instancia Cliente outra vez
        System.out.println(cli.getIdade());  // esta buscando da classe que foi instanciada pela 2ªvez(sem valores)                       
  
    }  

O que você pode fazer é algo tipo assim:

import javax.swing.JOptionPane;  
  
  
public class Swing {  
    private String cpf;  
    private int idade;  
      
    public void PerguntaCPFEIdade(Cliente cli){  
        cpf = JOptionPane.showInputDialog("Qual o cpf?");  
        cli.setIdade(idade = Integer.parseInt(JOptionPane.showInputDialog("Qual a idade?")));  
                    
        cli.testaCPFEIdade(cpf, idade);  
    }  
            
} 
public class App {  
  
  
    public static void main(String[] args) {  
          
  
        Swing sw = new Swing();  
                            
        Cliente cli = new Cliente();  
        sw.PerguntaCPFEIdade(cli);  
        System.out.println(cli.getIdade());  
                       
    }  
  
} 

airmigjr
Boa tarde.

Concordo com o que os amigos disseram.
Você instanciou dois objetos com o menos nome.
Mas isso não foi de propósito.
É normal ocorrer que esqueçamos onde já criamos os objetos.

Como disseram, na primeira instância você fez direitinho mas depois
antes de imprimir lá em baixo no Main, você criou outro objeto
com o mesmo nome.
Dessa forma a JVM acaba criando uma nova variável de referência
chamada cli e a ela atribui um novo objeto.

Eu indico que você leia o livro Java Use a Cabeça pois explica muito bem essa questão.

Uma estratégia útil é fazer como o Henrique Moraes
crie os objetos no início do main, pois assim não confundirá onde os criou.

Criar objetos dentro de outras instâncias(objetos criados), é complexo e tem que ter atenção
senão acaba criando por cima ou criando repetido com nome diferente.

Abraço.

Nossa gente, muito obrigado. Vc’s saum d+!!!

1 Abraço para todos, e Happy Coding!

Pessoal, alguém poderia me dizer o que significa ter colocado o objeto cli como argumento do método da classe Swing para executar o método desta classe (Swing)?
Isso é troca de mensagens entre objeto, encapsulamento ou algo assim?

Muito obrigado.

1 Abraço,

[quote=airmigjr]Pessoal, alguém poderia me dizer o que significa ter colocado o objeto cli como argumento do método da classe Swing para executar o método desta classe (Swing)?
Isso é troca de mensagens entre objeto, encapsulamento ou algo assim?

Muito obrigado.

1 Abraço,[/quote]

airmigjr
Boa noite.

Na verdade o Henrique Moraes tentou lhe ajudar colocando o argumento cli do tipo Cliente
para que você percebesse que tinha declarado dois objetos com nomes idênticos.
Sendo assim o que ele fez foi lhe mostrar que você precisaria somente criar/instanciar o objeto no Main
uma vez para depois passar ele como parâmetro o método que o espera como argumento.

Mas no geral, pelo fato de o objeto já estar instanciado, ou seja, já se tem uma variável de referência
cli do tipo cliente, apontando para um novo objeto do tipo Cliente, creio que não seja necessário
passar o objeto por parâmetro para o método PerguntaCPFEIdade da classe Swing.
Basta acessar o objeto digitando o nome dele que na verdade é o nome da variável de referência
seguido do ponto . que é o operador de acesso aos método
e por fim digitar o nome do método que você quer chamar.

Agora vamos esclarecer alguns pontos importantes.

Encapsulamento
Proteger as variáveis de instância de uma classe colocando-as como private
e definindo métodos de acesso set e get
Ou seja você já usou o encapsulamento na sua classe Cliente

Mensagem
É a comunicação entre dois objetos (Definição bem Grosseira)
No geral é o fato de um objeto A, chamar um método de um objeto B

por exemplo o seu objeto da classe Swing de nome sw
chama o método setIdade do objeto cli da classe cliente
como mostra o código abaixo:

import javax.swing.JOptionPane;

[code]public class Swing {
private String cpf;
private int idade;

public void PerguntaCPFEIdade(){  
    Cliente cli = new Cliente();  
    cpf = JOptionPane.showInputDialog("Qual o cpf?");  
    cli.setIdade(idade = Integer.parseInt(JOptionPane.showInputDialog("Qual a idade?")));  
      
      
    cli.testaCPFEIdade(cpf, idade);  
}  

} [/code]

Seria essa a resposta que você procura?

indico o link
http://www.guj.com.br/java/229585-troca-de-mensagem-entre-objetos

abraço e sucesso

Tiago, novamente agradeço a atenção e as explicações. A resposta satisfez, com certeza. Preciso ir estudando até estas questões todas estarem no “sangue”…
Vou estudar o link que me indicou.

Muito obrigado,

1 Abraço,

Airton

Caro Tiago,
teria como você postar aqui um exemplo do que eu poderia fazer ao invés de enviar o parâmetro/argumento ?

Obrigado,

Airton

[quote=airmigjr]Tiago, novamente agradeço a atenção e as explicações. A resposta satisfez, com certeza. Preciso ir estudando até estas questões todas estarem no “sangue”…
Vou estudar o link que me indicou.

Muito obrigado,

1 Abraço,

Airton
[/quote]

Eu também sou novo em Java
e por isso devemos ser o máximo unidos que pudermos.

precisando não se intimide
venha para o GUJ
hehehe

abraço