首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

小弟我以为的java虚函数(或者说接口),欢迎大家讨论,指正

2012-01-29 
我以为的java虚函数(或者说接口),欢迎大家讨论,指正!本人初学java(因为学习android的缘故),所以欢迎大家指

我以为的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可以百度一下
------解决方案--------------------


啊哈 不好意思 理解错LZ的 意思了
[解决办法]
JAVA的方法覆盖规则和C++确实不一样

热点排行