Desafio - Redefinição de método

19 respostas
J

Tenho a classe Classe1

public class Classe1 {
    
  public Classe1() {
    imprimeNomeDaClasse();
  }
  
  public void imprimeNomeDaClasse() {
    System.out.println("Método da Classe1");
  }
}

Tenho a classe Classe2

public class Classe2 extends Classe1 {
  
  public Classe2() {
    super();
  }
  
  public void imprimeNomeDaClasse() {
    System.out.println("Método da Classe2");
  }
  
  public static void main (String args[]) {
    new Classe2();
  }
}

Este desafio é dividido em duas partes… mas vamos ao primeiro: O que será impresso e porque…

:idea:

19 Respostas

I

Sera escrito o metodo da classe 2, pois foi feito um Overriding da classe imprimeNomeDaClasse.

Nota: Overriding é a capacidade de uma subclasse mudar o comportamento herdado da Superclasse,ou seja, um metodo herdado pode ser reescrito.

T

Será impresso “método da classe 2”

pq o construtor xama super();

invoca o seguinte…

Classe1()

e dentro de Classe1() ele invoca o método

imprimeNomeDaClasse() …

que foi sobrescrito na classe 2…

asism imprimira o da 2

abraços

J

É isso ae…

Utilizando este exemplo… e se agora eu quisesse utilizar o método da superclasse e não a da subclasse que a redefiniu…

Ou seja…

public Classe1() { 
   // Chamar o método imprimeNomeDaClasse() desta classe e não a 
   // da subclasse que a redefiniu.
  }

:wink:

T

public Classe1() { this.imprimeNomeDaClasse(); }

ti bei =P

J

“TomazLavieri”:
public Classe1() { this.imprimeNomeDaClasse(); }

ti bei =P

Assim não vai funcionar… pois a referência this irá conter a referência da subclasse (Classe2).
Continua utilizando o método da Classe2.

:idea:

T

fazer isso na Classe1 … eu realmente não to sabendo fazer

=]

espero resposta

“JavaTeco”:
É isso ae…

Utilizando este exemplo… e se agora eu quisesse utilizar o método da superclasse e não a da subclasse que a redefiniu…

Ou seja…

public Classe1() { 
   // Chamar o método imprimeNomeDaClasse() desta classe e não a 
   // da subclasse que a redefiniu.
  }

:wink:

J

Vamos ver se alguém mas se prontifica a resolver o problema…

Mas já bolei uma resposta…

:wink:

J

no caso eu usaria o super(que se referencia ao método da classe à qual eu extendi)

algo assim,

super.imprimeNomeDaClasse();

=)

ou kra, legal isso ai dos exercícios aqui… continue postando… é interessante =)

J

Tb não vai funcionar… Quer dizer, vai dar erro de compilação…

Porque? Porque o super dentro da classe Classe1 irá buscar os métodos e atributos de sua super classe (que neste caso é o Object).

:picando:

J

Ueh mas a super classe do Classe2 num é Classe1???

se for ele via buscar da Classe1…

J

“jujo”:
Ueh mas a super classe do Classe2 num é Classe1???

se for ele via buscar da Classe1…

Sim… a Classe1 é super classe. Mas quando vc utiliza o operador super no escopo da Classe1, vc está “referênciando” Object (super classe da classe Classe1). Já o operador this, irá conter uma referência para a subclasse (Classe2), ou seja, no escopo da Classe1 o operador this terá uma “referência” para a Classe2. Por isso, quando é utilizado o this.imprimeNomeDaClasse(); não é chamado o método da Classe1 (e sim da Classe2).

T

entuam poste a resposta… q eu não vi a solução…

vlw

J
public class Classe1 {

  public Classe1() {
    try {
      Classe1 c1 = (Classe1)this.getClass().getSuperclass().newInstance();
      c1.imprimeNomeDaClasse();
    }
    catch (Exception ex) {
    }
  }

  public void imprimeNomeDaClasse() {
    System.out.println("Método da Classe1");
  }
}
public class Classe2 extends Classe1 {

  public Classe2() {
    super();
  }

  public void imprimeNomeDaClasse() {
    System.out.println("Método da Classe2");
  }

  public static void main (String args[]) {
    new Classe2();
  }
}

Tá ai…
Como o this é uma “referência” a Classe2, então eu usei o método getClass() para retorna sua classe, consequentemente para buscar sua super classe usei o método getSuperclass() (que retorna a classe Classe1). Depois instânciei a mesma com o método newInstance(). Ai é só chamar o método imprimeNomeDaClasse().

É só colocar o código e verificar…

Blz??? :wink:

C

Bom galera, não sei se entendi a questão, mas se vcs quiserem usar o método da super classe e não o da subclasse (o que foi sobreescrito) no main() da subclasse dêem new na super classe !

public class Classe1 {

public Classe1() {

imprimeNomeDaClasse();

}
public void imprimeNomeDaClasse() {

System.out.println(Método da Classe1);

}

}

class Classe2 extends Classe1 {

public Classe2() {

super();

}
public void imprimeNomeDaClasse() {

System.out.println(Método da Classe2);

}
public static void main (String args[]) {

Classe1 classe1 = new Classe1();

//vai usar o método original

classe1.imprimeNomeDaClasse();

//new Classe2();

}

}

Saída:

Método da Classe1

Método da Classe1

Process exited with exit code 0.

Imprime duas vezes por causa do construtor que já tem a chamada ao método imprimeNomeDaClasse.

T

Solução horrorozaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

FEIA!!! triste!!!!1....
UAUHUHAUHAUHAUHA

cinceridade..... vc quer forçar alguma coisa... faz métood privado... ficou FEIO...muito feio.... feio d ++
além disso... quando vc nao pensou no seguinte....

