java中的多重继承
Java 不允许从多个类继承(仍然允许从多个接口继承。),我知道它与经典的钻石问题非常一致。 但我的问题是,为什么在从多个基类继承时没有歧义(因此不会出现菱形问题)时,为什么 java 不允许像 C++ 那样的多重继承?
Java is not allowing inheritance from multiple classes (still it allows inheritance from multiple interfaces.), I know it is very much inline with classic diamond problem. But my questions is why java is not allowing multiple inheritance like C++ when there is no ambiguity (and hence no chances of diamond problem) while inheriting from multiple base class ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
发布评论
评论(9)
简单。 引用 Tom Sintes,
Java 设计团队努力打造 Java:
- 简单、面向对象且熟悉
- 稳健且安全
- 架构中立且可移植
- 高性能
- 解释式、线程式和动态
Java语言省略多重继承的原因
大部分源于“简单、面向对象、熟悉”的目标。 作为
作为一种简单的语言,Java 的创建者想要一种最简单的语言
开发人员无需大量培训即可掌握。 为此,他们
致力于使该语言尽可能类似于 C++(熟悉)
不会继承 C++ 不必要的复杂性(简单)。在设计者看来,多重继承会带来更多问题
和混乱比它解决的。 所以他们切断了多重继承
语言(就像他们减少运算符重载一样)。 设计师们的
丰富的 C++ 经验告诉他们多重继承只是
不值得让人头疼。
确实,Java 并不支持实现的多重继承(仅支持类型,即接口)。 这是一个设计决定。
但是,从 Java 8 开始,它支持使用默认方法的多重继承。 请参阅 http://docs.oracle.com/javase/tutorial/java/ IandI/multipleinheritance.html:
多重继承的实现就是能够继承
来自多个类的方法定义。 出现这样的问题
多重继承的类型,例如名称冲突和歧义。
...默认方法引入了一种形式的多重继承
实施。
package org.example;
public class Main {
public static void main(String[] args) {
Two_D circle = new Circle(5);
System.out.println("Area of circle: " + circle.Area());
Two_D square = new Square(4);
System.out.println("Area of square: " + square.Area());
Two_D triangle = new Triangle(3, 4, 5);
System.out.println("Area of triangle: " + triangle.Area());
Three_D sphere = new Sphere(3);
System.out.println("Surface area of sphere: " + sphere.SurfaceArea());
System.out.println("Volume of sphere: " + sphere.Volume());
Three_D cube = new Cube(4);
System.out.println("Surface area of cube: " + cube.SurfaceArea());
System.out.println("Volume of cube: " + cube.Volume());
}
}
class Shape {
}
class Two_D extends Shape {
double Area() {
return 0;
}
}
class Three_D extends Shape {
double SurfaceArea() {
return 0;
}
double Volume() {
return 0;
}
}
class Circle extends Two_D {
double radius;
Circle(double radius) {
this.radius = radius;
}
@Override
double Area() {
return Math.PI * radius * radius;
}
}
class Square extends Two_D {
double side;
Square(double side) {
this.side = side;
}
@Override
double Area() {
return side * side;
}
}
class Triangle extends Two_D {
double a, b, c;
Triangle(double a, double b, double c) {
this.a = a;
this.b = b;
this.c = c;
}
@Override
double Area() {
double s = (a + b + c) / 2;
return Math.sqrt(s * (s - a) * (s - b) * (s - c));
}
}
class Sphere extends Three_D {
double radius;
Sphere(double radius) {
this.radius = radius;
}
@Override
double SurfaceArea() {
return 4 * Math.PI * radius * radius;
}
@Override
double Volume() {
return (4 / 3) * Math.PI * Math.pow(radius, 3);
}
}
class Cube extends Three_D {
double side;
Cube(double side) {
this.side = side;
}
@Override
double SurfaceArea() {
return 6 * side * side;
}
@Override
double Volume() {
return side * side * side;
}
}
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
这是 Java 的设计决策。 你永远不会得到它,所以不要太担心。 尽管 MI 可能会帮助您创建 Mixins,但这是 MI 唯一能帮到您的好处。
It was a design decision of Java. You'll never get it, so don't worry too much about it. Although MI might help you make Mixins, that's the only good MI will ever do you.