java里面的向上造型是什么?_?抽象类和接口有什么关系?c++里面的虚函数是java里面的接口

作者&投稿:宰武 (若有异议请与网页底部的电邮联系)
C++中的虚函数和JAVA中的抽象方法有什么区别?~

  C++虚函数与JAVA中抽象函数比较
  1:java中没有虚函数的概念,但是有抽象函数的概念,用abstract关键字表示,java中抽象函数必须在抽象类中,而且抽象 函数不能有函数体,抽象类不能被实例化,只能由其子类实现抽象函数,如果某个抽象类的子类仍是抽象类,那么该子类不需要实现其父类的抽象函数。
  2:C++中的有虚函数的概念,用virtual 关键字来表示,每个类都会有一个虚函数表,该虚函数表首先会从父类中继承得到父类的虚函数表, 如果子类中重写了父类的虚函数(不管重写后的函数是否为虚函数),要调用哪个虚函数,是根据当前实际的对象来判断的(不管指针所属类型是否为当前类,有可 能是父类型),指针当前指向的是哪种类型的对象,就调用哪个类型中类定义的虚函数。每个类只有一张虚拟函数表,所有的对象共用这张表。
  C++的函数多态就是通过虚函数来实现的。
  3:C++中,如果函数不是虚函数,则调用某个函数,是根据当前指针类型来判断的,并不是根据指针所指向对象的类型。
  4:Java中,如果函数不是抽象函数,而是一个普通函数,它是默认实现类似C++中虚函数功能的,也就是说,调用某个函数,是根据当前指针所指向对象的类型来判断的,而不是根据指针类型判断。正好与C++中的普通函数相反。即:JAVA里自动实现了虚函数。

  C++ Java
  虚函数 -------- 普通函数
  纯虚函数 -------- 抽象函数
  抽象类 -------- 抽象类
  虚基类 -------- 接口
  纯虚函数: 主要特征是不能被用来声明对象,是抽象类,是用来确保程序结构与应用域的结构据具有直接映射关系的设计工具。带有纯虚函数的类称为抽象类,抽象类能被子类 继承使用,在子类中必须给出纯虚函数的实现,如果子类未给出该纯虚函数的实现,那么该子类也是抽象类,只有在子类不存在纯虚函数时,子类才可以用来声明对 象!抽象类也能用于声明指针或引用,或用于函数声明中。具有抽象类特性的类还有构造函数和析构函数,全部是保护的类。如果没有给出纯虚函数的实现,则在它 所在的类的构造函数或析构函数中不能直接或间接的调用它。纯虚函数的实现可以在类声明外进行定义。
  5. C++中一般都是把析构函数声明为虚函数。因为虚函数可以实现动态绑定,也就是到底调用哪个函数是根据指针当前指向哪个对象来确定的,不是根据指针的类型来确定。如果C++中不把析构函数声明为虚函数,那么其有个子类,重写了虚函数,那么当父类指针指向一个子类对象时,当调用析构函数时,只调用父类的析构函数,而无法调用子类的析构函数,所以一般情况是把析构函数声明为虚函数,实现动态绑定。当然如果一个类不包含虚函数,这经常预示不打算将它作为基类使用。当一个类不打算作为基类时,将析构函数声明为虚拟通常是个坏主意。
  标准 string 类型不包含虚函数,如果把String作为基类继承得到子类会出问题。
  总之:多态基类应该声明虚析构函数。如果一个类有任何虚函数,它就应该有一个虚析构函数;如果不是设计用于做基类或不是设计用于多态,这样的类就不应该声明虚析构函数。
  关于接口与抽象类:
  c++中没有接口的概念,与之对应的是纯虚类,即只含有纯虚函数的类,c++抽象类的概念是含有纯虚函数成员的类。这是因为c++提供多继承,而像java、c#这些只提供单继承(避免多继承的复杂性和低效性)的语言为了模拟多继承功能就提供了接口概念,接口可以继承多个。
  abstract class是抽象类,至少包含一个纯虚函数的类就叫做抽象类。
  但是如果一个类,所有的成员都是纯虚函数,那么它和一般的抽象类在用法上是有区别的。至少microsoft给的com接口定义全部都是仅由纯虚函数构成的类。因此把这样的类定义叫做纯虚类也不算错。
  纯虚函数和虚函数的区别在于前者不包含定义,而后者包含函数体。
  那么纯虚类就是不包含任何实现(包括成员函数定义和成员变量定义。前者代表算法,后者代表结构)。不包含任何算法和结构的类叫做纯虚类,应该没有问题。
  在java里面的确没有纯虚类的概念,因为java里没有纯虚函数这个概念。java管虚函数叫做abstract function,管抽象类叫做abstract class,直接说来,java根本没有virtual这个关键字,都用abstract代替,因此java里面根本就没有pure这个概念。有那就是interface。在interface里面定义的函数都不能有函数体,这个在java里面叫做接口。那么c++里面与interface等同的概念就是纯虚类了,c++用纯虚类来模拟interface这个抽象概念,因此这里说的“纯虚类”与java的abstract class不同,与c++的一般抽象类也不同。“纯虚类”与c++一般抽象类的区别就好比java里面interface 和 abstract class的区别。
  抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出。如果派生类中没有重新定义纯虚函数,而只是继承基类的纯虚函数,则这个派生类仍然还是一个抽象类。如果派生类中给出了基类纯虚函数的实现,则该派生类就不再是抽象类了,它是一个可以建立对象的具体的类。
  抽象类是不能定义对象的。

