【从0开始学习Java | 第8篇】抽象类和接口
文章目录
- 🥝抽象类
- 概念
- 如何定义一个抽象类
- 抽象方法定义语法📖
- 抽象类总结规定🧾
- 🥝接口
- 接口定义
- 实现接口语法
- 接口特性🍂
- 接口与类的区别⚠️
- 抽象类和接口的区别⚠️
🥝抽象类
概念
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类,即该抽象类反应了该类的大致信息,但不够充分,还需要继续补充。
注意:抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样
在 Java 中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口
如何定义一个抽象类
public abstract class 类名{
//定义一个抽象类
}
抽象方法定义语法📖
如果你想设计这样一个类,该类包含一个特别的成员方法,该方法的具体实现由它的子类确定,那么你可以在父类中声明该方法为抽象方法。
Abstract 关键字同样可以用来声明抽象方法,抽象方法只包含一个方法名,而没有方法体
访问修饰符 abstract 返回值类型 方法名(参数列表);
//知道要做一件事情,但不知道具体怎么去做这件事情
代码示例:
public abstract class Animal {//抽象方法是没有方法体的。因为方法体就是表示知道具体怎么去做这件事情。public abstract void eat();
}public class Panda extends Animal {@Overridepublic void eat() {System.out.println("熊猫吃竹叶");}
}public class Tiger extends Animal{@Overridepublic void eat() {System.out.println("老虎吃肉");}
}public class AnimalTest {public static void main(String[] args) {Animal a1 = new Panda();a1.eat();Animal a2 = new Tiger();a2.eat();}
}
声明抽象方法会造成以下两个结果:
- 如果一个类包含抽象方法,那么该类必须是抽象类
- 任何子类必须重写父类的抽象方法,或者声明自身为抽象类
继承抽象方法的子类必须重写该方法。否则,该子类也必须声明为抽象类。最终,必须有子类实现该抽象方法,否则,从最初的父类到最终的子类都不能用来实例化对象
抽象类总结规定🧾
- 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象
- 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类
- 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现,也就是方法的具体功能
- 构造方法,类方法(用 static 修饰的方法)不能被声明为抽象方法
- 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类
🥝接口
接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过实现接口的方式,从而来继承接口的抽象方法。
接口并不是类,类描述对象的属性和方法。接口则包含类要实现的方法。
接口定义
[public] interface 接口名 {
[public static final]数据类型 变量名 = 变量的值; //接口中定义变量,该变量是静态常量,在定义的时候必须赋值返回值类型 方法名([参数列表]);//定义接口方法default 返回值类型 方法名([参数列表]) {//接口中定义的默认方法,必须在JDK8及以上版本使用[ return 返回值;]}static 返回值类型 方法名([参数列表]) {//接口中定义的静态方法,必须在JDK8及以上版本使用[ return 返回值;]}private 返回值类型 方法名([参数列表]) {//接口中定义的私有方法,必须在JDK9及以上版本使用[ return 返回值;]}
}
实现接口语法
访问修饰符 class 类名 implements 接口名1, 接口名2,...接口名n{
}
例子:
public interface USB {void service(); //USB接口服务
}public class KeyBoard implements USB {@Overridepublic void service() {System.out.println("键盘已接入,可以开始打字了");}
}
接口特性🍂
- 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)
- 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)
- 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法
接口与类的区别⚠️
- 接口不能用于实例化对象
- 接口没有构造方法
- 接口中所有的方法都必须是抽象方法,Java 8之后接口中可以使用default关键字修饰的非抽象方法
- 接口不能包含成员变量,除了 static 和 final 变量
- 接口不是被类继承了,而是被类实现
- 接口支持多态继承
抽象类和接口的区别⚠️
特性 | 接口(Interface) | 抽象类(Abstract Class) |
---|---|---|
继承关系 | 一个类可实现多个接口(多实现) | 一个类只能继承一个抽象类(单继承) |
成员变量 | 只能是public static final常量 | 可包含任意修饰符的成员变量 |
方法实现 | 抽象方法无实现;默认方法和静态方法有实现 | 可包含普通方法(有实现)和抽象方法(无实现) |
构造方法 | 无构造方法 | 有构造方法(供子类调用) |
设计意图 | 定义 “能做什么”(行为规范),体现 “like-a” 关系 | 定义 “是什么”(类的本质),体现 “is-a” 关系 |
单/多继承 | 支持多继承 | 只能单继承 |
一句话总结:接口侧重 “功能扩展”,抽象类侧重 “继承体系”。
如果我的内容对你有帮助,请 点赞 , 评论 , 收藏 。创作不易,大家的支持就是我坚持下去的动力!