Duvida com um get! pls

Bom vamos lá…

public class Teste
{
     private double saldo;

     public void armazenaValor(double valor)
       {
           //...
           this.saldo = double valor;
        }

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

Pessoal minha pergunta pode ser um pouco besta e simples pra alguns de vcs… mais pra mim tá sendo um pouco confusa apesar de ser iniciante e só o livro pra eu explicar ta sendo um pouco difícil pegar sozinho as coisas, esse método set até que eu entendi bem, eu sei que é ele que armazena o valor na variável e pelo que está me dizendo o get ele retorna um valor… pois é, esse retorno que eu não estou conseguindo entender poxa… sera que alguém pode me dar uma explicação bastante clara mas muito clara mesmo a respeito desse método?

Digamos que vc tem uma classe(objeto) pessoa, e vc precisa dizer que essa pessoa tera o nome de RONALDO usaria o set para setar seu nome, digamos que logo em seguida precisaria apredentar ou trabalhar com o nome dessa pessoa vc precisaria recuperar este valor assim usaria o get sempre iria chamar o get para resgatar a informação que tem na variavel…

espero ter ajduado…vlw

TeiTei num poderia ser outro nome não? :lol: … Tô brincando gente boa ele rsrs, mais olha só cara eu não entendi muito bem pra te falar a verdade não, na hora de resgatar o nome pq pela minha lógica olha só, é uma coisa travando a outra, olha o que eu entendi cara o set ele armazena… entao pra mim a variável o valor que foi dado a ela já está armazenado nela então não consigo entender o resgate na verdade, que resgate seria esse? cara olha só, acho que vai ser difícil eu entender isso mas vamos ver quem vai ter uma explicação melhor no meu ver em rsrsrsrs…Mais de uma coisa eu tenho certeza, que esse método não é complicado mas tá tenso saca? parece que criou um bloqueio na cuca :? então tenta da uma ideia melhor ai, mais desde ja agradeço peja sua ajuda ja.

Bem, tambem sou iniciante. Caso errar no que falar, por favor me corrijam galera.

[code]class Teste {

private double saldo;

public void armazenaValor(double valor){
saldo = double valor;
}

public double saldo() {
return saldo;
}

}[/code]

O seu codigo poderia ser escrito dessa maneira acima. Nao há necessidade do this porque o nome da variavel local e o nome da variavel de instancia sao diferentes. Caso fosse igual, voce utilizaria o this.

O negocio é Orientação a Objetos cara. Tambem tenho duvidas sobre isto e por isso estou tentando me familiarizar. Faça o mesmo :wink:

A sua duvida é sobre o get e o set ne. Ok. Para que serve o get e o set? Primeiramente, o que é get e set?

Get = obter;
Set = configurar, estabelecer;

Em ingles é mais ou menos isto. O set e get é usado apenas como nomenclatura no nome do metodo. Por exemplo, na classe Teste acima voce nao usou o get como nome do saldo. Porem, fazer isto se torna confuso depois na hora que voce for ler o programa. Entao, é utilizado o get e o set para dizer que é para setar ou obter algo.

Beleza, mas vou setar e obter o que? Simples, a variavel de instancia. Mas, o que é uma variavel de instancia?

Quando voce cria uma classe e depois cria um objeto dela, é como se sua classe estivesse em vida. Imagina uma planta de uma casa desenhada como Classe e o Objeto como a sua casa. É como se fosse isso.

Agora, a planta de uma casa poderia ser usada para fazer a sua casa, a minha casa, a casa de outra pessoa… O meu gosto é diferente do seu. Vamos dizer que eu gosto de parede vermelha e voce gosta de parede azul (cores bem exoticas ne… ).

Agora, em meu objeto, eu teria que diferenciar isto. Como eu faço isto? Usando um atributo como private, ou seja, este atributo é visivel apenas pela classe que esta. So a classe onde ele esta é que pode modificar ele. Por isso é que sao usados os atributos get e set.

Com isso, eu poderia criar na minha Planta uma variavel de instancia chamada Cordeparede e a cada objeto criado definir a cor desejada.

[code]class Planta {
String cordeparede = “”;

public static void main(String args[]) {
Planta obj_tecno = new Planta(“Vermelho”);
Planta obj_leandro = new Planta(“Azul”);

  obj_tecno.mostrarCor();
  obj_leandro.mostrarCor();

}

public Planta(String cor){
cordeparede = cor;
}

public void mostrarCor(){
System.out.println("A cor escolhida e: " + cordeparede);
}

}[/code]

Teste este exemplo e ve se suas duvidas sanaram. Se tiver duvidas novamente, volte aqui neste topico…

Repara que para setar o atributo cor eu nao usei um metodo set, usei o proprio construtor da classe; e para obter eu nao usei um metodo get. Mas isso apenas se deu porque fiz o exemplo todo na mesma classe.

Em programas maiores, tem-se a necessidade de dividir para uma melhor depuração e possivelmente uma futura reparação no programa. Desse modo, precisa criar o metodo set e get.

Abraços

Usarei sua classe com algumas modificações.

public class Banco
{
	private double saldo;
	