“这样问吧,C++中的抽象类是不是跟Java里面的接口一样,完全不能有方法的实现。 ” 不是这样,抽象类可以有部分方法实现,但至少要有一个纯虚函数的类才能叫抽象类。
举个例子:
Class A
{
public:
int GetNum(){return 0;} //该方法有实现过程
virtual void TPrintf() = 0; //没有实现过程
};
C++中虚函数是说白了就是父类定义为虚函数(关键词Virtual)并实现,子类可以继承函数名并重新实现函数过程,这样子类对象调用虚函数时就调到了自己实现的函数体里,跟父类没有关系了(当然可以用[父类名::虚函数名]来调用父类虚函数实现方法),这就实现了多态性。
纯虚函数不同的是父类绝对不能实现,且不能实例化,子类必须实现父类定义的虚函数接口,除非它也想成为抽象类。

举例:
Class B
{
public:
virtual void fun1(){ cout << "fun1";} //虚函数,子类不用声明或实现
virtual void fun2 = 0; //纯虚函数,子类必须声明并实现

};

向上造型一个泛型对象的引用

例如,假设我们有很多箱子,每个箱子里都装有不同的水果,我们需要找到一种方法能够通用的处理任何一箱水果。更通俗的说法,A是B的子类型,我们需要找到一种方法能够将C<A>类型的实例赋给一个C<B>类型的声明。

为了完成这种操作,我们需要使用带有通配符的扩展声明,就像下面的例子里那样:

List<Apple> apples = new ArrayList<Apple>();   

List<? extends Fruit> fruits = apples;   

“? extends”是泛型类型的子类型相关性成为现实:Apple是Fruit的子类型,List<Apple> 是 List<? extends Fruit> 的子类型。



JAVA中抽象类与接口是java语言中对抽象概念进行定义的两种机制。

  1. 我们都知道在面向对象的领域一切都是对象,同时所有的对象都是通过类来描述的,但是并不是所有的类都是来描述对象的。如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它,那么这样的类我们称它为抽象类。比如new Animal(),我们都知道这个是产生一个动物Animal对象,但是这个Animal具体长成什么样子我们并不知道,它没有一个具体动物的概念,所以他就是一个抽象类,需要一个具体的动物,如狗、猫来对它进行特定的描述,我们才知道它长成啥样。

  2. 接口是一种比抽象类更加抽象的“类”。这里给“类”加引号是我找不到更好的词来表示,但是我们要明确一点就是,接口本身就不是类。 接口是用来建立类与类之间的协议,它所提供的只是一种形式,而没有具体的实现。同时实现该接口的实现类必须要实现该接口的所有方法,通过使用implements关键字,他表示该类在遵循某个或某组特定的接口,同时也表示着“interface只是它的外貌,但是现在需要声明它是如何工作的”。

区别如下:

  1. 在语法层次,java语言对于抽象类和接口分别给出了不同的定义。

  2. 抽象层次不同。抽象类是对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。

  3. 跨域不同。抽象类所跨域的是具有相似特点的类,而接口却可以跨域不同的类。

  4. 设计层次不同。对于抽象类而言,它是自下而上来设计的,我们要先知道子类才能抽象出父类,而接口则不同,它根本就不需要知道子类的存在,只需要定义一个规则即可。


C++的虚函数和JAVA的interface

  • Java中的interface实现了函数多态性,并且实现了完全抽象的类。在这里还要提一下引用。因为interface实现了完全抽象的类,在接口中定义的方法完全看不到任何实现,而且也不能有任何的实现,接口中声明的类必须在引用其的类中实现。而多态性的实现正是通过不同引用中的不同的方法实现。

  • C++中的虚函数也和Java中接口类似,C++中的虚函数同样是将接口和实现分离,从而实现多态性。为了使用多态性,需要在基类中使用virtual来声明虚函数。所以,虚函数是在基类中定义,在其子类中重写实现,也可重写基类的函数。在使用虚函数的的时候,需要定义基类的指针来使用虚函数,否则就失去了虚函数的意义。

  • 其实两者都是为了实现多态性而存在,都需要通过继承来实现,只是Java中称为引用,与C++中的继承也是大同小异。




