Classes e Objetos

7 respostas
airmigjr

Pessoal, tenho uma dúvida, e se possível, se alguém pudesse me dar um exemplo com código seria interessante para eu entender:

Quando eu tenho uma situação do tipo:

ClasseA ca = new ClasseB();

O que significa isso? Como um objeto criado da classe B pode se tornar um objeto da classe A ?

Vejo isso várias vezes, por exemplo na conexão do banco em JDBC, etc…

Alguém poderia me explicar e dar um exemplo ?

7 Respostas

freakazoid
Calendar c= new GregorianCalendar();

No exemplo acima Calendar é uma classe abstract e a classe GregorianCalendar é uma classe que estende Calendar.
Da uma pesquisada sobre o modificador abstract.

Abs!

S
airmigjr:
Pessoal, tenho uma dúvida, e se possível, se alguém pudesse me dar um exemplo com código seria interessante para eu entender:

Quando eu tenho uma situação do tipo:

ClasseA ca = new ClasseB();

O que significa isso? Como um objeto criado da classe B pode se tornar um objeto da classe A ?

Vejo isso várias vezes, por exemplo na conexão do banco em JDBC, etc...

Alguém poderia me explicar e dar um exemplo ?

Considere o seguinte:

class A {

void algumaCoisa() {
System.out.println("Classe A");
}

}

class B extends A {

void algumaCoisa() {
System.out.println("Classe B");
}

}

Quando você fizer:

A variavel = new B();

Você está dizendo: Crie uma variável de referência do tipo A com o nome de "variavel" e crie um objeto do tipo B e faça váriavel se referenciar a ela.

Por que isso é possível?

Porque B herda de A então B é um A. Se a classe Cachorro herda de Animal então Cachorro É um Animal.

No caso, as variáveis do tipo A só aceitam objetos do tipo A, como B é um A ele a aceita.

Quando você chamar o metodo algumaCoisa() ele irá imprimir "Classe B" porque em tempo de execução ele sabe qual método ele deve chamar.

Isso é polimorfismo. Estude isso.

airmigjr

Na verdade eu até estou estudando polimorfismo. Mas porque não fazer simplesmente (como disse no seu exemplo), se B herda de A,

ClasseB b = new ClasseB();

porque se referenciar a Classe mãe ???

Aleksandro

airmigjr:
Na verdade eu até estou estudando polimorfismo. Mas porque não fazer simplesmente (como disse no seu exemplo), se B herda de A,

ClasseB b = new ClasseB();

porque se referenciar a Classe mãe ???

Animal é a classe mãe e possui os métodos nascer() e morrer() ;

Mamífero é um Animal portanto herdará: nascer() e morrer() da classe mãe , mas também precisa ter o método mamar();

Cachorro é um Animal mamífero desta forma herdará: nascer() , morrer() e mamar () , mas também precisa ter o método latir () por exemplo.

K

airmigjr:
Na verdade eu até estou estudando polimorfismo. Mas porque não fazer simplesmente (como disse no seu exemplo), se B herda de A,

ClasseB b = new ClasseB();

porque se referenciar a Classe mãe ???


imagine se você por alguma razão não quer usar o método com o comportamento exclusivo da Classe B e o da Classe A te satisfaz.
por exemplo:

Child c = new Child();

 c.doStuff(); // isso chama o método da classe Child.doStuff()

 

 Parent p = new Child();

 p.doStuff(); // Isso chama o método da classe Parent.doStuff()
x111
airmigjr:
Na verdade eu até estou estudando polimorfismo. Mas porque não fazer simplesmente (como disse no seu exemplo), se B herda de A,

ClasseB b = new ClasseB();

porque se referenciar a Classe mãe ???


Pelo que você mesmo disse Polimorfismo! A chave do polimorfismo é que a classe que herda pode implementar um novo comportamento ou modificar o comportamento da classe herdada.

Por que ClasseA A = new ClasseB() e não ClasseB b = new ClasseB()? Bom vamos imaginar uma classe chamada Impressora.
class Impressora {
  private String titulo;
  private String corpo;
  private String rodape;

