Duvidas de OO

9 respostas
airmigjr

Pessoal, o que significa isso em OO?
“Dimension dim = getToolkit().getScreenSize();”
Estou chamando dois métodos?
Se fosse “Dimension dim = getToolkit()”, entendo que o retorno do método getToolkit() seria do tipo Dimension, e armazenado no objeto dim. Minha resposta estaria correta? Porque de dois métodos separados por ponto? De que matéria estamos falando? Orientação à Objetos mesmo? Algum capítulo em específico?
Fiz todas essas perguntas porque depois de aprender um pouco de OO, aparecem coisas que nunca vi, e assim duvido da qualidade do meu aprendizado, imagino que tenha lacunas, e vocês me ajudando dizendo onde eu possa encontrar a resposta disso, eu possa correr atrás e não ficar toda hora amolando com perguntas estranhas…

1 [ ]
airmigjr

9 Respostas

L

Vou colocar um exemplo mais simples.

class Pessoa {
  ...
  Endereco getEndereco();
  ...
}

class Endereco {
  ...
}

Endereco endereco = getPessoa().getEndereco();
//Que eh o mesmo que
Pessoa pessoa = getPessoa();
Endereco endereco = pessoa.getEndereco();

O que a primeiro faz chamando dois métodos separados por ponto é recuperar a pessoa, pelo método getPessoa(), e depois recuperar o endereço da pessoa pelo getEndereco() sem necessidade de criar a variável pessoa para isso.

class A {
  B getB();
}

class B {
  A getA();
}

A a = new A(); // crio A
a.setB(new B()); // crio um B para A
a.getB().setA(a)); // defino o A de B, cria uma referencia cíclica
B b = a.getB().getA().getB().getA().getB().getA().getB(); // Como os objetos estão amarrados, posso fazer isso sem problemas.
airmigjr

lsjunior,
agradeço imensamente sua resposta. Porém, será que vc teria um exemplo mais mobral, porque eu ainda não entendi.
Isso tudo tem um nome? Tipo, preu procurar a literatura no google se o seu próximo exemplo não funcionar para minha mente primata?

1 [ ]
airmigjr

airmigjr

Quanto ao exemplo:

class A {

B getB();

}
class B {

A getA();

}

A a = new A(); // crio A - [color=red]ATÉ AQUI ENTENDI PERFEITAMENTE[/color]
a.setB(new B()); // crio um B para A - [color=red]AQUI ENTENDI MAIS OU MENOS[/color]
a.getB().setA(a)); // defino o A de B, cria uma referencia cíclica - [color=red]A PARTIR DAQUI NÃO ENTENDI MAIS NADA[/color]
B b = a.getB().getA().getB().getA().getB().getA().getB(); // Como os objetos estão amarrados, posso fazer isso sem problemas.

mausexdd

procure por chamadas a metodos aninhadas. É Basicamente o que o amigo acima explicou , não tem muito oque acrescentar...

Vo tenta esclarecer....

[quote]
class Pessoa {  
  ...  
  Endereco getEndereco();  
  ...  
}  
  
class Endereco {  
  ...  
}  
//Pessoa possui um endereço , que é retornado pelo metodo getEndereço , só que para chama-lo voce precisa da instacia de pessoa .. sakou?

//Aqui o meu endereço = a pessoa que instanciei(retorna pessoa) + o metodo que retorna o endereço desta pessoa...                      
Endereco endereco = getPessoa().getEndereco();  
//Que eh o mesmo que  
Pessoa pessoa = getPessoa();  
Endereco endereco = pessoa.getEndereco();  


[/quote]
leoramos

Sim, isso tem um nome: Fluent Interface.
Abraço!

drsmachado

airmigjr, isso não é OO.
Isso é um recurso fornecido pela linguagem que, pode ou não, estar presente em outras linguagens que suportam OO.

O caso é, suponha que você é o objeto pessoa, da classe Pessoa.
Você, como qualquer objeto, possui atributos e realiza ações, os métodos.

Suponha que um dos atributos é o objeto CPF, da classe Documento.

Quando você precisa passar o CPF para alguém, primeiro é solicitado o nome e, então, o CPF, correto?

Isso significa que, foi acionado o método getPessoa, que retornou você, depois o método getNome e então o método getDocumento, que, por ter passado por herança, retornou o CPF

Pessoa mae = new Pessoa():
Pessoa airmigjr = new mae.getPessoa(); // nasceu vivo
airmigjr.setNome("nomeDeBatismo");
String nome = airmigjr.getNome(); // retorna o nome dado a você por teus pais.

Documento doc = airmigjr.getDocumento();//devolve o cpf
//lembre-se, documento é uma classe filha da superclasse documento, isso é herança, é OO

Isso tudo você conhece.

Agora, java permite que você trabalhe com os métodos e atributos de uma classe, mesmo que você nao a veja.
Ele manterá o objeto em memória e, por referência, você pode invocar os métodos de tal objeto.

String nome = mae.getPessoa()/*nasceu*/.getNome();/*retorna o nome da pessoa*/
Documento doc = mae.getPessoa()/*aqui é como se fosse Pessoa pessoa = mae.getPessoa();
Documento doc = pessoa.getDocumento();
*/.getDocumento();

