简述
Java通过 abstract 与 interface 来实现对抽象概念的定义1。这两者强化了Java面向对象的特点。Abstract Class与 Interface 对抽象概念的支持很相似,但是区别亦比较显著。本文将简述两者的基本特点并进行简单对比。
(抽象)方法继承和接口引用在Java中的具体写法可以提炼为:
class A extends B implements C,D,E,F {methods and attributes}
2
Abstract Class (抽象类)
抽象类是实现多态的一种机制。这种机制定义了一个或多个抽象的方法,至于这些抽象方法的具体表现形式则可以由sub-class以extends
来实现。
- 抽象类中的抽象方法不能当场实现,sub-class的具体实现也称为overriding。
- 换句话说,抽象类创建了sub-class里某些具体方法的抽象引用3。
public abstract class Laptop{
public abstract void displayLogo();
public void sayHelloToUser{
System.out.println("Hello World!");
}
}
public class MacBookPro extends Laptop{
//overriding
public void displayLogo{
System.out.println("This is an Apple Logo");
}
}
public class SurfaceBookPro extends Laptop{
//overriding
public void displayLogo{
System.out.println("This is a Microsoft Logo");
}
}
Interface (接口)
接口是抽象方法的集合。如果一个类 implements
了某个接口,那么它就必须确保具体实现接口里的抽象方法。接口只是一种形式,其自身并无实体意义4。
- 注意,接口里只能有
public abstract
方法。 - 接口里抽象方法的实现,亦可以通过子类继承父类来实现。
例如:父类A与子类B,子类B调用了接口K但未实现接口K的抽象方法M。幸运的是,在父类A里有返回属性、方法名称与参数均相同的方法M的实现。这样的话,我们也认为子类B实现了抽象方法M。
public interface LogoPage{
public abstract void displayLogo();
}
public class MacBookPro implements LogoPage{
//overriding
public void displayLogo{
System.out.println("This is an Apple Logo");
}
}
public class SurfaceBookPro implements LogoPage{
//overriding
public void displayLogo{
System.out.println("This is a Microsoft Logo");
}
}
public class NewMacBookPro extends MacBookPro implements LogoPage{
//此子类里不实现displayPage()也不会报错
}
对比讨论
这里附上南洋理工讲OOP时的一张表格5 (有添加修改)。
abstract class | interface |
---|---|
can have some methods declared as abstract | all methods must be abstract |
can have static \ protected methods | only has public methods with NO implementations |
can have final and non-final attributes | only has static final constraints |
almost same to public class except the abstract part | a functionality in Java, different from class |
更多区别请见本文参考网页之[3]。
extends
可以理解为全盘继承了父类的除private
以外的方法,implements
可以理解为添加一个接口来帮助这个类附加一些额外的方法。interface 定义了一些抽象方法,但是并未具体实现,需要类调用它来具体实现。
基于编程规范,abstrct
方法应使用 public
打头。下面是我在 StackOverFlow 上看到的一段讨论6。
Private methods are not polymorphic (you cannot inherit them), so it makes no sense to make a private method abstract. Making a method abstract means you’d have to override and implement it in a subclass, but since you can’t override private methods, you can’t make them abstract either. You should make it protected instead of private. Private really means private to the class you’ve defined the method in; even subclasses don’t see private methods.
对于 java class,extends
用于继承 class,而 implements
用于实现一个接口。简单来说,extends
继承来的抽象方法,需要具体实现之后才可用。而private
则导致这一抽象方法无法被继承,因而无法具体实现。
温习一下代码,(抽象)方法继承和接口引用在Java中的具体写法可以提炼为:
class A extends B implements C,D,E,F {methods and attributes}
这篇文章只是对Java抽象方法与接口的一点简单理解,同时也是多篇博客的一个综述。如有内容疏漏错误或侵权,还请及时联系我进行订正。感谢你阅读这篇文章。
个人主页正在建设中,欢迎来访:Peter的主页。
- https://blog.csdn.net/chenssy/article/details/12858267 ↩
- https://jeffjade.com/2015/05/11/2015-05-11-java-extends-implement/ ↩
- http://www.importnew.com/12399.html ↩
- https://jeffjade.com/2015/05/11/2015-05-11-java-extends-implement/ ↩
- http://www.ntu.edu.sg/Pages/home.aspx ↩
- https://stackoverflow.com/questions/2874350/cant-declare-an-abstract-method-private ↩