抽象类与所有抽象方法和接口(不是技术上)有什么区别

时间:2017-04-28 22:40:06

标签: java oop types interface abstract-class

我一直在想他们之间有什么区别?只是在这里:抽象类声明对象是什么接口什么对象可以做?还是有更深层次的东西?感谢。

3 个答案:

答案 0 :(得分:2)

是否可以有字段,是否可以有构造函数,是否可以保护这些方法/ package-private / private,子类是否可以从其他抽象类/接口继承......有关它的内容。 / p>

答案 1 :(得分:1)

在Java中,没有纯抽象类。声明只有抽象方法的类也有具体的方法,因为它是直接或间接的具体Object类的子类。

接口是定义抽象API的更好选择。 Java允许类最多扩展一个类,但实现多个接口。

从Java教程Abstract Methods and Classes(添加换行符):

  

但是,对于抽象类,您可以声明非静态和最终的字段,并定义public,protected和private具体方法。

     

使用接口,所有字段都自动为public,static和final,并且您声明或定义的所有方法(作为默认方法)都是公共的。

     

此外,您只能扩展一个类,无论它是否是抽象类,而您可以实现任意数量的接口。

本教程还推荐了需要抽象类或接口的情况。换言之,当您想要共享代码或非静态,非最终字段或使用除public之外的访问限定符时,它会建议抽象类。通常这些都不适用于纯抽象类。

如果要指定可由多个不相关的类实现的API,或者想要利用接口类型的多重继承,则建议使用接口。

答案 2 :(得分:1)

语句"抽象类声明对象是什么"指的是如果一个类具有"是一个"那么该类可以继承自基类。与基类的关系。因此,Sedan可以继承Car,因为Sedan"是" Car。但这只是故事的一部分。通常,我们定义抽象基类继承自何时我们希望抽象基类包含一些功能,这些功能通过暴露无法覆盖的final方法来限制派生类的功能。因此,假设的邮件传递抽象基类可以提供public final prepareAndSend()方法,该方法按顺序调用自身上称为stuffEnvelope()lickEnvelope()mailEnvelope()的抽象可覆盖物。派生类可能会覆盖这些方法,但它无权更改它们的调用顺序,因为prepareAndSend()是最终的。你不能用接口强加这样的限制。

另一方面,接口描述了"功能"或"方面"一个物体可能有。对象可能具有许多不同的功能,因此它可以实现许多接口。

请注意,似乎"是"关系可以应用于接口,但它只发生在某些人为的例子中,或者是由英语的自由语法引起的错觉;它是不可推广的,在许多情况下它甚至不是事实,而且这就是为什么没有规则说对象应该有一个"是"与它实现的每个接口的关系。

所以,有人当然可以做一个" ICar"界面,没有任何问题,在这种情况下,不可避免地会出现一些“汽车”,但你更有可能看到的是像#34; IDrivable",& #34; Insurable"," ITaxable"," IFuelConsumer"等所有这些都描述了特征。事实上你可以说"汽车是一种应税的"是英语的侥幸;一辆车实际上承担了一个"是一个"与" taxable"的关系因为"纳税"甚至不是一件事。那么,无论谁想出那个" ICar"通常只是为了方便将汽车的所有特性组合成一个通用界面。