从概念上讲,我知道抽象类和接口之间的区别。但是想知道这两者之间的技术差异。为什么Sun制作了这个界面术语,即使我可以完全抽象化课程并完成我的工作。
答案 0 :(得分:1)
Java中抽象类和接口之间的区别
Java中的抽象类与接口以及何时使用它们决定何时使用接口和抽象类时,了解Java中抽象类和接口之间的区别非常重要。在我看来,它们之间存在两个不同之处,决定了在Java中何时使用抽象类或接口。
1)Java中的接口只能包含声明。您不能在接口内声明任何具体方法。另一方面,抽象类可以包含抽象和具体方法,这使得抽象类成为提供通用或默认功能的理想位置。我建议阅读我关于Java中的接口的10篇知识,以了解有关接口的更多信息,特别是在Java编程语言中。
2)Java接口可以扩展多个接口,Java类也可以实现多个接口,这意味着接口可以提供比抽象类更多的多态支持。通过扩展抽象类,类只能参与一个Type层次结构,但通过使用接口,它可以是多个类型层次结构的一部分。例如。一个类可以同时运行和显示。我记得的一个例子是在J2ME中编写GUI应用程序,其中类扩展了Canvas并实现了CommandListener以提供图形和事件处理功能。3)为了在Java中实现接口,在你的类是抽象的之前,你需要提供所有方法的实现,这是非常痛苦的。另一方面,抽象类可以通过提供默认实现来帮助您。由于这个原因,我更喜欢在界面中使用最少的方法,从一个开始,我不喜欢标记接口的想法,一旦在Java 5中引入了注释。如果你看看JDK或任何类似Spring的框架,我确实更好地理解OOPS和设计模式,你会发现大多数接口只包含一两种方法,例如Runnable,Callable,ActionListener等。
我还没有在这里包含Java中抽象类和接口之间的所有语法差异,因为这里要集中精力学习何时使用抽象类和接口并选择其他类。不过,您可以看到接口和抽象类之间的区别,以找到所有这些语法上的差异。
答案 1 :(得分:0)
您可以在上述方案
中自由选择interface
或abstract class
但请记住以下事项
如果你做了fully abstract class
那么
您的subclass
将extend
一个类来实现该行为
它没有资格扩展任何其他类,因为{。{1}}不支持java。
看不到multiple inheritance
我们无法实现interface
。
现在,如果我们接近multiple inheritance
而不是interface
类
然后类可以实现它,并且仍然可以扩展另外一个类。
因此,如果fully abstract
永远不需要扩展任何其他类,请在设计中选择fully abstract
类。
如果sub classes
稍后需要扩展某些类(通常是我们在应用程序中需要的方式),请选择sub classes
。
答案 2 :(得分:0)
因为你可以有一个类实现2个接口,但你不能有一个类实现(或扩展)2个抽象类。
答案 3 :(得分:0)
您编写了一个带有接口,抽象类和具体类的java程序,但是没有提到任何构造函数,编译它并在.class文件中查看字节代码。您会看到预期的抽象类和具体类具有由编译器添加的默认构造函数,其中接口不会通过编译器将构造函数添加到其中。这应该有助于您了解技术差异,因为我相信您知道其他差异。
答案 4 :(得分:0)
我可能会收到这个答案的downvotes :)。考虑这种情况。
public class TestClass{
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Fish f = new Fish();
f.walk();
}
}
abstract class Animal {
protected void walk() {
System.out.println("walking");
}
}
class Fish extends Animal {
}
O / P:走路
从技术上讲,鱼不能走路。因为它扩展了Animal类,它可以"可以"从设计角度来看是错误的(尽管Fish没有实现walk(),它仍然可以调用它)。如果Animal是一个接口,那么Fish必须实现它赢得的方法walk() #39; t / shouldn' t。所以,你将被迫重新审视设计。
答案 5 :(得分:-1)
抽象类可以包含一些实现代码和实例变量。接口只有方法签名和静态变量定义,没有实现代码。
此外,如果实现接口,则必须包含接口中定义的所有方法的实现代码。