本帖最后由 yang79tao 于 2011-02-23 14:11:15 编辑

解决方案 »

  1.   

    LZ,讨论语法问题应该是去java区...
    应用考虑的只是功能和效率
      

  2.   

    LZ想多了,java和C++的编译器规范不大一样,所以这么比较没有什么意义吧
      

  3.   

    LZ是要表达神马意思?
    Parent p = new Child();
    String str = p.test(); 
    这里只是简单地发生了运行时地动态绑定.我理解的应该是JVM会在对象的运行时确定是要调哪个函数.这个就只是一个语言特性吧.LZ把它想复杂了
      

  4.   

    如果我说的对,那么java里面的虚函数,虚类,接口什么的,就都是编译器校验语法所使用的约定罢了。另外还有一个观点,java里面所有函数都采用了类似c++的虚拟函数的实现方式(而与interface abstract等这些关键字无关,看观点一),如果正确,那java的速度如何保证,会多一次寻址。
      

  5.   

    LZ要是有兴趣,可以在上面子类跟父类再定义两个属性,变量名也相同.假设为v
    再Parent p = new Child();
    p.v;
    ( (Child) p ).v;
    会发生很多有趣的事情.
      

  6.   

    首先,java是从C演变而来的,所以借鉴很多C的东西,但是也摒弃了一些C的东西
    从C的角度来考虑java,那么java里的抽象方法和接口方法,都属于纯虚方法,也就是只有定义,没有实体。因为纯虚在C里被称为抽象,所以java里没有纯虚概念,只有抽象概念。
    所以java里没有C的所谓的“虚”方法,即抽象方法或接口方法,不能有实体。但java的一般方法的实现却采用C的虚方法的机制,即java的方法也是通过VTable(虚表)管理的,LZ可以试着用javap反编译class文件,可以看到函数调用的地方都会有virtual关键字。所以,从这个角度上来说,可以说java的方法全是虚方法。
      

  7.   


    你说的对啊,可是Parent和Child都没有任何地方有“虚”的含义啊!
    而什么动态绑定啊,多态啊,都是“虚”的概念。
    所以我说:java没有虚函数,或者说java里面全是虚函数!
      

  8.   

    Java的method本来就都是动态绑定的,除了private method。C++的private member function也可以是virtual的,Java里不行。
      

  9.   

    其实你这种想法完全是浪费你自己的时间。因为你的这种问题,对于根本没有学过C++的人来说,完全是不存在的。只有那些从C++过来的人才会有这种困惑。盲目的用一门语言里的经验去和另外一门语言里的经验做对比,甚至做假设(比如你对abstract关键字的假设),是缺乏经验的行为。
      

  10.   

    上面我也说了,java是借鉴C又摒弃一些C的东西,即去繁留简。java提倡简单,安全,所以java没有指针,即考虑都某些程序员忘记手动释放内存时系统自动管理。同样的,java也采取了“虚”函数的实现机制,即考虑到有些程序员忘记在方法前加上virtual关键字而导致多态调用的错误,即C的“虚”是自己保证的,而java的“虚”是系统自动保证的。所以java里做不到C的非“虚”方法。从面向对象的角度来考虑问题,这点是可以理解的,因为一个对象,只能有一个相同的对外接口,即子类重写或覆盖了父类的方法,那么对外就表现为子类的接口,而C的非“虚”方法,就表现为两个相同的接口,即父类接口和子类接口,这样容易混淆,不利于抽象上的设计。当然C的非“虚”也有非虚的好处,就好像C的指针有指针的好处一样。
      

  11.   

    楼主的这个问题提得好!!!
    受教了!楼上有些朋友要理解,确实有很多从c-》java 的。多种语言相互比较是学习的好方法,能融会贯通、加深理解。
      

  12.   

    java里有虚函数
    需要abstract声明 还有虚类 
    LZ可以百度一下
      

  13.   

    JAVA的方法覆盖规则和C++确实不一样
      

  14.   


    abstract声明的和虚函数概念无关
    abstract声明的只是为了让编译器进行检测该句代码有没有被强制覆盖