接口与抽象类的区别

一、接口和抽象类的概念
接口:接口是不同于类的一种概念,而是一种对功能的需求描述,一旦定义了某一接口,类就要遵从接口描述的统一格式来定义。也就是说接口被用作描述类应该具备什么功能,但在接口定义中并不会给出具体的功能实现代码。
抽象类:为了使类中的方法更具通用性,因此引入了抽象类的概念。将抽象类作为其他类的基类使用,而不做为实现具体功能的实例类。例如一个Person类,一个Student类,一个Teacher类,因为Student和Teacher具有一些共同的属性(姓名、性别、年龄等等),我们就可以将这些共同的属性或方法抽象出来,放到Person类中,这时,Person类就可以作为一个抽象类供这两个类继承使用。

二、具体实现及特点
1、接口
要使用接口首先要定义接口,定义接口要用到interface 关键字,具体方式如下:

public interface interfaceName{
    void method1();                             //无参的方法1
    void method2(parameter 1);        //有一个参数的方法2
    void method3(parameter 1,parameter 2);   //有两个参数的方法3
}           //接口中只定义方法,不给出具体实现

之后就可以定义具体的实现类来实现已经定义好的接口。步骤为
1)用 implements关键字实现接口;
2)在接口的实现类中实现接口中的方法。如:

class ClassA implements interfaceName //在下面也会使用到此例`

接口具有如下特点:
1)在声明接口时,不必将方法声明为public,因为接口方法的访问权限修饰符默认为public,但是在实现接口时,要讲方法声明为public,否则编译器会给出提供更严格的访问权限的警告信息;
2)接口不能使用new关键字来实例化,如:

 x = new interfaceName;  //Error

3)虽然接口不能创建对象,但可以用接口来声明变量 —-→ 如: interfaceName x //Ok
接口变量必须引用接口的实现类对象,即 :x = new ClassA(…,…); //Ok ClassA实现了interfaceName接口
4)可以使用instanceof判断某一个类是否实现了某一特定接口,如 :

`if(ClassA instanceof interfaceName){......} //Ok`

5)接口同样可以使用extends 关键字进行扩展;
6)接口中不能包含实例域或静态方法,但可以包含常量,接口中的域都被默认设置为public static final;
7)某一类可以实现多个接口,如:

`class ClassA implements interfaceName1interfaceName2   //Ok,`

两个接口中间用逗号隔开。

2、抽象类

抽象类的实现与接口类似,先定义抽象类,然后由子类继承。定义抽象类要用到abstract 关键字,为了提高程序的清晰度,当类中包括一个或多个抽象方法时,也应将类定义为抽象类。如

public abstract class Person{
    ......
    public abstract String getDescription();
}

抽象类具有以下特点:
1)抽象类中除了可以包含抽象方法外,还可以包括具体的数据和具体方法,以下列Person类为例:

public abstract class Person{
    private String name;
    public Person(String name){
        this.name = name;
    }
    public abstract String getDescription();
    public String getName(){
        return name;
    }
}

注:若某一特定抽象类的子类并未实现该抽象类的全部抽象方法,则该子类也应标记为抽象类。
2)抽象类不能实例化对象。即不能使用new创建对象。 如 new Person(“张三”);// Error
3)虽然抽象类不能创建对象,但是可以通过引用的方式创建一个具体子类的对象。如:
Person p = new Student(“李四”,”经济学”);//抽象类声明变量p,引用非抽象类(子类)Student的对象
4)因为抽象类(Person类)不能创建对象,所以抽象类声明的变量(变量p)只会引用诸如Student这样子类的对象

三、抽象类和接口的异同

从上面的介绍中总结出二者以下区别:

①在定义某些方法上的区别:
a.抽象类这种可以包含非抽象的方法,但接口中的方法必须全部是抽象的;
b.抽象类可以有构造方法,用于初始化类中的参数,而接口中不能有构造方法;
c.抽象类中可以有静态方法,但接口中不可以包含静态方法(注意:在Java SE 8 中,允许在接口中在增加静态方法。理论上讲,没有任何理由认为这是不合法的,知识这有违于将接口作为抽象规范的初衷<引自《JAVA核心技术》中文10版卷Ⅰ 6.1.4节>);
d.抽象类中抽象方法的访问权限修饰符可以为public,protect,但接口中必须为public;

②定义变量的区别:
a.抽象类可以有普通成员变量,接口中不可以有;
b.二者都可以包含静态成员变量,但静态成员变量的访问权限修饰符识别不同的。抽象类中的静态成员变量的访问权限可以是任意的,而接口中必须为public(默认为 public static final)

③使用或功能的区别:
a.一个类只能够继承一个特定抽象类,但可以实现多个接口(即单继承多实现);
b.接口多用于定义模块间的通信契约,抽象类多用于实现代码的重用。

四、抽象类和接口的作用

接口:

1、重要性:在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力。

2、简单、规范性:如果一个项目比较庞大,那么就需要一个能理清所有业务的架构师来定义一些主要的接口,这些接口不仅告诉开发人员你需要实现那些业务,而且也将命名规范限制住了(防止一些开发人员随便命名导致别的程序员无法看明白)。

3、维护、拓展性:假如不使用接口,当某个类满足不了当前需求,那么可能要面临放弃当前类,并重新设计一个满足需求的新类,假如以后又遇到同样的情况,可能又需要重新设计,如此会花费很大的代价。如果其他地方可能有引用当前类,这样维护或者拓展功能会更加麻烦。如果你一开始定义一个接口,把功能定义在接口里,然后定义类时实现这个接口,在这样只要用这个接口去引用实现它的类就行了,以后要换的话只不过是引用另一个类而已,这样就达到维护、拓展的方便性。

4、安全、严密性:接口是实现软件松耦合的重要手段,它描叙了系统对外的所有服务,而不涉及任何具体的实现细节。这样就比较安全、严密一些(一般软件服务商考虑的比较多)。
以上借用了博客园的一篇回答接口的作用和好处-博客园
个人理解接口就相当于一个规范告诉你要做什么,至于怎么做就交给实现类去具体实现。比如有一天你去一个很大的游乐场去玩,到了饭点,但是周围没有饭店,只在公园里有一家,为了填饱肚子,你必须去这家吃,这时候饭店就是接口,只要使用你就必须去“实现”它,至于你吃什么就相当于你用什么方式什么算法实现啦。

抽象类:
1、由于抽象类中可以包含非抽象方法,因此可以把子类中公共的功能上提,诸如增删改查等,这样可以很大程度上提高代码复用性。

2、抽象类可以很好的实现多态,因为抽象类虽然可以声明变量,但本身并不能实例化,其声明的变量只能够引用子类所创建的对象,拓宽了多态的适用面。
比如人都一部分共同的动作或者属性,动作比如吃饭、行走……属性比如性别、身份证号码,姓名等等,在定义类时我们就可以将这些共同的东西抽象出来,放在一个抽象类(Person)供其他类(Student类、Teacher类…….)使用。并不是Student或Teacher类不能够单独实现这些功能,只是没有必要重复。

以上内容来自网络及参考书,个人总结,如有不足还望指正
参考书目:《JAVA核心技术》原书第10版

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值