当前位置:  技术问答>java相关

java菜鸟问一个类似c++中vtable的问题

    来源: 互联网  发布时间:2015-07-28

    本文导语:  java要支持虚函数,所以会用到类似c++中的vtable, 在c++中,如果类C多重继承自两个不同的抽象类(类A和类B),那么类C中就会有 两个vtable,一个存放类A的虚函数指针,另一个存放类B的虚函数指针, 那么请问: 如果我的一...

java要支持虚函数,所以会用到类似c++中的vtable,
在c++中,如果类C多重继承自两个不同的抽象类(类A和类B),那么类C中就会有
两个vtable,一个存放类A的虚函数指针,另一个存放类B的虚函数指针,
那么请问:
如果我的一个java类继承了两个不同的java接口(interface),请问,它有没有vtable,
有几个,是怎样实现多态的.

|
你用过java.lang.reflect这个包里的东西吗?
甚至于对各个厂商,实现是可能不一样的.你知道怎样用就行了.至少我是这样的.

|
java没有虚函数的概念,java中所有的函数都是"虚"的,java不需要vtable来实现dynamic binding,因为它总是间接寻址的。

所以java没有c++语言中vtable的概念。


|
我认为(个人观点):

1.Java中对Interface不是继承,而是实现(implements);
2.Java中对借口的实现要求必须具体实现该借口的methods;
3.接口没有构造函数和析构函数的;

所以,我认为Java中没有多继承,只是使用interface对多继承进行模拟,但效果非常好。
--------------------------------------------
CSDN论坛助手很棒,希望以后更好,我坚决拥护!

|
java实现多态,也是类似vtable那一套。

因为java是仿照C++设计的

|
java中实现多态主要有两种方法:
1、重载,这个应该不要多说了。
2、覆盖,即子类定义的方法覆盖父类的方法,如下面的程序中,
import java.io.*;

public class Test
{
public static void main(String argsp[])
{
A a=new A();
B b=new B();
function(a);
function(b);

}
static void function(A a)
{
a.f();
}

}

class A
{
void f()
{
System.out.println("This is in class A.");
}
}

class B extends A
{
void f()
{
System.out.println("This is in class B.");
}
}
是B类中的方法f()覆盖A类中的f(),即,在对象b中,只有一个方法f(),即子类中的,所以不需要用vtable.

|
blue_teeth (小小蓝牙) :
接口相当于C++的只有纯虚函数的纯抽象类。
你用C++试验一下就可以了。
另外 还可以参考一下COM的实现方法。


|
接口不是继承,根本不存在什么虚函数表的问题
接口和抽象类的设计意图本质不同

|
我认为Java中的接口主要是为了实现C++中的多重继承。但同时又提供了一种比多重继承更灵活的一种实现。
Java中的接口将实现与方法完全分离,在接口中只提供一种约定,在真正的实现中可以根据约定,实现适合于自己的方法。

************************
我是Java的初学者,接触Java有三个月的吧,以前是学习VB的,提出的看法有许多不足,还请各位大侠多多指教,谢谢!

|
faint. 
Java当然有类似vtable的东西。否则怎么实现rtti, virtual function 啊?
不论implements还是extends, 对象模型上都是一样的。不过Java的实现更简单,当然没那么高效。

个人没有验证过,听一个教授说,Java用的是类似于hashtable的方法来检索虚函数的。当然,这样的hashtable一定在cache中。

仔细想想,应该是合理的。C++的vtable用offset, 比hashtable快。但问题是,对多重继承需要有多个vtable, 并且指针赋值有可能改变指针值。
如:
class D:public B1, B2{};
D* pd = new D;
B2* p = pd;
这里,隐含着一个指针offset的调整。
更讨厌的是:
还要检查pd是否为0, 如果是0,就不调整。相对于指针赋值这样的小操作,这可是很大的开销!

另外,允许一个指针指向不是对象开始的地方,对gc算法来说也是一个大挑战,即使是可能的话。

实现vtable一般有三种方法,
1. C++的方法,简单的offset。对多重继承可能要几个vtable. 指针赋值开销大。
2. java的方法,用hashtable. 一个vtable就够了。
3. 用offset, 但用涂色算法来决定offset(不是接口中第一个函数就一定在offset 0). 只要一个vtable, 没有offset调整,所以没有指针赋值的开销。也没有hashtable的开销。最快。问题是,编译程序必须知道整个类的hierarchy.象Java这样允许动态加载类的语言是不能用的。



