简谈对Java的abstract和interface的理解

简述

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 classinterface
can have some methods declared as abstractall methods must be abstract
can have static \ protected methodsonly has public methods with NO implementations
can have final and non-final attributesonly has static final constraints
almost same to public class except the abstract parta 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的主页

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值