抽象和接口

本文详细介绍了面向对象编程中的抽象和接口。抽象类用于定义一个不能实例化的基类,其中包含可能被子类重写的抽象方法。接口则提供了一种多继承机制,允许类实现多个接口以扩展功能。Java 8之后,接口还可以包含默认方法。两者的主要区别在于抽象类可以有非抽象方法和构造器,而接口则不能。此外,一个类只能继承一个抽象类,但可以实现多个接口。
摘要由CSDN通过智能技术生成

抽象和接口

【面向对象的第四大特性:抽象】

抽象

抽象的概念

       在继承的引用场景下,如果父类的方法肯定会被子类重写,那么父类的方法体就没有存在意义,父类的该方法就可以定义为抽象方法,同时注意该类也应要变为抽象类

抽象的使用

 抽象方法

  • 抽象方法没有方法体
  • 类中如果有抽象方法,该类必定是抽象类
  • 父类中定义的抽象方法必须在子类中重写
  • 抽象方法需要特殊修饰符修饰:abstract
访问权限修饰符 abstract 返回值类型 方法名(形式参数列表);

Q: 在子类中都重写了方法,父类中为什么还要定义抽象类?

A:如果在父类中没有对应的方法,那么我们使用多态时,就无法通过父类调用子类特有的属性和方法

抽象类

  • 抽象类不能创建对象,但可以使用构造方法,构造方法用于被子类调用
  • 抽象类中不一定有抽象方法,但是抽象方法的类一定是抽象类
  • 当子类继承了抽象的父类,那么强制要求子类重写对应的抽象方法,如果子类不重写,那么子类也为抽象类
  • 抽象类可以用于多态的使用
  • 抽象类可以用于作为一个程序架构体系中的基类(基础类)
访问权限修饰符 abstract class 类名 {
    // 属性
    // 方法
}

匿名内部类

类只能使用一次

因为抽象类无法被实例化,重写的方法只是存在于堆中,并没有加载到方法区,所以它无法当作模板来创建一个对象。

?:匿名内部类,所以才被称为只能调用一次?

?:匿名内部类与new arr(){‘2’,‘2’...};的关系,没有关系

父类名 对象名 = new 父类名() {
    重写抽象方法
};

// 实例
Vehicle vehicle = new Vehicle() {
    @Override
    public double calRent(int rentDays) {
        return 1+1+rentDays;
    }
};
double calRent = vehicle.calRent(10);
System.out.println(calRent);  // 12

接口

接口的概念

Java 只能实现类的单继承,却可以通过接口来实现 “多继承”

类继承:子类 is a 父类

实现接口:子类 has a 父类

接口的使用

  • 在接口中,定义的方法主要是公共的抽象方法
  • Java 8 以前,接口中只能定义公共的抽象方法
  • Java 8 以后,接口中还允许定义公共的默认(default)方法,这样就不是强制子类重写方法了
  • 在接口中,定义的属性都是公共静态常量
  • 接口之间可以使用继承关键字(extends)
  • 接口没有构造方法,也不能创建对象

定义父类:接口

接口中一般定义行为/方法

访问权限修饰符 interface 接口名 {
    属性;
    行为;
}

子类继承父类:实现接口

访问权限修饰符 class 子类名 implements 接口名, 接口名2, ... {
    // 属性
    // 方法
    // 重写方法     
}

抽象类和接口的区别

  1. 抽象类(abstract class)毕竟是一个类,Java 是单根继承,所以一个子类只能继承一个抽象类;但是一个子类可以实现多个接口(interface),并且一个接口也可以继承多个接口来扩展自身。
  2. 抽象类和接口都不能实例化,但抽象类可以有构造方法,而接口不能有构造方法。
  3. 接口中定义的变量只能是 public static final 修饰的静态常量,而抽象类没有此限制。
  4. 有抽象方法的一定是抽象类,但抽象类不一定有抽象方法,它也可以有非抽象方法;而接口在 JDK 1.8 之前定义的方法都是公共的抽象方法,在 JDK 1.8 开始也可以定义公共的被 default 修饰的带实现的默认方法。不过如果一个实现类实现的两个接口都有相同的方法,而且它们对这个方法都进行了 default 默认实现,那么实现类就必须重写该方法。
  5. 接口在 JDK 1.8 之前因为只能定义抽象方法,所以所有的方法都是 public 修饰的(为了子类可以进行方法重写),但在 JDK 1.8 开始支持定义带实现的默认方法,所以在 JDK 1.9 的时候,也可以定义私有方法了,目的是在接口中可以复用内部方法了,当然了抽象方法依然只能是 public 修饰的;抽象类除了抽象方法不能定义为私有访问权限的之外,其他没有限制。
  6. 抽象类中可以定义静态方法,且可以被子类使用;而接口在 JDK 1.8 开始才可以定义静态方法,并且只能被接口调用,接口的实现类无法使用。
  7. 抽象类和接口都代表着系统的抽象层,但抽象类可以通过抽取子类共有的信息来实现属性和行为的复用,而接口往往是作为子类的行为规范,虽然也增加了默认实现,但也仅仅是行为的复用。

推荐回答思路: 先从类和接口的区别提起,再由它们的组成开始介绍:构造方法 -> 成员变量 -> 成员方法(抽象及访问权限修饰符) -> 静态方法 -> 作用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值