日期:2014-05-20  浏览次数:20913 次

我以为的java虚函数(或者说接口),欢迎大家讨论,指正!
本人初学java(因为学习android的缘故),所以欢迎大家指正我的错误!
我之前一直用c++,算是对c++比较了解(至少比java好)。
这里,我假设大家也懂c++。

首先,我的观点是:
java没有虚函数,或者说java里面全是虚函数!
先看c++例子:
[code=C]/C++
class P
{
public:
LPCTSTR test()
{
return _T("Parent");
}
};

class C : public P
{
LPCTSTR test()
{
return _T("Child");
}
};

P* pP = new C;
pP->test(); //此时等于 Parent
[/code]
如果把P里面的toString申明为虚函数,即:vitrual LPCTSTR test
上面的结果等于 Child
子类覆盖了父类的方法,这是通过虚表来实现的,这才是我认为的,真正的虚函数!

下面看java例子:
Java code

public class Parent {
    public String test() {
        return "Parent";
    }
}

public class Child extends Parent {
    public String test() {
        return "Child";
    }
}

Parent p = new Child();
String str = p.test(); //此时仍然等于 Child


大家看到了,在java里面,子类自然的覆盖父类,而不需要做abstract申明,所以我说,java里面全是(c++概念上的)虚函数!我以为,java里面的所谓虚函数(包括虚类,接口什么的),其实就是指不能被实现的东西(由子类来实现),仅此而已!abstract关键字其实不影响最终生成代码的结果,只是在编译阶段的一个语法校验(不能被实现)罢了!
而且,java也没有纯虚的概念,它的虚就是c++的线虚(不过这是小差别,不在本文讨论之列)。

在c++的世界里,如果有虚的东西,则会对最终生成代码的结果产生很大的不同,如果存在虚的(包括其父类),则会增加一张虚表(否则没有),以后对虚函数的调用将转变成(相对于不存在虚函数的情况)从虚表里面获取地址,然后再调用(等于多了一级寻址)。

------解决方案--------------------
LZ,讨论语法问题应该是去java区...
应用考虑的只是功能和效率
------解决方案--------------------
高手 啊 学习怎么多门技术
------解决方案--------------------
LZ想多了,java和C++的编译器规范不大一样,所以这么比较没有什么意义吧
------解决方案--------------------
LZ是要表达神马意思?
Parent p = new Child();
String str = p.test(); 
这里只是简单地发生了运行时地动态绑定.我理解的应该是JVM会在对象的运行时确定是要调哪个函数.这个就只是一个语言特性吧.LZ把它想复杂了
------解决方案--------------------
LZ要是有兴趣,可以在上面子类跟父类再定义两个属性,变量名也相同.假设为v
再Parent p = new Child();
p.v;
( (Child) p ).v;
会发生很多有趣的事情.
------解决方案--------------------
Java的method本来就都是动态绑定的,除了private method。C++的private member function也可以是virtual的,Java里不行。
------解决方案--------------------
其实你这种想法完全是浪费你自己的时间。因为你的这种问题,对于根本没有学过C++的人来说,完全是不存在的。只有那些从C++过来的人才会有这种困惑。盲目的用一门语言里的经验去和另外一门语言里的经验做对比,甚至做假设(比如你对abstract关键字的假设),是缺乏经验的行为。

------解决方案--------------------
探讨
如果我说的对,那么java里面的虚函数,虚类,接口什么的,就都是编译器校验语法所使用的约定罢了。

另外还有一个观点,java里面所有函数都采用了类似c++的虚拟函数的实现方式(而与interface abstract等这些关键字无关,看观点一),如果正确,那java的速度如何保证,会多一次寻址。

------解决方案--------------------
探讨

引用:
如果我说的对,那么java里面的虚函数,虚类,接口什么的,就都是编译器校验语法所使用的约定罢了。

另外还有一个观点,java里面所有函数都采用了类似c++的虚拟函数的实现方式(而与interface abstract等这些关键字无关,看观点一),如果正确,那java的速度如何保证,会多一次寻址。

上面我也说了,java是借鉴C又摒弃一些C……

------解决方案--------------------
楼主的这个问题提得好!!!
受教了!

楼上有些朋友要理解,确实有很多从c-》java 的。多种语言相互比较是学习的好方法,能融会贯通、加深理解。
------解决方案--------------------
恩,两个语言的编译原理都不一样,没有办法比较吧!
------解决方案--------------------
java里有虚函数
需要abstract声明 还有虚类 
LZ可以百度一下
------解决方案--------------------