Duvida de casting

Pessoal, alguem poderia me explicar como funciona essa chamada com casting…pq naum é chamado o metodo da class testA?

[code]1. class TestA {
2. public void start() { System.out.println(“TestA”); }
3. }
4. public class TestB extends TestA {
5. public void start() { System.out.println(“TestB”); }

  1. public static void main(String[] args) {
  2. ((TestA)new TestB()).start();
  3. }
  4. }
    [/code]

Bom, em primeiro lugar.

No exemplo acima. você declarou que TestB extends TestA, ou seja, TestB herda todos os atributos e métodos da classe TestA, se você quiser chamar algum método da classe que você está herdando então você não precisa utilizar o casting.

faça assim:

   super.start();

Você pode usar o seu método start da classe TestB, lembre-se que no seu exemplo um objeto TestB também é um TestA, pois ele estende-o.

Casting a gente só usa quando tem a necessidade de pegar determinado dado e transformá-lo no formato em que precisamos trabalhar.

Mas lembre-se que existem métodos na API do Java que faz isso para você. Então sugiro que você dê uma pesquisada.

Bom, acho que vou ficando por aqui.

Qualquer dúvida é só postar.

então eu queria saber como vou saber qual metodo ele vai chamar usando essa chamada com casting

((TestA)new TestB()).start();   

Olá, cara nesse exemplo estamos trabalhando com o polimorfismo.

Poliformismo é uma maneira de invocar métodos (membros) de uma classe genérica através de referências de uma classe especializada.

No seu caso, a classe genérica seria TestA e dessa maneira TestB seria aa classe especializada.

Para você identificar o método que você irá invocar você terá que olhar para o tipo do objeto que você está criando, ou seja,

se você usar

 new TestA() 

você irá invocar o método dessa classe, e sendo assim, no seu exemplo

 new TestB() 

você irá invocar o método dessa classe, portanto, de TestB

O quê vai indicar para você, é o tipo do objeto que você está criando.

Abs.

A JVM invoca o método do tipo em tempo de execução nesse caso, assim mesmo que você force o casting para TestA, em tempo de execução a JVM identifica que o método está sendo executado em um tipo TestB. A única forma de você executar o método de TestA, neste override, é usando o super como o newbbc indicou… Pelo menos pelo que eu lembro era somente assim, tem um capítulo inteiro dedicado a OO no livro que estou usando para o SCJP, preciso revisar para ter certeza mas no momento ele está no escritório :confused:

E ai pessoal, valeu pela ajuda!!

esse codigo:

((TestA)new TestB()).start();

seria a mesma coisa desse:

TestB t = new TestB();
TestA = t;

abraço!

Como eu disse anteriormente se a sua classe TestB herda todos os atributos de TestA, se você quiser chamar os métodos da classe pai.

você usa:

super.start();//chamada do método start da Classe Pai TestA

Agora se você quer usar o método start da classe TestB então faça assim.

TestB t = new TestB(); t.start();//chamada do método start da classe TestB

Isso se você estiver trabalhando com herança.

A classe TestB vai herdar mesmo todos os atributos e métodos da classe TestA?