  public void definirTitulo(String titulo){
    this.titulo = titulo;
  }

  public void definirCorpo(String corpo){
    this.corpo = corpo;
  }

  public void definirRodape(String rodape){
    this.rodape = rodape;
  }
  
  public void imprimir(){
    if (titulo != null)
      System.out.println(titulo);
    if (corpo != null)
      System.out.println(corpo);
    if (rodape != null)
      System.out.println(rodape);
  }
}
Ai você cria uma outra classe para um relatório por exemplo
class Relatorio {
  private Impressora impressora;

  public Relatorio(){
    impressora = new Impressora ();
  }
  
  public void imprimirDados(String titulo, String corpo, String rodape){
    impressora.definirTitulo(titulo);
    impressora.definirCorpo(corpo);
    impressora.definirRodape(rodape);

    impressora.imprimir();
  }
}
Só que você pode precisar criar uma classe para imprimir um comprovante então você faz:
class Comprovante {
  private Impressora impressora;

  public Comprovante(String titulo, String dados){
    impressora = new Impressora ();

    impressora.definirTitulo(titulo);
    impressora.definirCorpo(dados);
  }
  
  public void emitir(String rodape){
    impressora.imprimir();
  }
}
Só que um dia você tem que alterar e fazer uma classe que imprima na tela e em papel, como você não é bobo reaproveita o código né
class Impressora {
  protected String titulo;
  protected String corpo;
  protected String rodape;
  ...
}

class ImpressoraEmPapel implements Impressora {
  @Override 
  public void imprimir(){
    //Implementação para papel digamos que seja algo como:
    ImpressoraDeVerdade impressora = new ImpressoradeVerdade
    
    //O método imprimir campo é do tipo imprimirCampo(texto, posicaoX, posicaoY);
    impressora.iniciar();
    impressora.imprimirCampo(titulo, 0, 0);
    impressora.imprimirCampo(corpo, 0, 1);
    impressora.imprimirCampo(rodape, 0, 20);
    impressora.terminar();
  }
}
só que agora o bicho pega. Você vai ter que fazer um monte de IFs
class Comprovante {
  private boolean imprimirEmPapel;
  private Impressora impressoraNormal;
  private ImpressoraEmPapel impressoraPapel;

  public Comprovante(boolean imprimirEmPapel; String titulo, String dados){
    this.imprimirEmPapel = imprimirEmPapel;
    
    if (imprimirEmPapel)
      impressoraPapel = new ImpressoraEmPapel();
    else
      impressoraNormal := new Impressora();

    if (imprimirEmPapel){
      impressoraPapel.definirTitulo(titulo);
      impressoraPapel.definirCorpo(dados);
    }
    else{
      impressoraNormal.definirTitulo(titulo);
      impressoraNormal.definirCorpo(dados);
    }
  }
  
  public void emitir(String rodape){
    if (imprimirEmPapel)
      impressoraPapel.imprimir();
    else
      impressoraNormal.imprimir();
  }
}
Imagina agora vai ter que fazer a mesma coisa para a Classe Relatorio e todas as classes que usam né! Para isso que existe o polimorfismo, olha como fica bem mais simples;
class Comprovante {
  private Impressora impressora;

  public Comprovante(boolean imprimirEmPapel; String titulo, String dados){
    if (imprimirEmPapel)
      impressora = new ImpressoraEmPapel()
    else
      impressora = new Impressora ();
    ...
  }
}
Não precisso mexer na classe inteira para fazer isso.

Esse é um exemplo beemm simples para você entender. O mais correto nesse caso é usar interfaces, enviar a impressora pelo construtor entre outros. Mas não se preocupe com isso se você ainda não estudou

airmigjr

Obrigado a todos.
O último exemplo foi bem esclarecedor!

Obrigado.

Criado 13 de março de 2013
Ultima resposta 13 de mar. de 2013
Respostas 7
Participantes 6