quando cv faz....
Classe3 extends Classe2 ... e cria um da classe 3.... ele imprime método da classe 2 e da classe 1 .... huuhuhuhuh por cuasa que vc instancia lá .... bem feiosamente.... entaum isso ai nào é seguro....

horosso.... entaum isso ai não é um solução... ao menos eu não é uma solução que vai valer ....

pq eu posos extender quantas vezes eu quizer... e ele devia sempre imprimir o da classe 1... o q naum ocorre =PPPPPP

não gostei da solução.... e pra mim nem é solução =PPPPPPP

abraços

"JavaTeco":
public class Classe1 {

  public Classe1() {
    try {
      Classe1 c1 = (Classe1)this.getClass().getSuperclass().newInstance();
      c1.imprimeNomeDaClasse();
    }
    catch (Exception ex) {
    }
  }

  public void imprimeNomeDaClasse() {
    System.out.println("Método da Classe1");
  }
}
public class Classe2 extends Classe1 {

  public Classe2() {
    super();
  }

  public void imprimeNomeDaClasse() {
    System.out.println("Método da Classe2");
  }

  public static void main (String args[]) {
    new Classe2();
  }
}

Tá ai....
Como o this é uma "referência" a Classe2, então eu usei o método getClass() para retorna sua classe, consequentemente para buscar sua super classe usei o método getSuperclass() (que retorna a classe Classe1). Depois instânciei a mesma com o método newInstance(). Ai é só chamar o método imprimeNomeDaClasse().

É só colocar o código e verificar....

Blz??? :wink:

J
"TomazLavieri":
Solução horrorozaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

FEIA!!! triste!!!!1....
UAUHUHAUHAUHAUHA

cinceridade..... vc quer forçar alguma coisa... faz métood privado... ficou FEIO...muito feio.... feio d ++
além disso... quando vc nao pensou no seguinte....

quando cv faz....
Classe3 extends Classe2 ... e cria um da classe 3.... ele imprime método da classe 2 e da classe 1 .... huuhuhuhuh por cuasa que vc instancia lá .... bem feiosamente.... entaum isso ai nào é seguro....

horosso.... entaum isso ai não é um solução... ao menos eu não é uma solução que vai valer ....

pq eu posos extender quantas vezes eu quizer... e ele devia sempre imprimir o da classe 1... o q naum ocorre =PPPPPP

não gostei da solução.... e pra mim nem é solução =PPPPPPP

abraços

"JavaTeco":
public class Classe1 {

  public Classe1() {
    try {
      Classe1 c1 = (Classe1)this.getClass().getSuperclass().newInstance();
      c1.imprimeNomeDaClasse();
    }
    catch (Exception ex) {
    }
  }

  public void imprimeNomeDaClasse() {
    System.out.println("Método da Classe1");
  }
}
public class Classe2 extends Classe1 {

  public Classe2() {
    super();
  }

  public void imprimeNomeDaClasse() {
    System.out.println("Método da Classe2");
  }

  public static void main (String args[]) {
    new Classe2();
  }
}

Tá ai....
Como o this é uma "referência" a Classe2, então eu usei o método getClass() para retorna sua classe, consequentemente para buscar sua super classe usei o método getSuperclass() (que retorna a classe Classe1). Depois instânciei a mesma com o método newInstance(). Ai é só chamar o método imprimeNomeDaClasse().

É só colocar o código e verificar....

Blz??? :wink:

:oops:

Faleu pela motivação... Não gostei nem um pouco da maneira que vc postou sou resposta... ajudo os outros e posto estes desafios para aprender outras soluções e ajudar num estudo mais avançado.... Acho que sua conduta deveria ser diferente... como por exemplo, sugerir modificações.... eu sei muito bem quando declarar um método privado, mas neste exemplo era apenas para nós focarmos o problema.... E outra coisa, se vc ler bem qual era o problema ser resolvido não teria escrito isso:

Classe3 extends Classe2 ... e cria um da classe 3.... ele imprime método da classe 2 e da classe 1 .... huuhuhuhuh por cuasa que vc instancia lá .... bem feiosamente.... entaum isso ai nào é seguro....
T

JavaTeco,
primeiramente me desculpe :oops:

meu pos foi em tom de bricadeira e não de agração... desculpa ia se ofendi....

pode ver que estou rindo durante o post todo...

vi sua solução e testei… e vi que ele vai rodar OK pra o que vc pediu…

realmente mesmo solucionando… axo algo meio louco :freaked: :freaked: :freaked:

mas foi em tom de brincadeira mesmo…

foi mau ai … não me interprete mau =] … e gostei muito de sua iniciativa de desafios…

quando tentei solucionalo … estava sempre tentado resolver através das boas praticas… e não tinha tentando um solução tão “estranha” como a passada por vc… mesmo assim =] vlw ai pelo problema

e desculpa se me espressei mau ok???

amigos again ???

Eu pensei realmente que o problema era mesmo que fosse reescrito em sub-classes o método… ele deveria continuar imprimindo o método da classe filha… =)

abraços… mas vc tem q concordar q a sua solução é estranha :confuso: :confuso: :confuso:

abraços

J

Blz, claro que amigos… hehehheehheehheeh :smiley:

Então vamos em buscar de uma solução mais elegante… e não tão loca… hehheheheheheh

Blz…

T

minha soluçao simples era tacar private no método =]

algo assim

public class Classe1 {

  public Classe1() {
     imprimeNomeDaClassePrivate();
  }
   
  private void imprimeNomeDaClassePrivate() {
    System.out.println("Método da Classe1");
  }
   
  public void imprimeNomeDaClasse() {
    imprimeNomeDaClassePrivate();
  }
}
Criado 25 de março de 2004
Ultima resposta 26 de mar. de 2004
Respostas 19
Participantes 5