AVA一顿一顿的
呵呵,你这个配置再抱怨就无语了,我跟你配置基本差不多,中国的代理商本来就不怎么好,以前地下城就经常掉线,不是你家硬件的问题,检测你硬件你可以玩单机看看就知道了,如果没问题当然会是服务器的问题,不用担心,现在也是内测阶段,有问题可以向上反映,以后会更新这个问题的估计 ...

AVA战术,枪法拜托了各位 谢谢
AVA战术,枪法拜托了各位 谢谢 AVA... AVA 展开  我来答 1个回答 #热议# 已婚女性就应该承担家里大部分家务吗?囧Vd ...当然你蹲时建议鼠标向上抬,才能爆头! 4.近程>敌人狙击——近程狙击就怕他盲,建议绕着他跳,据我了解,一般人玩狙灵敏都很低,所以你在他背后去了瞄着他...

关于AVA激爽测试版本大家有什么感想么?
大不一样 ,韩服的准星镜口也是微但跳没国服的大。腾讯为了赚钱把他调大了没什么就是一点点,像付费的枪就不用说是大服提升属性了 关于激爽版不用我说你可以看见他不是战地了只是cf的画面升级版.对了在韩服中在切枪时没国服向上抬后向下落的镜口微抖只是在第一发子弹时想上一点 ...

Razer 金环蛇AVA纪念版鼠标重要参数
特别为竞技游戏用户设计,拥有3个功能键,可以自定义设置,满足你在游戏中的个性化需求。双向滚轮设计,无论是向上还是向下滚动,都能方便地浏览内容。人体工学上,采用对称设计,确保左右手使用者都能获得均衡的舒适度。兼容性方面,它支持Windows 7和Windows Vista操作系统,以及其他Windows系统版本,无需...

AVA要如何做一个出色的步枪手最好说说枪法战术都知道了
玩AK瞄准要尽量向上。现在为止几乎没什么高手玩AK扫射(不久前看到几个,很牛B)…… 嗯,AK47 绝对可以说是枪中旳王者,中远距离1枪爆头 KO.. 但是后座...经常在AVA里打比赛有些队友几乎没什么暴头.个人一点菜菜的经验拿出来大家分享一下. 暴头个人觉得.最重要的是感觉.感觉好的时候怎么打怎么暴人头.呵呵.但...

AVA步枪点射
算了吧,AV之王步枪杯具。冲锋枪10-30米无敌,狙击50米开外无敌 就步枪,虽然AVA准心有够小的,但近拼不过冲锋枪,远干不了狙击,很蛋疼,除了生存等模式,对K的时候会感觉很无奈的,步枪算是挺中庸的。关键还是蛋疼的疼训不给M16等高稳定的步枪配镜,还没机械瞄准;把M4搞的射速巨高,还配4倍...

含天然气水合物沉积层的AVA特征分析
首先认真分析了天然气水合物沉积的3种微观模式,根据其不同的岩石物理模型特点,试验弹性参数随水和物饱和度的变化规律;其次以精确zoepprize方程为基础,研究随饱和度变化的AVA特征;最后,利用不同的理论模型模拟了BSR现象,并分析BSR产生的3种客观条件以及调谐作用对BSR的影响。研究结果表明:天然气水合物饱和度、游离气...

游戏鼠标灵敏度 逆战换AVA
每个人手感不一样,所以鼠标灵敏度也不一样,但是现在很多人的灵敏度是30~20之间,也有更高的,楼主自己慢慢试验就可以了,在游戏里,用“【”“】”可以更改灵敏度。

求三个字母的缩写英文做网名,意思写上越多越好!先谢谢
1、【ava】根据美国老牌电影明星ava gardner(艾娃·加德纳)而得来的名字,ava gardner多次获得国际奖项提名,入选美国百年来最伟大的女演员第25名。该名字由三个字母组成的名字,实际上只有两个字母,所以是非常简便易记的,中文名字可翻译为艾娃,是一个非常唯美好听的名字。2、【fay】由三个字母组成,...

好听的英文名字女孩
解释:Isabella是一个优雅且强大的名字,源自希伯来语,意为“上帝的承诺”。这个名字在全球范围内都非常受欢迎,给人一种既神秘又高贵的感觉。5. Ava 解释:Ava是一个简洁而优雅的名字,它的起源并不确定,但已经流行了很长时间。这个名字有一种独特的韵味,给人一种优雅、自由的感觉,适合独立而自信...

红河哈尼族彝族自治州13586813883: java里面的向上造型是什么? - ?抽象类和接口有什么关系?c++里面的虚函数是java里面的接口 -
烛鬼养血: 向上造型一个泛型对象的引用 例如,假设我们有很多箱子,每个箱子里都装有不同的水果,我们需要找到一种方法能够通用的处理任何一箱水果.更通俗的说法,A是B的子类型,我们需要找到一种方法能够将C类型的实例赋给一个C类型的声明...

