1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

métodos virtuais em java

Discussão em 'Programação' iniciada por diler, 3 de Março de 2007. (Respostas: 10; Visualizações: 1534)

  1. Olá a todos.

    Recentemente tenho andado a estudar Java. Uma coisa que me está a fazer confusão é k não consigo declarar métodos virtuais sem serem puros (à imagem do c++). Vou tentar ilustrar com um exemplo:

    public class A{

    public String m(){return "A";}
    }


    public class B extends A{

    public String m(){return "B";}
    }

    main(){
    B b= new B();
    A a=b;
    a.m()
    }

    Aquando da execução deste codigo do main, como programador em c++, esperava que o resultado fosse "B", pois pensava que o método m() fosse um método virtual e como está redefinido na classe B por polimorfismo o codigo executado seria o da classe B. mas para mal dos meus pecados enganei-me. ou seja so consigo declarar metodos virtuais quando a classe A é abstracta (não conseguindo assim criar instancias desta, o que por vezes poderia ser util).


    Haverá outra forma de declarar métodos virtuais em java, podendo criar instancias da classe A??

    é que apenas consigo fazer o que pretendia da seguinte forma:

    public abstract class A{

    public String m(){return "A";}
    }


    public class B extends A{

    public String m(){return "B";}
    }

    Desta forma o resultado é B, mas não consigo criar instancias de A, como é normal...

    Será que alguem me pode dar uma ajuda??

    Obrigado.
     
  2. guilherme

    guilherme Power Member

    Se Crias um objecto de A e igualas a B, tb tinha ideia de ficar com o resultado de B, mas como são objectos diferentes, penso q tens de usar mesmo classes abstractas.
    Mas de qualquer modo podias definir apenas o método abstracto, se bem que tb não deve resolver nada.
     
    Última edição: 3 de Março de 2007
  3. O problema é que se o método é abstrato obriga a que a classe seja abstracta e este não pode ter código associado... E ia dar ao mesmo, não podia instanciar objectos dakela classe.
     
  4. Rui_Carlos

    Rui_Carlos 1st Folding then Sex

    acho que estás enganado... eu testei isso e o resultado do método m foi "B" e não "A".
     
  5. Todos os métodos em Java são virtuais.

    Todos os métodos em Java são viruais. O resultado do código será portanto "B". Claro, há vantagens e desvantagens nessa abordagem. Se se quiser que um método não possa ser substituído dever-se-á declará-lo «final».

    Francisco Colaço
     
  6. CyberOps

    CyberOps I'm cool cuz I Fold

    public class teste extends A{

    teste(){
    super();
    }

    public String m(){

    return "B";
    }

    public static void main(String []args){
    teste b= new teste();
    A a = new A();
    System.out.println(a.m());
    }
    }

    public class A{
    A(){
    m();
    }

    public String m(){
    return "A";
    }
    }

    isto aqui funca. consigo instanciar objectos pertencentes a classe A, e o resultado devolvido é B. O teu problema é mesmo neste linha: A a = new A();

    ele devia estar a amostrar o resultado devolvido por m() na classe A, nao é? porque é q n mostra?

    edit: my mistake. afinal mostra A quando inicializo uma instancia de A
     
    Última edição: 3 de Março de 2007

  7. Mas experimentas-t o 1º codigo do primeiro post??? é k o resultado mostra exatamente o contrario do que escreves-t. que os metodos em java não são todos virtuais...


    testas-te qual o primeiro ou segundo codigo que escrevi no post?? é que com o segundo código o resultado é B, mas nao posso instanciar objectos de A. No primeiro é A, disso tenho a certeza pk tb ja testei.
     
  8. Rui_Carlos

    Rui_Carlos 1st Folding then Sex

    o primeiro.
     
  9. Ok pessoal ja percebi... Andei a ler umas coisitas e a investigar e axo k ja percebi. Um método apenas é virtual quando uma classe é abstracta. em c++ quando numa classe temos métodos virtuais essa classe tambem nao poderá ser instanciada, tal como em java. Podemos ter ainda dois tipo de métodos virtuais diferentes:

    -Os virtuais puros, sem codigo associado.
    -Os virtuais, com algum codigo associado.


    Obrigado a todos.

    ps: Rui carlos é impossivel teres experimentado o 1º e tenha funcionado...
     
  10. guilherme

    guilherme Power Member

    podes perfeitamente ter 1 classe com apenas 1 método abstracto, apenas obriga a definir o método na hierarquia
     
  11. Rui_Carlos

    Rui_Carlos 1st Folding then Sex

    já há algum tempo que não programo a sério em Java, mas tenho quase a certeza de que estás enganado. em Java os método são determinados em tempo de execução de acordo com o tipo de um objecto (e não com o tipo da variável a que o objecto está associado).


    deixo aqui o código que eu usei:
    Código:
    public class A {
      public String m() {return "A";}
    }
    
    public class B extends A {
      public String m() {return "B";}
    }
    
    public class Main {
      public static void main(String[] args) {
        B b=new B();
        A a=b;
        System.out.println("m: "+a.m());
        System.out.println("classe: "+a.getClass().getName());
      }
    }
    o resultado foi este:
    Código:
    m: B
    classe: B
    usei o Java 1.5 (versão para MacOSX).


    ------

    métodos virtuais/C++ <=> método normal/Java
    métodos virtuais puros/C++ <=> métodos abstractos/Java
     

Partilhar esta Página