|
java取消多重extends,是因为多重实现继承有语义上的问题。
class A{
   void f(){...}
}
class B{
   void f(){...}
}
class C extends A, B{
}

new C().f()有二义性。
当然,C++用c.A::f()和c.B::f()来区分。但Java不想把语言搞得没必要的复杂。

而且对以下的代码:
C c = new C();
A a = c;
a.f();
B b = c;
b.f();

同一个对象,调用同一个函数,却产生不同的结果。这样的语义是很丑陋的。
Java不能容忍这样的事发生, 因为在Java里,有这样的简单的invariant: 一个对象,不论它的静态类型是什么,对某一函数signature的调用永远都指向同一个函数体。

    
 
 

您可能感兴趣的文章:

  • 我把JAVA和C++都搞混了,希望JAVA、C++爱好者给我讲讲里面的程序注释问题在JAVA和C++中都有哪些不同。
  • 学JAVA真的比C++好吗???真的比C++有前途吗?????
  • 怎样编译java, C++
  • java是不是和c++差不多?
  • 我学了3年C++,想转Java
  • java 与 C++ 实现后绑定的方法
  • c++转java 望高手指教
  • 接口?java 怎会有这东东?c++ 都没有
  • 怎样将标准的C++代码转换成JAVA代码??
  • 一个关于c++和java 的区别?
  • Java转C++代码工具 J2C
  • Java/JavaScript API 的 C++ 实现 libj
  • 学c++好还是java好?
  • 各位在linux下常用什么工具开发 , C , C++ 还是 Java ? 那个比较普遍一些
  • 大家说java没有指针,是好还是坏呢,为什么c++中
  • 请问如何在一个java程序中加载 C或c++程序??
  • 有c++基础,学习java需要多长时间?
  • 新手如何加入开源项目 有什么好的c++,java 开源适合新手 请指点!
  • Unix环境下,c++如何调用java写的webservice?
  • java用什么方法代替C++里的引用功能,菜鸟小问题
  • 怎样从一个菜鸟级的java programer升级到一个菜鸟级的java developer
  • ----菜菜鸟第三问:-菜鸟菜问:JAVA如何求 根号、开次方? -----
  • 菜鸟的问题:java与java script 的异同??
  • Java菜鸟想学Java,请高手指教!(内有内容)
  • 菜鸟,java的运行问题
  • 菜鸟问题:unix中有像windows那样的自定义的环境变量吗?用java如何取
  • 一个菜鸟的关于Java
  • Java菜鸟之才鸟问题
  • 菜鸟问题:在Java中如何接收从键盘输入的字符串?
  • 菜鸟问题:如何让jsp来获取与之关联的java 数据(赚分了)
  • 大虾们,我是JAVA菜鸟,请问你们用什么JAVA开发工具???(回答有分)
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • shell如何做成类似java的List
  • 请问那里可以下到类似于jBuilder帮助里的java reference?(想要JAVA的帮助)
  • SecureCRT上运行一个JAVA程序,该程序类似一个在WINDOWS下一直运行的CMD窗口的东西,SecureCRT关掉后,JAVA还会继续运行吗?
  • java 在Unix下有没有类似于Windows SDK的东西
  • Java有类似的“MSDN”吗?
  • 如何用JAVA做类似服务的一类程序?
  • 怎样用java 写一个类似画板的程序
  • java有没有类似msdn的帮助文档?叫什么名称?在那里下载?
  • 请问JAVA有没有类似与MSDN的帮助资源
  • 请教java中如何实现vb中chr() ,asc() 类似的功能?
  • JAVA里有没有类似SLEEP的函数?
  • JAVA中有没有类似VB中IIF的方法
  • java 的条件判断函数(类似于别的语言iif函数)
  • 请大家推荐在日文系统下好的java编辑器(类似jcreator),谢谢!!
  • 哪位高手能提供一个类似cell的控件(在java下使用)?
  • java中如何实现类似vb中的chr()函数的功能?
  • 请问JAVA有类似MSDN这样的东西吗?
  • java的帮助在哪?类似msdn的??
  • 急!大家谁有类似visio的java实例或代码?
  • help! JAVA下有类似VC++ 下的socket 类吗?请各位高手看一下!!
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • 本人想学java,请问java程序员的待遇如何,和java主要有几个比较强的方向
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: stringflavor定义及介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3