Olá Galera!!!
Este é o meu primeiro post no forum, de muitos que viram…
Estou na minha 6º aula de java, e não consigo enteder this/get and set e Static…muita coisa, né?rs
conto com a ajuda de vc’s…
Um abraço!
Olá Galera!!!
Este é o meu primeiro post no forum, de muitos que viram…
Estou na minha 6º aula de java, e não consigo enteder this/get and set e Static…muita coisa, né?rs
conto com a ajuda de vc’s…
Um abraço!
Quando você escreve um método em uma classe, a referência this é usada para obter o objeto através do qual a chamada do método é feita. É bastante útil quando se deseja evitar ambigüidades no código:
class Hora
{
private int hora; //variável de instância hora
private int minuto;
public void setHora( int hora ) //parâmetro hora
{
//através da referência this fica claro para o compilador
//que se trata da variável de instância hora e não do parâmetro hora
this.hora = hora >= 0 && hora <= 23 ? hora : 0;
}
}
Muitas vezes, é preciso lidar com mais de um objeto da classe em um método. Nestes casos a referência this também é útil:
class Complex
{
private double real;
private double imaginary;
public Complex addComplex( Complex c )
{
return new Complex( this.real + c.real , this.imaginary + c.imaginary );
}
public Complex( double r , double i ){ //.... }
}
Nesse caso, a referência this é usada para distinguir as variáveis de instância do objeto através do qual o método é invocado das variáveis do objeto c, passado como parâmetro.
Métodos get/set são usados para obter/atribuir valores a variáveis de instância, mas não a queremos torná-las públicas, exemplo:
class Mes
{
private int mes;
private int ano;
public int getMes(){ return mes }
public void setMes( int m ){ mes = m >= 1 && m <= 12 ? m : 1; }
public int getAno(){ return ano }
public void setAno( int a ){ ano = a > 1900 ? a : 1900 }
}
É importante salientar que nem todos os atributos da classe necessitarão de métodos get/set. A maioria das variáveis da classe devem ser conhecidas apenas pela própria classe.
Oliver,
Getters e Setters são metodos criados para acessar atributos de classes com definição private, ou seja, atributos privados que somente estes metodos terão acesso. Imagine se você declara-se metodos como public, toda a aplicação teria acesso, tornando esses atributo nada seguros, por isso a importancia de getters e setters. Get traz o valor do objeto e Set aplica um valor ao objeto.
Por exemplo:
[code]class Complex
{
private double real;
private double imaginary;
public double getReal( )
{
/*Retorna o atributo "real"*/
return this.real;
}
public setReal(double real)
{
/coloca o valor da variavel “real” do metodo no atributo real do objeto/
this.real = real;
}
[/code]
Espero que tenha entendido ! 8)
Por fim, o modificador static é usado em atributos e métodos em uma classe, de forma que eles podem ser acessados sem a necessidade de instanciar um objeto da classe. Os melhores exemplo são encontrados na classe Math! Os seus métodos e constantes são acessados diretamente através do nome da classe Math, sem a necessidade de instanciar objetos Math! É isso aí!
Cara, olhe bem para esses dois codigos:
class Cachorro {
String nome;
String cor;
int idade;
}
[code]class NovoCachorro {
public static void main ( String args[] ) {
Cachorro animal = new Cachorro();
animal.nome = "Pingo";
animal.cor = "branco";
animal.idade = 3;
System.out.println("Nome: " + animal.nome);
System.out.println("Cor: " + animal.cor);
System.out.println("Idade: " + animal.idade);
}
}[/code]
Ao executarmos a classe NovoCachorro, ela ira criar um referencia ao objeto Cachorro chamada animal, depois ira colocar o conteudo em alguns atributos ( nome, cor e idade)
Depois para mostrar eu uso o System.out.println…
Porem, reparamos uma coisa muito interessante na classe Cachorro
class Cachorro {
String nome;
String cor;
int idade;
O modificar desses atributos estao padrao, entao cada objeto que for criado pode mudar o valor dos atributos dos objetos normalmente…
Agora, e se esses atributos da classe Cachorro estivesse como private?
So seria possivel mudar o conteudo deles a partir da mesma classe…
Veja a classe Cachorro com os atributos private
class Cachorro {
private String nome;
private String cor;
private int idade;
}
A classe NovoCachorro esta normal como antes…
[code]class NovoCachorro {
public static void main ( String args[] ) {
Cachorro animal = new Cachorro();
animal.nome = "Pingo";
animal.cor = "branco";
animal.idade = 3;
System.out.println("Nome: " + animal.nome);
System.out.println("Cor: " + animal.cor);
System.out.println("Idade: " + animal.idade);
}
}[/code]
Na hora que voce for executar esse codigo, ira ser exibida uma mensagem de erro…
Essa mensagem ocorre porque os atributos da classe Cachorro estao declarados como private e qualquer atributo que for declarado como private so é acessivel de dentro da classe, como eu tentei acessar de outra clase ( NovoCachorro ) deu erro…
Entao, como mudar os atributos do objeto animal a partir da mesma classe?
Para isso, sao criados metodos get e set com o mesmo nome do atributo para atribuir o valor a eles… Veja os exemplos abaixo:
[code]class NovoCachorro {
public static void main ( String args[] ) {
Cachorro animal = new Cachorro();
animal.setNome("Pingo");
animal.setCor("branco");
animal.setIdade(3);
System.out.println("Nome: " + animal.getNome());
System.out.println("Cor: " + animal.getCor());
System.out.println("Idade: " + animal.getIdade());
}
}[/code]
[code]class Cachorro {
private String nome;
private String cor;
private int idade;
public void setNome(String nome){
this.nome = nome;
}
public String getNome(){
return nome;
}
public void setCor(String cor){
this.cor = cor;
}
public String getCor(){
return cor;
}
public void setIdade(int idade){
this.idade = idade;
}
public int getIdade(){
return idade;
}
}[/code]
Quando executar isso, os atributos do objeto animal receberam os dados mesmo estando private…
A palavra this referencia o objeto.
public void setNome(String nome){
this.nome = nome;
}
Por exemplo, nesse codigo acima, o metodo setNome vai receber um valor por argumento que vai ser passado para a variavel nome. Dentro desse metodo tem uma linha que fala:
this.nome = nome;
Essa linha quer dizer que o nome que acabou de ser passado por argumento vai ser passado para o atributo nome do objeto animal…
O modificar static vou deixar por sua conta descobrir melhor como funciona…
Para ver um conteudo legal sobre modificadores CLIQUE AQUI
Espero que tenha entendido… Qualquer duvida posta ai que eu tento ajudar…
Abraços
Puts, enquanto escrevia a resposta, 4 pessoas responderam o que o cara queria saber, e por incrivel que parece cada um falando sobre uma duvida diferente do cara rsrss
Caso ele ainda tiver duvidas, acho que meu post vai ajuda-lo
Abraços
Puts…Valeu mesmo pela ajuda, clariou geral…
Tô chegando agora no mundo do java, mas já deu para notar que o pessoal é gente fina!
Obrigado a todos!
[quote=rmendes08]Muitas vezes, é preciso lidar com mais de um objeto da classe em um método. Nestes casos a referência this também é útil:
class Complex
{
private double real;
private double imaginary;
public Complex addComplex( Complex c )
{
return new Complex( this.real + c.real , this.imaginary + c.imaginary );
}
public Complex( double r , double i ){ //.... }
}
Nesse caso, a referência this é usada para distinguir as variáveis de instância do objeto através do qual o método é invocado das variáveis do objeto c, passado como parâmetro.[/quote]
Olá pessoal, aproveitando as dúvidas aqui, gostaria de exclarecer algo:
1 - No código anterior, fica explícito que o método Complex recebe como argumento um objeto c, porém, o que eu não entendi é com o que exatamente as variáveis de instância estão se somando, no caso abaixo:
return new Complex( this.real + c.real , this.imaginary + c.imaginary );
c.real e c.imaginary são atributos do objeto C, mais this.real e this.imaginary são de qual objeto?
2 - Usar set e get é exigência da linguagem? Eu acreditava que seria apenas uma convenção
Grato pela atenção dispensada!
[quote=thinet][quote=rmendes08]c.real e c.imaginary são atributos do objeto C, mais this.real e this.imaginary são de qual objeto?
[/quote][/quote]
Ue, do mesmo Objeto que ela se encontra cara… Veja que o .this é usado na mesma classe onde tem os atributos private… this é usado para referenciar aos atributos do objeto onde se encontra…
c.real poderia muito bem ser ate de outra classe ou poderia ser uma referencia ate para o mesmo objeto…
O que voce tem que entender é que a palavra this é usado dentro da classe onde tem o bendito objeto…
[quote=thinet][quote=rmendes08]
2 - Usar set e get é exigência da linguagem? Eu acreditava que seria apenas uma convenção
[/quote][/quote]
Exigencia? Não. Exigencia seria se caso fosse nessario rodar a aplicação, ai sim seria uma exigencia… Porem, logo logo voce ira ver que é uma “Boa pratica de programação” declarar variaveis de instancia do tipo private, ou seja, essas variaveis so sao possiveis ser modificadas atraves de metodos de dentro da classe…
Na verdade, o get e set sao apenas “referencia” para nos, seres humanos… get e set pode ser chamada tambem de “Boa pratica de programação” visto que voce poderia declarar qualquer metodo e mecher nos atributos private da classe…
[code]class Cachorro {
private String nome;
private String cor;
private int idade;
public void Nome(String nome){
this.nome = nome;
}
public String Nome(){
return nome;
}
public void Cor(String cor){
this.cor = cor;
}
public String Cor(){
return cor;
}
public void Idade(int idade){
this.idade = idade;
}
public int Idade(){
return idade;
}
}[/code]
[code]class NovoCachorro {
public static void main ( String args[] ) {
Cachorro animal = new Cachorro();
animal.Nome("Pingo");
animal.Cor("branco");
animal.Idade(3);
System.out.println("Nome: " + animal.Nome());
System.out.println("Cor: " + animal.Cor());
System.out.println("Idade: " + animal.Idade());
}
}[/code]
Veja que é os mesmo exemplos que eu mostrei la em cima… porem, eu mudei o nome das classes tirando o get e set do começo do metodo. Resultado? Funcionou corretamente…
Porem, depure ( leia ) um programa que tenha umas 2mil linhas de codigos… Resultado? Uma forte dor de cabeça
Qualquer duvida, poste ai…
Abraços
Uma pergunta, fiquei curioso. Caso eu tire o this e coloque só o nome da variavel de instancia
exemplo:
[code]class Complex
{
private double real; // Variavel de instancia
private double imaginary;
public Complex addComplex( Complex c ) // Parametro
{
return new Complex( real + c.real , imaginary + c.imaginary ); // Percebam que escrevi os nomes exatos das variaveis de instancia sem que sejam precedidof de this.
}
public Complex( double r , double i ){ //.... }
} [/code]
Neste caso nao daria no mesmo ? O JVM nao intenderia como se eu tivesse escrito this.real e this.imaginary e entenderia como variavel de instancia x dessa classe ?
ou tem alguma diferenca ?
public void Nome(String nome){
this.nome = nome;
}
public void Nome(String nome){
nome = nome;
Cara se fizer de ambos os jeitos vai rodar tranquilo, se usa o [color=blue]this[/color] para melhorar a diferença e/ou facilitar a programação.
[quote=Renatosantos]
public void Nome(String nome){
this.nome = nome;
}
public void Nome(String nome){
nome = nome;
Cara se fizer de ambos os jeitos vai rodar tranquilo, se usa o [color=blue]this[/color] para melhorar a diferença e/ou facilitar a programação.[/quote]
Nossa, acho que esse foi meu primeiro tópico no GUJ, mas vamos lá …
Nesse caso, o this é necessário, pois o parâmetro “String nome” conta como variável local, e variáveis locais escondem variáveis de instância com o mesmo nome. Coloque isso no Eclipse e a linha fica amarela acusando warning, no caso, é uma atribuição sem efeito.
[quote=rmendes08]
Nossa, acho que esse foi meu primeiro tópico no GUJ, mas vamos lá …
Nesse caso, o this é necessário, pois o parâmetro “String nome” conta como variável local, e variáveis locais escondem variáveis de instância com o mesmo nome. Coloque isso no Eclipse e a linha fica amarela acusando warning, no caso, é uma atribuição sem efeito.[/quote]
Verdade! Eu uso o NetBeans e tanto faz usa com ou sem, mais eu sempre uso o [color=blue]this[/color]!
[quote=blackfalcon]Cara, olhe bem para esses dois codigos:
class Cachorro {
String nome;
String cor;
int idade;
}
[code]class NovoCachorro {
public static void main ( String args[] ) {
Cachorro animal = new Cachorro();
animal.nome = "Pingo";
animal.cor = "branco";
animal.idade = 3;
System.out.println("Nome: " + animal.nome);
System.out.println("Cor: " + animal.cor);
System.out.println("Idade: " + animal.idade);
}
}[/code]
Ao executarmos a classe NovoCachorro, ela ira criar um referencia ao objeto Cachorro chamada animal, depois ira colocar o conteudo em alguns atributos ( nome, cor e idade)
Depois para mostrar eu uso o System.out.println…
Porem, reparamos uma coisa muito interessante na classe Cachorro
class Cachorro {
String nome;
String cor;
int idade;
O modificar desses atributos estao padrao, entao cada objeto que for criado pode mudar o valor dos atributos dos objetos normalmente…
Agora, e se esses atributos da classe Cachorro estivesse como private?
So seria possivel mudar o conteudo deles a partir da mesma classe…
Veja a classe Cachorro com os atributos private
class Cachorro {
private String nome;
private String cor;
private int idade;
}
A classe NovoCachorro esta normal como antes…
[code]class NovoCachorro {
public static void main ( String args[] ) {
Cachorro animal = new Cachorro();
animal.nome = "Pingo";
animal.cor = "branco";
animal.idade = 3;
System.out.println("Nome: " + animal.nome);
System.out.println("Cor: " + animal.cor);
System.out.println("Idade: " + animal.idade);
}
}[/code]
Na hora que voce for executar esse codigo, ira ser exibida uma mensagem de erro…
Essa mensagem ocorre porque os atributos da classe Cachorro estao declarados como private e qualquer atributo que for declarado como private so é acessivel de dentro da classe, como eu tentei acessar de outra clase ( NovoCachorro ) deu erro…
Entao, como mudar os atributos do objeto animal a partir da mesma classe?
Para isso, sao criados metodos get e set com o mesmo nome do atributo para atribuir o valor a eles… Veja os exemplos abaixo:
[code]class NovoCachorro {
public static void main ( String args[] ) {
Cachorro animal = new Cachorro();
animal.setNome("Pingo");
animal.setCor("branco");
animal.setIdade(3);
System.out.println("Nome: " + animal.getNome());
System.out.println("Cor: " + animal.getCor());
System.out.println("Idade: " + animal.getIdade());
}
}[/code]
[code]class Cachorro {
private String nome;
private String cor;
private int idade;
public void setNome(String nome){
this.nome = nome;
}
public String getNome(){
return nome;
}
public void setCor(String cor){
this.cor = cor;
}
public String getCor(){
return cor;
}
public void setIdade(int idade){
this.idade = idade;
}
public int getIdade(){
return idade;
}
}[/code]
Quando executar isso, os atributos do objeto animal receberam os dados mesmo estando private…
A palavra this referencia o objeto.
public void setNome(String nome){
this.nome = nome;
}
Por exemplo, nesse codigo acima, o metodo setNome vai receber um valor por argumento que vai ser passado para a variavel nome. Dentro desse metodo tem uma linha que fala:
this.nome = nome;
Essa linha quer dizer que o nome que acabou de ser passado por argumento vai ser passado para o atributo nome do objeto animal…
O modificar static vou deixar por sua conta descobrir melhor como funciona…
Para ver um conteudo legal sobre modificadores CLIQUE AQUI
Espero que tenha entendido… Qualquer duvida posta ai que eu tento ajudar…
Abraços[/quote]
Cara,
Essa explicação foi simplesmente perfeita. Muito clara!! Obrigada.