小弟我以为的java虚函数(或者说接口),欢迎大家讨论,指正
我以为的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 codepublic 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++确实不一样