你用过java.lang.reflect这个包里的东西吗?
甚至于对各个厂商,实现是可能不一样的.你知道怎样用就行了.至少我是这样的.
甚至于对各个厂商,实现是可能不一样的.你知道怎样用就行了.至少我是这样的.
解决方案 »
- 小妹留学僧~关于java的问题,异国他乡向各位同胞大大求助啊,求助求助!
- 调用方法改变对象的值问题,String,Integer经过调用方法不改变值
- java初学者 马士兵java视频中线程这章的一个小程序编译通过,运行出错
- 请问在JAVA中,怎样获得PC系统中的硬盘分区。(也就是说C:\D:\;E:\等)
- 一个非常妖的问题,不知大侠们碰到过没有?
- 新手上路:关于列表框的(中文)值如何取?
- 初学JAVA 请教大家 一个JDK配置问题!(加分)
- 在加20分,IO问题, 快帮帮我
- javamail接收gmail邮件时一次只能接收一部分??
- Jtable如何设置指定行的颜色?
- NEWER 问一把发晕的初级题。(送分题)
- 关于, oracle 数据库
[email protected]谢谢大家
2.Java中对借口的实现要求必须具体实现该借口的methods;
3.接口没有构造函数和析构函数的;所以,我认为Java中没有多继承,只是使用interface对多继承进行模拟,但效果非常好。
--------------------------------------------
CSDN论坛助手很棒,希望以后更好,我坚决拥护!
因为我学的是c++,只知道c++是怎么用vtable来实现多态的。
所以对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.
因为当一个类implements一个interface时,它必须实现这个interface中的方法,那么这个方法就变成他自己的了,这更多态好像没多大关系。
接口相当于C++的只有纯虚函数的纯抽象类。
你用C++试验一下就可以了。
另外 还可以参考一下COM的实现方法。
在我问题的假设之下,如果一个java类继承了两个不同的java接口(interface),它的多态实现和c++一样,那就是说编译器级别上的效率基本上是一样的(因为这种方式下,c++的多态实现是以牺牲效率来达到的----参考c++对象模型),那java取消多继承的本意并不是想提高程序的执行效率,只是为了减少软件设计中因为类间耦合度太大而对软件的扩展性形成的破坏。
--------------------------------------------
CSDN论坛助手很棒,希望以后更好,我坚决拥护!
i love cpp programming.
Java中的接口将实现与方法完全分离,在接口中只提供一种约定,在真正的实现中可以根据约定,实现适合于自己的方法。************************
我是Java的初学者,接触Java有三个月的吧,以前是学习VB的,提出的看法有许多不足,还请各位大侠多多指教,谢谢!
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这样允许动态加载类的语言是不能用的。
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的调用永远都指向同一个函数体。
但希望大家能对此有更多的看法(任何看法都可以,希望大家发言)。所以,我想2周以后再给分。
java类实例化从Ojbect开始实例化直至本身,类的method area将压入堆栈,
最顶层的自然是类本身而不是父类的方法.调用时从栈的顶端向下找方法来调用.
java就是用这种方式来模仿C++的vtable运行方式的。我很感谢大家的解答,因为分最高只能到100,所以我都给大家加了10分,只是为了谢谢所以的人。对于有些牛人的答案,10分肯定是不够的,所以这里我再次谢大大大大大虾们一下 :)