为什么JAVA里没有virtual关键字可以实现类的虚态?这样做的理由是什么?有什么好处?
C++要是没有virtual关键字的话就算是重载函数了~========================================================class CAnimal
{
public:
   virtual void display() //请注意这里,要是没加virtual关键子,打印出来的结果就是3个Animal了~~~~~~~~~~
   {
      printf("Animal\n");
   }
};
class CCat:public CAnimal
{
public:
   void display()
   {
      printf("Cat\n");
   }
};
class CPuma:public CCat
{
public:
   void display()
   {
      printf("Puma\n");
   }
};
class CDog:public CAnimal
{
public:
   void display()
   {
      printf("Dog\n");
   }
};int main(int argc, char *argv[])
{
    CCat cat;
    CPuma puma;
    CDog  dog;
    
    CAnimal *pAnimal[3]={&cat,&puma,&dog};
    for(int i=0;i<3;i++)
    {
            pAnimal[i]->display();        
    }
    
    system("PAUSE");
    return 0;
}==========下面的JAVA代码等同于上面的C++================
class CAnimal
{
public void display()    //请注意,这里根本没有virtual,是不是JAVA里的类默认可以实现虚函数,而不需要加virtual,为什么JAVA要这样设计呢?有什么理由呢?又有什么好处呢?
   {
      System.out.println("Animal");
   }
};
class CCat extends  CAnimal
{
public void display()
   {
      System.out.println("Cat");
   }
};
class CPuma extends CCat
{
public void display()
   {
      System.out.println("Puma");
   }
};
class CDog extends  CAnimal
{
public void display()
   {
      System.out.println("Dog");
   }
};public class virtualTest 
{
public static void main(String args[])
{
CCat cat=new CCat();
CPuma puma=new CPuma();
CDog dog=new CDog();
CAnimal  animal[]=new CAnimal[3];
animal[0]=cat;
animal[1]=puma;
animal[2]=dog;

for(int i=0 ;i<3; i++)
{
animal[i].display();
}

}
}

解决方案 »

  1.   

    c++的虚函数,纯虚函数之类的主要是为了解决多重继承的问题,在java中只有单继承,不存在这种情况
      

  2.   

    这就是JAVA中的POLYMORPHISM,神奇就神奇在这里了,JAVA中是 DYNAMIC BINDING, 编译时不知道具体使用哪个对象,只有到运行时才知道具体的对象.输出结果是:
    Cat
    Puma
    Dog
    事实上你这个JAVA代码中都没有POLYMORPHISM,只是体现了上溯造型(UPCASTING)而已.
    班门弄斧,请勿见笑!
      

  3.   

    C++当初用virtual来表示多态就是多余的
    其时一般情况下我们都把类的所有函数声明
    为virtual(除开构造函数)
    java也就是想通了这点,即干脆将方法默认就
    声明为virtual,而至于C++的纯虚函数,java
    就用abstract
      

  4.   

    个人觉得,C++用virtual 表明它不是
    纯面向对象的语言
      

  5.   

    C++的virtual可以让用户显式控制VMT
      

  6.   

    个人认为C++的纯虚函数,有点类似于java的接口.
      

  7.   

    个人认为Java里就没有virtual这个关键字,所以就不用写了。
      

  8.   

    gefengxztg(戈峰) 
    liujun999999(减肥中...) 说得好,其他人也不错
      

  9.   

    C++以效率为先,JAVA以简洁优美为准
    两种语言的哲学不同
    如果C++直接把所有函数都做成virtual 会损失很多效率,可以去研究一下vptr vtable
      

  10.   

    C++当初用virtual来表示多态就是多余的
    其时一般情况下我们都把类的所有函数声明
    为virtual(除开构造函数)
    java也就是想通了这点,即干脆将方法默认就
    声明为virtual,而至于C++的纯虚函数,java
    就用abstract
    ==============================================
    c++中把所有函数都声明为virtual的人,不配做一个c++开发人员,开发java最合适了。