Ou seja, você não invoca um método do método anterior, mas do resultado dele:

public class Teste {
	public static void main(String args[]){
		Teste ta = new Teste();
		ta.setA(1);
		ta.setB(2);
		ta.setC(3);
		Teste tb = new Teste();
		tb.setA(1);
		tb.setB(2);
		tb.setC(3);
		Teste tc = new Teste();
		tc.setA(1);
		tc.setB(2);
		tc.setC(3);
		System.out.println("Resultado: " + (ta.getA() + ta.getB() + ta.getC() - tb.getA() - tb.getB() + tb.getC() - tc.getA() - tc.getB() - tc.getC()));
	}
	int a; 
	int b;
	int c;
	public int getA() {
		return a;
	}
	public void setA(int a) {
		this.a = a;
	}
	public int getB() {
		return b;
	}
	public void setB(int b) {
		this.b = b;
	}
	public int getC() {
		return c;
	}
	public void setC(int c) {
		this.c = c;
	}
}

Se você somar 1 + 2 + 3 -1 -2 + 3 - 1 - 2 - 3 = 0, que é o que a JVM enxerga ao executar o método acima.

L

Continuando com Pessoa.

public class Pessoa {
  private String nome;
  String getNome() { return this.nome; }
  void setNome(String nome) { this.nome = nome; }
}

A classe acima tem um atributo(nome). Para pode alterar o nome eu obrigatoriamente devo usar o método set e para recuperar o método get(encapsulamento). A classe abaixo mostra como testá-la.

public class Main {
  public static void main(String [] args) {
    Pessoa pessoa = new Pessoa();
    pessoa.setNome("lsjunior"); // Definimos o nome da pessoa
    // Sem criar variável
    System.out.println("Pessoa: " + pessoa.getNome()); // Recuperamos o nome da pessoa
    // Criando uma variável
    String nome = pessoa.getNome(); // Idem ao exemplo anterior, mas vamos criar uma variável para referenciar o retorno do método get
    System.out.println("Pessoa: " + nome); // e imprime o nome, igual a parte anterior

    // Chamando métodos sequencialmente
    String nomeMaiusculo = nome.toUpperCase(); // Colocamos em maiúsculo
    String nomeSemEspacos = nomeMaisculo.trim(); // Tiramos os espaços do início e fim
    String nomeFinal = "----"+ nomeSemEspacos + "----";   // E adicionamos uns traços pra completar

   // As 3 linhas anteriores pode ser feita dessa forma
   nomeFinal = "----" + nome.toUpperCase().trim() + "----"; // Como foi mostra anteriormente, uma String tem o método toUpperCase() que retorna uma nova String com os caracteres em maiúsculo, sendo que uma String também tem o métódo trim(), que remove os caracteres de espaço e também retorna uma nova String. O que fizemos aqui foi que não declaramos uma variável para cada saída do método, já pegamos o retorno do método(String) e chamamos outro método da String retornada.
  }
}
airmigjr

mausexdd,
vamos ver se eu entendi,
o trecho abaixo:

Endereco endereco = getPessoa().getEndereco();

Estou criando um objeto endereco do tipo Endereco, com um conteúdo que será retornado pelo método getEndereco() que é um método (getter) que está retornando o endereço de um objeto pessoa que por sua vez retornou o objeto pessoa sei lá de onde... é isso mesmo?

1 [ ]

class Pessoa {    
  ...    
  Endereco getEndereco();    
  ...    
}    
    
class Endereco {    
  ...    
}    
//Pessoa possui um endereço , que é retornado pelo metodo getEndereço ,  que para chama-lo voce precisa da instacia de pessoa .. sakou?  
  
//Aqui o meu endereço = a pessoa que instanciei(retorna pessoa) + o metodo que retorna o endereço desta pessoa...                        
Endereco endereco = getPessoa().getEndereco();    
//Que eh o mesmo que    
Pessoa pessoa = getPessoa();    
Endereco endereco = pessoa.getEndereco();
airmigjr

lsjunior,
putz cara, agora esclareceu bem…
só ficou uma dúvida:

na pergunta original está assim:

Dimension dim = getToolkit().getScreenSize();

na sua resolução está assim:

nomeFinal = "----" + nome.toUpperCase().trim() + "----";

Vejo que você chamou trim() para o retorno de toUpperCase(), que seria tirar os espaços do conteúdo de nome, que já havia sofrido o resultado do método para colocar todas as letras em maiúsculo correto?
Ou seja, olhando pela ordem dos acontecimentos:

  1. João Gilberto
  2. JOÃO GILBERTO
  3. JOÃOGILBERTO
    acertei?
    A questão: Você usou o objeto [color=red]nome[/color].toUpperCase().trim(). E no código onde eu tive a dúvida, qual foi o lance? Porquê não tem nenhum objeto antes de get.Toolkit()?

Cara, até agora, pra vc e para todos, só um grande e sincero obrigado…

Criado 4 de novembro de 2011
Ultima resposta 4 de nov. de 2011
Respostas 9
Participantes 5