	//Método que armazena o saldo na variável
	public void setSaldo(double saldoo)
	{
		saldo = saldoo;
	}
}
import java.util.Scanner; //Classe para poder pegar os dados digitados no teclado

public class Teste
{
	public static void main(String args[])
	{
		Banco conta1 = new Banco(); //Cria um objeto da classe Banco
		Scanner input = new Scanner(System.in); //Cria um objeto da classe "Scanner" para ler os dados digitados
		double saldo; //Variável que irá armazenar o valor que o Scanner pegar
		
		System.out.print("Digite um valor para seu saldo: ");
		saldo = input.nextDouble(); //Pegar o valor e armazena na variável saldo
		
		conta1.setSaldo(saldo); //Utiliza o método setSaldo do objeto conta1 para armazenar o saldo na conta
	}
}

Veja que neste exemplo não preciso declarar um método get para retornar o saldo.

Imagine agora que depois que o programa armazenar o saldo na conta eu queira que ele exiba o saldo na tela. O que fazer? Declarar e usar um get!

Veja agora o código com o get:

public class Banco
{
	private double saldo;
	
	//Método que armazena o saldo na variável
	public void setSaldo(double saldoo)
	{
		saldo = saldoo;
	}
	
	//Método que retorna o saldo
	public double getSaldo()
	{
		return saldo;
	}
}
import java.util.Scanner; //Classe para poder pegar os dados digitados no teclado

public class Teste
{
	public static void main(String args[])
	{
		Banco conta1 = new Banco(); //Cria um objeto da classe Banco
		Scanner input = new Scanner(System.in); //Cria um objeto da classe "Scanner" para ler os dados digitados
		double saldo; //Variável que irá armazenar o valor que o Scanner pegar
		
		System.out.print("Digite um valor para seu saldo: ");
		saldo = input.nextDouble(); //Pega o valor e armazena na variável saldo
		
		conta1.setSaldo(saldo); //Utiliza o método setSaldo do objeto conta1 para armazenar o saldo na conta
		
		//Imprimi o saldo na tela que é retornado pelo método getSaldo do objeto conta1
		System.out.printf("Seu saldo é : %f", conta1.getSaldo());
	}
}

Entendeu? Você só vai declarar um método get se você realmente precisar utilizar o valor de uma variável private em outra classe.

Qualquer dúvida posta ai.

Abraço.

Shaft…Me familiarizei mais com sua explicação, não que as outras tenha tido valores, claro que tiveram agradeço aos mesmo, mais olha só deixa eu so ver se eu entendi mesmo entao eu só precizaria ultilizar o get se eu tivece que “apresentar o soldo da minha conta em outra classe” é isso? pq até em tão o set eu entendi perfeitamente oq ta pegando mesmo é so o get…mais rezumindo eu so crio o get se eu tiver q mostrar o saldo em outra classe?

Como falaram antes, o negócio é Orientação a Objetos (OO).
E nada melhor para entender isso do que analisando em situações do mundo real.

Primeiro uma rápida explanação sobre isso:

Imaginemos que tudo é objeto: você, eu, um banco, uma conta, etc.

Em OO existe o conceito de encapsulamento que é a privatização das informações (defini-se isso com o modificador de visibilidade private), onde cada objeto (e somente ele) é quem deve saber sobre informações referentes a ele mesmo.

Você concorda que ninguém melhor pra me informar seu nome e outros dados referentes a sua pessoa do que perguntando diretamente a você?

Por esse motivo em OO os objetos precisam estar se comunicando direto.

Vou tentar mostrar um exemplo com uma classe do tipo Pessoa.

[code]public class Pessoa {

private String nome;

public String getNome() {
    return nome;
}

public void setNome(String nome) {
    this.nome = nome;
}

}[/code]

[code]public class Principal {

public static void main(String[] args) {
    Pessoa pessoa1 = new Pessoa(); //Instanciando um objeto do tipo Pessoa
    Pessoa pessoa2 = new Pessoa(); //Outro objeto,porém também do tipo Pessoa

    pessoa1.setNome("d10g3n3s"); //Atribuindo nomes as pessoas(fala-se setar)
    pessoa2.setNome("leandro-maanaim");

    System.out.printf("O nome da pessoa1 é: %s \n", pessoa1.getNome()); //Perguntando pelo nome da pessoa1
    System.out.printf("O nome da pessoa2 é: %s \n", pessoa2.getNome()); //Perguntando pelo nome da pessoa2
}

}[/code]

Se uma classe é como o molde para a criação de um ou mais objetos de seu tipo.

No caso, como o nome é um atributo que foi privatizado, para obtê-lo deve-se perguntar diretamente ao seu dono. E é aí que entra o método get.
Imagine como ficaria confuso se ao invés de perguntar diretamente ao objeto com o método get você simplesmente pedisse o valor que está armazenado no atributo (variável) nome, já que vários outros objetos podem ter um nome também.

Ou seja, o método get lhe garante que o valor que você está recebendo é exatamente o do objeto a quem você pediu.

Espero que tenha esclarecido mais.

Isso ai!

Veja que o exemplo que dei tem 2 classes: classe Banco e classe Teste.

A variável saldo que está na classe Banco eu declarei como sendo private. Isso faz com que ela só seja acessível diretamente dentro da classe Banco, ou seja, se eu precisar usar ela em outra classe fora da classe Banco (como foi o caso em que eu precisei do valor dela na classe Teste) ai sim teria que usar um get. :wink:

Qualquer dúvida posta ai

Abraço.

d10g3n35, parabens pela sua explicação. Eu gostei. Dificilmente ele nao ira entender agora hehe.

So para completar amigo leandro-maanaim, o porque voce nao esta entendendo é que voce nao viu os outros modificadores de acesso ou caso viu, nao entendeu como eles funciona.

Modificadores de acesso é o que indica por quem a classe, metodo ou atributo pode ser acessado. Modificadores de acesso nada mais é do que o nivel de acesso de onde ele esta declarado.

No exemplo acima vimos o private. OK? Voce com certeza ja viu o public ne?

Agora, veja os dois exemplos que darei abaixo.

Funciona:

[code]public class Main {
TestarMain tm = new TestarMain();

void modificarDinheiro(int dinheiro){
tm.dinheiro = dinheiro;
}

}[/code]

public class TestarMain { public int dinheiro = 0; }

NAO Funciona:

[code]public class Main {
TestarMain tm = new TestarMain();

void modificarDinheiro(int dinheiro){
tm.dinheiro = dinheiro;
}

}[/code]

public class TestarMain { private int dinheiro = 0; }

Porque no segundo caso nao funciona? Porque tentamos mudar diretamente uma variavel de instancia. É por isso que todo atributo que tem seu modificador como private é chamado de variavel de instancia, porque em cada instancia da classe, ou seja, cada objeto criado tera um valor diferente…O atributo so nao sera uma variavel de instancia caso este seja do tipo static, porque a cada objeto, tecno e leandro, por exemplo, a variavel dinheiro seria a mesma coisa. Tanto o private, quanto o public, ou ate mesmo o default (nenhum modificador) é o que declara o nivel de acesso do que voce estiver especificando. Nao tente visualizar static como modificador de acesso, voce poderia ter uma declaração de um atributo como:

static private int i = 0;

mas nao o seguinte:

private public int i = 0;

Isso acima é o mesmo que falar que ele é visivel apenas na classe e ao mesmo tempo dizer que ele é visivel atraves de um objeto. Entende porque da daria erro? Sei que nao é a sua duvida mas estou apenas lhe dando umas dicas.

Agora no caso abaixo:

static private int i = 0;

Quero dizer que o atributo vai ser o mesmo para todos objetos mas que ao mesmo tempo so pode ser modificado pela propria classe. Entende? Tipo, vamos dizer que eu e voce compartilha nosso dinheiro no banco. Mas eu adiciono dinheiro nesse atributo pela minha conta e voce adiciona dinheiro pela sua conta. Entende?

Eu sei que parece complicado de inicio. Tambem tive muitas duvidas, e ainda tenho. O voce pode fazer é apenas praticar. Vai praticar, baixa o NetBeans e fica testando ai cara. Cria varias classes, vai trocando o modificadores. Sempre que há algo errado o NetBeans fala que ta errado em tal parte. Dai voce vai aprendendo :slight_smile:

Abraços

Blz deu pra entender agora… só mais uma coisinha, todas as vezes que eu crio um set eu tenho que criar um get logo em seguida? isso é se eu precisar pedir uma informação de um atributo de minha classe(Objeto)?

Você pode criar o set primeiro ou o get.

A ordem não importa, o que importa é ele existir para você poder utilizá-lo

Qualquer dúvida posta ai.

Abraço.

Duviadas Exclareciadas! Agradeço de coração a atenção de dotos vcs que me ajudaram e espero um dia compartilhar aquilo que estou adiquirindo com vcs.
brigado abraços :slight_smile: