Java基础--接口和抽象类

本文深入探讨了面向对象编程中的抽象类与接口的概念,详细解释了它们的特点与区别,包括如何创建、使用以及它们在软件设计中的作用。

讲完了继承,我们来讲讲接口和抽象类。面向对象有以下特性:抽象、多态、继承、封装。接口和抽象类正是对应了面向对象的抽象特性。

什么是抽象

Wikipedia 上是这么定义抽象的:

Conceptual abstractions may be formed by filtering the information content of a concept or an observable phenomenon, selecting only the aspects which are relevant for a particular subjectively valued purpose.

也就是说,抽象是指为了某种目的,对一个概念或一种现象包含的信息进行过滤,移除不相关的信息,只保留与某种最终目的相关的信息。例如一个带有花纹的玻璃杯,我们可以过滤掉他的花纹、材质等信息,得到一个更一般性的信息,也就是容器。也就是说,抽象就是简化事务,抓住事务本质的过程。

而在软件开发领域中,抽象更为重要。抽象可以让我们把业务需求转化成数据模型,将实体对象转化成一个类。可以说,抽象是连接现实生活和虚拟世界的桥梁。

抽象类

抽象类是抽象方法和非抽象方法的集合,即抽象类中并不限制类中一定要有抽象方法。但一个类如果有抽象方法,那么这个类一定是抽象类。

创建抽象类是通过给类名前加上abstract关键字,这样就可以将这个类声明为一个抽象类。抽象方法则是在返回值类型前加上abstract关键字。抽象方法与普通方法的区别在于,抽象方法只是定义方法名称,无方法体(即没有{}构成的方法体)。

//创建一个抽象类
public abstract class A{
    
    //创建一个抽象方法,并无方法体
    public abstract void testA(int a);
}

抽象类有以下特点

  1. 抽象类不能被实例化,即不能直接new一个对象出来。
  2. 抽象类中可以包含抽象方法,也可以包含非抽象方法。
  3. 抽象类不能直接实例化,但可以通过子类实例访问其成员,并且子类必须实现抽象类中所有的抽象方法。
  4. 抽象方法不能为static、final、protected。

在以下情况一个类必须声明为抽象类

  1. 当一个类中存在一个或多个抽象方法。
  2. 当类是一个抽象类的子类,并且没有实现父类所有抽象方法,即只实现了部分。
  3. 当类实现一个接口,并且不能为全部抽象方法都提供实现时。

接口

接口同样是一种特殊的类,由全局常量和公共的抽象方法所组成。类是一种具体的实现,而接口则定义了类索要遵守的规范。接口不关心类的具体实现,它只规定这些类里必须提供哪些方法。

创建接口是通过给类名前加上interface关键字,这样就可以完成一个接口的声明。

//创建接口
public interface A{
    //可以添加常量定义
    final int a = 10;
    
    //可以添加抽象方法
    public void testA(int a);
}

接口有以下特点:

  1. 接口就是用来被继承、实现的,所以一般用public修饰,不能使用private和protected修饰。
  2. 接口中其实系统在interface前默认的加上了abstract。
  3. 接口可以多继承,而抽象类只能单继承。
  4. 接口也可以继承另一个接口,通过extends关键字进行继承。
  5. 接口中的属性是常量,即使定义的时候不添加public static final修饰符,系统也会自动添加。
  6. 接口中的方法都是抽象方法,不存在非抽象方法。(java 8中接口貌似可以有非抽象方法~)

抽象类和接口的对比

参数

抽象类

接口

默认的方法实现

它可以有默认的方法实现

接口完全是抽象的。它根本不存在方法的实现(JAVA8后提供了实现)

实现

子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。

子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现

构造器

抽象类可以有构造器

接口不能有构造器

与正常Java类的区别

除了你不能实例化抽象类之外,它和普通Java类没有任何区别

接口是完全不同的类型

访问修饰符

抽象方法可以有publicprotecteddefault这些修饰符

接口方法默认修饰符是public。你不可以使用其它修饰符。

main方法

抽象方法可以有main方法并且我们可以运行它

接口没有main方法,因此我们不能运行它。

多继承

抽象方法可以继承一个类和实现多个接口

接口只可以继承一个或多个其它接口

速度

它比接口速度要快

接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。

添加新方法

如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。

如果你往接口中添加方法,那么你必须改变实现该接口的类。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值