我们知道在面向对象编程的时候,比如Bird既有叫的功能,又有飞的功能,可以通过继承Animal和实现飞的接口的功能实现:
class Animal {
shout() {
}
}
interface OtherFunction {
fly():void
}
class Bird extends Animal implements OtherFunction {
shout() {
console.log('呜呜')
}
fly() {
console.log('飞到北京天安门')
}
}
问题1:
为什么很多不使用多继承?而是选择继承类+实现接口?
这个有什么好处?
如果还有其他类的功能比如:
class Vegetarian {
eat() {
console.log('吃素')
}
}
问题2:
Bird想要继承吃素的功能,请问这个如何进行实现呢?就不能进行继承了对吗?
在多继承中,如果一个类从两个不同的父类继承,而这两个父类又有一个共同的祖先类,那么在实际调用祖先类的方法时,编译器可能不知道该选择哪个路径,这就会导致混乱。例如:
class A {
void method() { System.out.println("A"); }
}
class B extends A {
void method() { System.out.println("B"); }
}
class C extends A {
void method() { System.out.println("C"); }
}
class D extends B, C {
// D应该继承哪个method()?
}
这种情况在 C++ 中通过复杂的规则来解决,但它也增加了代码的复杂性和理解的难度。Java 为了保持语言的简单性和一致性,选择不支持类的多继承。
Bird想要继承吃素的功能,要么使Animal继承Vegetarian类,要么将Vegetarian做成接口,Java 提供了接口(interface)作为多继承的替代方案。虽然一个类只能继承一个父类,但它可以实现多个接口。
问题内容: Java不允许多重继承,但是它允许实现多个接口。为什么? 问题答案: 因为接口只指定什么类是做,而不是如何它是做什么的。 多重继承的问题在于,两个类可能定义不同的方式来做同一件事,而子类无法选择该选择哪一个。
在Java中,不允许多重继承,但是在Java8之后,接口可以有默认方法(可以实现方法本身),就像抽象类一样。在此上下文中,还应该允许it多重继承。
问题内容: 我一直在使用Guice的AOP来拦截一些方法调用。我的课程实现了一个接口,我想注释接口方法,以便Guice可以选择正确的方法。即使使用继承的注释对注释类型进行注释,实现类也不会继承Inherited的java doc中所述的注释: 还要注意,此元注释仅使注释从超类继承;已实现的接口上的注释无效。 这可能是什么原因?了解对象的类在运行时确实实现的所有接口并不是一件容易的事,因此在此决定背
问题内容: 我一直在看该类的源代码。对我来说,这似乎是一个普通的抽象类,带有受保护的构造函数。它不是最终的,它内部没有任何特殊的注释,并且不使用本机代码。但是,它不能直接子类化。实际上,以下代码无法编译: 我知道这是Java中的一个特殊类,并且我知道有充分的理由应禁止直接子类化。但是从技术上讲,您如何执行此行为?程序员是否可以创建类似的非最终类,尽管具有可访问的构造函数,该类仍不允许直接子类化?
我试图了解使用接口的好处是什么,以便我可以知道何时以及如何使用它们。互联网上的大多数资源都是相对表面的,解释了接口是如何工作的,但现在为什么要使用它们,当我查找名义上的问题时,我没有得到任何结果告诉我接口的目的是否超出了多态性和多重继承。 我的推理是,如果一个接口只被一个类继承,它将是无用的,当一个接口被多个类继承时,它没有区别,除非它用于多态,唯一使实现不同于扩展的是多重继承。 如果我确实知道他
问题内容: 我对此事仍然有些困惑。我到目前为止发现的是 (这里已经问过类似的问题,但我还有其他几点。) 接口是仅抽象方法和最终字段的集合。 Java中没有多重继承。 接口可以用于在Java中实现多重继承。 继承的一个强项是我们可以在派生类中使用基类的代码,而无需再次编写。可能这是继承在那里最重要的事情。 现在.. Q1。由于接口仅具有抽象方法(无代码),因此,如果我们实现任何接口,那么该如何继承呢