红河哈尼族彝族自治州13586813883: java向上造型的意义? -
烛鬼养血: 那个你做的例子都有误导性的,你用Person来试试,Person里面有一个方法:eat(),你分别声明三个类:man,woman,notmannotwoman来继承这个类,并复写里面的方法,好了,现在我要在测试类里面写一个方法,只传进一个参数,可以调用三个对象的复写的eat(),你该怎么办? 现在,向上转型就出来了,太他妈的聪明了,你myMethod(Person obj){ obj.eat()}, 你分别传进三个对象:man,woman,notmannotwoan的,好了,你猜对了,调用的都是复写之后的,各个类里面的方法

红河哈尼族彝族自治州13586813883: java中上溯造型是什么原理 -
烛鬼养血: Upcasting,上溯造型,有的书译作“向上转型”,是实现Java多态(Polymorphism) 的基石.Casting指的是对象之间类型的转换.将一个对象的引用(Object Reference)看作其父类对象的引用(Reference to base type)叫做Upcasting(上溯造型或向上转型).反之,将对象的引用看作其子类的引用叫Downcasting. Upcating系统会自动替你去做,而Downcasting则需要强制类型转换.

红河哈尼族彝族自治州13586813883: java中的上塑造型和下溯造型的概念.最好有具体的例子说明..谢谢了~~ -
烛鬼养血: 说的是转型吧.A extends B 的话,A的实例 a 可以:B b = (A)a;这就是向上转型,这个是肯定可以的.但是向下转型就需要判断对于上面的b 现在是B类型的,但是它可以再转为A:if(b instanceof A) A c = (A)b. 就是说向下转型时必须你之前要是这个类型或者更下面的类型.

红河哈尼族彝族自治州13586813883: java程序中继承和向上造型有什么不同 -
烛鬼养血: 继承可以拓展类的功能,而向上造型是不能使用在子类中拓展的这些属性和方法的,只能使用从父类继承来的方法和属性

红河哈尼族彝族自治州13586813883: java向上转型 为什么只能引用父类属性,而方法调用时只能调用父类已有的方法,并且父类方法能被子类覆盖. -
烛鬼养血: 虽然时间有点久了,还是要分享一下自己的见解. 向上造型:抽取 子类中 [和父类共有的属性和方法] 用来操作. 向上造型作用范围:父类的非私有属性和方法+子类中和父类共有的属性和方法.(非静态方法调用子类的;静态方法,属性调用父类的) 普通继承作用范围:父类的非私有属性和方法+子类中和父类共有的属性和方法+子类扩展方法和属性. 反过来是不是可以说,向上转型就是去掉子类里父类没有的方法和属性. 向下造型,把抽取出拥有父类共性后的子类再强转为同一类型的子类,这时子类和普通子类一样可以使用扩展方法和属性

红河哈尼族彝族自治州13586813883: JAVA中A a=new B()的意思; -
烛鬼养血: 接口只是为了定义一上类的标准,并没有具体的实现代码,是取一些对象的共同特性进行抽象,比如A接口有print方法,那么实现A接口,就必需实现print方法,接口是不能实例化的,必需new具体的实现类,比如:interface A{ void cry{}; } class ...

红河哈尼族彝族自治州13586813883: 在java中,向上转型的机制是怎样工作的? -
烛鬼养血: 鸟是动物的一种 现在有2个类,动物类Animal和鸟类Bird,鸟类继承动物类 public class Animal{ public String name; public String foot; } public class Bird extends{ public String birdType; } Animal animal1 = new Animal(); Bird bird1 = new Bird(); ...

红河哈尼族彝族自治州13586813883: java向上造型的意义?举例子说明!谢谢! -
烛鬼养血: 多态服务的你不觉得传参的灵活性变好了吗,你可以参数指定父类对象 传子类对象进去不是.

红河哈尼族彝族自治州13586813883: java中向上转型和向下转型有何用途 -
烛鬼养血: 无论是上转还是下转都是为了让类的使用范围和适用范围发生变化,以便操作不同范围的变量或者方法.1上转型是指将子类对象使用父类引用进行引用.得:上转型对象可以操作和使用子类继承或者重写的方法.失:上转型对象丧失了对子类新增成员变量或新增的方法的操作和使用. 2与向上转型相反,即是把父类对象转为子类对象:作用也与上转相反.java 转型问题其实并不复杂,只要记住一句话:父类引用指向子类对象.子类和父类中定义同名的变量时,仅仅是隐藏了,变量没有多态性;而对于覆盖的方法,Java表现出多态性,会调用更具体的子类里面的方法,无论从哪里调用,无论使用什么引用类型调用.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网