java采用什么机制来替代多重继承?Java用接口代替C++的多重继承好在哪
大家好,关于java采用什么机制来替代多重继承很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于Java用接口代替C++的多重继承好在哪的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!
为什么在Java中类不能多重继承
分类:电脑/网络>>程序设计>>其他编程语言
问题描述:
C++中类可以多重继承,Java中为什么不实现这个功能呢?也就是说,多重继承会带来哪些问题,从而导致Java放弃类的多重继承呢?Java中可以用接口来实现多重继承,那么与C++中类的多重继承相比,有什么优势呢?
解析:
JAVA语言让编程者无法找到指针来直接访问内存无指针,并且增添了自动的内存管理功能,从而有效地防止了c/c++语言中指针操作失误,如指针所造成的系统崩溃。但也不是说JAVA没有指针,虚拟机内部还是使用了指针,只是外人不得使用而已。这有利于Java程序的安全。
c++支持多重继承,这是c++的一个特征,它允许多父类派生一个类。尽管多重继承功能很强,但使用复杂,而且会引起许多麻烦,编译程序实现它也很不容易。Java不支持多重继承,但允许一个类继承多个接口(extends+implement),实现了c++多重继承的功能,又避免了c++中的多重继承实现方式带来的诸多不便。
Java语言的三种核心机制
Java语言包含三种核心机制:Java虚拟机、垃圾收集机制和代码安全检测。
1、Java虚拟机(Java Virtual Machine,JVM)
在一台计算机上由软件或硬件模拟的计算机。Java虚拟机读取并处理经编译过的平台无关的字节码class文件。
2、垃圾收集机制(Garbage collection)
在C/C++等语言中,由程序员负责回收无用内存。Java语言解除了程序员回收无用内存空间的责任。它提供一种系统级线程跟踪存储空间的分配情况。并在JVM的空闲时,检查并释放那些可被释放的存储器空间。垃圾收集在Java程序运行过程中自动进行,程序员无法精确控制和干预。
3、代码安全性检测(Code Security)
Java执行代码的时候,由JVM对运行的代码进行安全性检测,当进行一些非法操作的时候,比如修改一些系统设置的时候,JVM会发出警告。
Java用接口代替C++的多重继承好在哪
抱歉,你只要提到“接口与继承”,“单继承多实现”这个概念你就绕不开。但什么是“继承”?其实“继承”一词,包含两层含义(大多数人把它们混着来说):
代码重用(功能扩展)
抽象多态
但“单继承”一词的“继承”,只包含上面第一层含义。事实上,大多数人一提起“继承”,大多数人立马会想起代码重用,但却对抽象多态知之甚少。你要明确,除了“单继承”以外,继承的目的可不仅仅限于代码重用上。有不少的材料会说“JAVA/C#不支持多继承,所以用接口来实现多继承”这句话是一种非常不负责任的说法,因为前后两个“继承”根本不是一个意思。但上面1和2在技术上都依赖一个基本特点:(这也是继承的技术本质)
父类/接口的引用可以指向子类的对象!
代码重用有什么好处,我就不详细叙述了,我下面只谈抽象多态有何用。
你学的是JAVA还是C#?如果是前者,继承用extends/implements,后者用“:”,我下面全部用冒号了。
比如说有某个实体类/工具类,里面有个函数要获取某个图形的面积
1
2
3
4
5
6
7
8
9
class Util
{
public void F(Shape s)
{
……
double result=s.CalculateArea();
……
}
}
现问题来了,shape类型有很多,不同了图形面积计算方法不一样,如正方形是s=a^2;椭圆面积是s=phai*a*b……那么不同形状图形各整一个类:
1
2
3
4
5
6
7
8
class Circle
{
public doulbe CalculateArea();
}
class Square
{
public doulbe CalculateArea();
}
那么对应的Util类就为这些不同的形状添加F()方法重载?
1
2
3
4
5
class Util
{
public void F(Circle s);
public void F(Square s);
}
那么如果有一百个形状呢?要重载一百个F()函数?一亿个呢?好吧,如果一亿个你都咬牙写了一遍。那么你写好,编译好了成为一个动态库,后面又再增加呢?如果你这个动态库要发布给别人使用,这就逼着别人只能用这几个固定的类而不能随心所欲增加新的类。另外,你要重载一亿个F()函数还得都获得这一亿个类的原型声明。这原型一旦做了修改你又得重新编译,多麻烦?
所以多态就要来解决这个问题了:
有了多态,你只需声明一个接口:
1
2
3
4
5
6
7
8
9
10
11
12
13
interface IShape
{
void CalculateArea();
}
class Util
{
public void F(IShape s)
{
……
double result=s.CalculateArea();//我Util类管你实现的类是什么类?只要你是IShape的子类,我就能调用!
……
}
}
那么使用者只需要让新增加的形状继承于IShape就可以作为参数调用。
class Circle: IShape
class Square: IShape
而抽象类,则是同时兼顾代码重用和抽象多态的折衷产品。
另外,既然你提到过“单继承多实现”,我就不放再说一说,为什么要有“单继承”?
对比JAVA/C#的单继承,C++是多继承的,所以他不需要专门“接口”。多继承,意味着这种语言完全“面向代码重用”(当然他并不排斥抽象多态)。如何为完全“面向代码重用”呢?就是我写一个类,从A继承一票功能,又从B继承一票功能,又从C……,总之,你写的类变成一个大杂烩,万金油。这会有一个逻辑上的不合理:所谓在其位谋其职,分工不明确,将会降低生产效率。
于是以JAVA/C#为代表的标准面向对象模型(面向接口编程),不再允许多继承,而是使用单继承。这意味着你一个类,只能是从属于一个种属/身份,不应该什么都干,什么都能干。类继承不但有代码重用,还起到类型限制的作用。而作为补充,你可以继承多个接口,那么你可以提供超出父类所提供的基本功能,但你不能从现成的拿过来用,而是得自己实现。这保证了你的接口继承紧紧围绕着你的父类所规范的身份转。接口的定义者,则是赋予某种简单功能较为松散的约定,意味着接口所定义的功能,并不与某个类型/身份紧密相连。
简单打个生活中的比方:比如说,你是某家公司的职员,也是驾照的持有者。那么“职员”应当是类或者抽象类,因为你只有具有某公司的职员身份,才有资格进入这家公司工作,而非谁都能去。而“驾照”更应该是接口,因为谁只要没有什么特殊的病或别的,不管具有什么身份,拿到驾照就可上路。
JAVA中什么是继承
继承在本职上是特殊一般的关系,即常说的is-a关系。子类继承父类,表明子类是一种特殊的父类,并且具有父类所不具有的一些属性或方法。
1.Java继承的语法格式:
Java继承的关键字是:extends
public class子类名 extends父类名{...}
如: public class UNStudent extends Student{...}注:1.子类又称超类,拓展类;父类又称基类。
2.Java中类的继承只能是单继承(单根继承),即一个类只能继承一个父类,但是一个类可以由多个类来继承它。
3.Java会给每一个没有设置父类的类,自动添加一个父类就是Object。
扩展资料:
一、子类继承父类的结果
1.子类继承父类后,继承到了父类所有的属性和方法。注:是所有。
2.子类可调用的方法也要看情况而定:
子类和父类在同一个包下时“子类和子类的对象”可以调用父类的默认的,受保护的,公有的属性以及方法。
子类和父类在不同的包下时,在子类中可以调用受保护的,公有的属性以及方法,而子类的对象可以调用受保护的,公有的属性以及方法。
二、方法的重写
1.当子类和父类都有某种方法,而子类的方法更加要求细致,或者实现功能不同,就需要方法的重写。
2.重写条件
①必须要存在继承关系;只有继承之间的关系才能有方法的重写
②方法的返回值类型,方法名,参数个数,参数类型,参数顺序,必须要完全一致;
如:父类中方法 public void play(int n; String s){方法体1...}
重写后的子类方法public void play(int n; String s){方法体2...}
3.子类重写方法时的访问修饰符可以大于或者等于父类方法的访问修饰符。
4.重写后的方法会被优先调用。
三、自动转型
自动转型的实现要求有继承关系
格式如下:父类名对象名= new子类构造方法;
如:Student stu= new UNStudent;
而强制转型格式如下:子类名对象名=(子类名)父类对象名
如:UNStudent un=(Student)stu;
自动转型可以拓宽方法的作用访问域
在使用自动转型后,子类自己定义的方法是不能在自动转型后执行;
原因是因为Java的编译机制,它会优先判断父类中是否存在该方法,如果存在则通过编译,如果不存在则报错。
第二种自动转型:转型后只需要不同类的不同对象调用想吐的方法,很方便!
/**访问修饰符返回值数据类型方法名(父类类型参数名,...){
调用方法。
}
父类名对象名= new子类名;
子类名对象名= new子类名;
方法名(对象名);
*/
比如拿到驾驶证为A2的人,可以驾驶重型货车,当然也可以驾驶大型货车,中型货车,小型货车,小客车,小轿车,摩托车...可以选择第二种自动转型的方法,便于调用同一个方法。
自动转型好处:1.减少冗余代码;2.在方法设置参数时,扩大访问范围。
四、多态
多态是由方法重载,继承,方法重写,自动转型等技术的组合。
五、为什么需要继承?
1.提高代码的重用性。
2.提高程序的扩展性。
参考资料:
JAVA继承总结
好了,本文到此结束,如果可以帮助到大家,还望关注本站哦!