抽象类与接口

抽象类与接口

接口与抽象类

一、抽象类

说起抽象类,我们先说一下如何定义一个抽象方法

abstract class Person {
    public abstract void print();
}

class Women extends Person {
    @Override
    public void print() throws RuntimeException{
        System.out.println("Women");
    }
}

Person 类的 print 方法就是抽象方法,抽象方法用 abstract 修饰,没有方法体,直接以分号结束

访问修饰符 abstract 返回值类型 方法名(参数列表);

**使用 abstract 修饰的类就是抽象类。**比如上面的 Person 就是抽象类。

**一个类如果包含一个或多个抽象方法,那么该类必须是抽象类。**如果我们尝试将 Person 类变为非抽象类,可以看到 idea 的错误提示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eDKz5Vmk-1594129396595)(https://i.loli.net/2020/07/07/wlJfnq82TcmGuhM.jpg)]

抽象类可以包含具体数据和方法,也可以不包含抽象方法。

在 Person 类定义一个 name 属性,定义一个 printName 方法在控制台打印 name 值:

在抽象类定义数据与具体方法.jpg

我们可以注释掉抽象方法 print,发现无报错:

抽象类中可以不定义抽象方法.jpg

抽象类不可以被实例化,但是抽象类可以定义对象变量,这个对象变量可以引用非抽象类的子类对象

比如,这行代码就会报错:

Person p = new Person();

Person 是抽象类,抽象类无法实例化,我们可以使用对象变量 p 来引用 Women 类(Person 子类)的对象

Person p = new Women();

二、接口

在 Java 中,接口不是类,它是规范,所有实现接口的类都必须遵守其规范。接口使用 interface 定义

interface Demo {

}

我们需要记住接口中可以有什么,不可以有什么

接口中可以定义常量,可以有方法,在 Java 8 之前,接口中的方法无法拥有具体实现,在 Java 8 可以用 default 修饰方法,就可以有具体的实现

接口中的域会被自动设置为 public static final,所有方法会被自动设置为 public。

Java 8 之前,接口无法拥有静态方法,Java 8 之后,接口可以拥有静态方法。

interface Demo {
    int A = 1;
    default void print() {
        System.out.println("这是一个接口");
    }
}

接口不是类,所以不可以被实例化,但是可以定义对象变量,对象变量可以引用这个接口的实现类的对象,实现类需要使用 implement 关键字

接口无法实例化.jpg

DemoImpl 是 Demo 的实现类,接口无法实例化,我们可以看到 idea 的报错提醒。

接口不能拥有实例域

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mK5JmcgV-1594129396605)(https://i.loli.net/2020/07/07/qB4oT6H7xAdF31b.jpg)]

三、抽象类与接口的区别与联系

  1. 抽象类是类,使用class 定义,需要有 abstract 修饰,接口是使用 interface 定义。
  2. 在 Java 中,类只能单继承。接口可以多实现。
  3. 接口中的所有方法只能是 public,所有的变量都会被设置为 public static final,所以接口只能有常量,而抽象类中没有这个限制。
  4. 接口无法拥有实例域,抽象类可以拥有实例域。
  5. 在 Java 8 之前,接口中的方法无法有具体实现,在 Java 8 后可以。而抽象类中的非抽象方法可以拥有具体实现。
  6. 在 Java 8 之前,接口中不能有静态方法,Java 8 后可以。而抽象类可以有静态方法。
  7. 抽象类和接口都不能被实例化,但可以定义对象变量。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值