目录
1.前言
哈喽大家好吖,今天继续为大家带了java基础中也是比较关键的抽象类和接口,想要把这一部分理解透彻也是需要下大功力,那么让我们废话不多说,开始!
2.正文
2.1抽象类
2.1.1抽象类的概念
在原来我们学习到的继承体系中,由父类和子类构成,但如果父类里包含的信息不足以去构成一个对象,那我们就把其称为抽象类。
抽象类是一种特殊的类,它不能被实例化,并且通常包含一个或多个抽象方法。抽象类的主要目的是作为其他类的基类,提供一组通用的方法和属性,这些方法和属性可以被继承,但具体的实现则留给子类去完成。
看下面这张图你会更好理解:
在以下继承体系中,student类和teacher类分别继承了person类,但person类没有办法描述一个具体的一个成员,内部的某些方法无法实现(例如该成员的状态为在上课还是被上课状态),所以person类写为抽象类。
2.1.2抽象类的语法
至于我们如何写出抽象类,这里我们就需要引入关键字abstract。
定义抽象类:
使用
abstract
关键字定义一个类时,该类不能被直接实例化。它通常作为其他类的基类,提供一些通用的属性和方法。
定义抽象方法:
在抽象类中,你可以定义抽象方法。这些方法是没有具体实现的方法,使用
abstract
关键字声明,并且没有方法体。继承抽象类的子类必须提供这些抽象方法的具体实现。
下面我们照着上文的那张图片来完成代码:
person抽象类:
public abstract class person {
public int age;
public String sex;//普通属性
public person(int age, String sex) {
this.age = age;
this.sex = sex;
}
abstract public void behavior();//抽象方法
}
teacher类:
public class teacher extends person{
public String subject;
public teacher(int age, String sex, String subject) {
super(age, sex);
this.subject = subject;
}
@Override
public void behavior() {
System.out.println(this.subject + "老师正在上课");
}
}
student类:
public class student extends person{
public int id;
public student(int age, String sex, int id) {
super(age, sex);
this.id = id;
}
@Override
public void behavior() {
System.out.println("id为" + this.id + "的学生正在上课");
}
}
test测试类:
public class test {
public static void main(String[] args) {
teacher t1 = new teacher(34,"男","Math");
student s1 = new student(18,"女",001);
t1.behavior();
s1.behavior();
}
}
运行截图:
2.1.3抽象类的特点
那么抽象类有哪些特点呢,又有哪些使用的时候需要注意的事项呢?
特点:
不能实例化:抽象类不能直接创建对象,只能作为基类被继承。
包含抽象方法:抽象类可以包含一个或多个抽象方法,这些方法没有实现,必须由子类提供实现。
包含具体方法:抽象类也可以包含具体方法,这些方法有实现,可以直接被子类继承。
多态性:抽象类允许多态,即可以通过抽象类类型的引用或指针来引用子类对象。
注意事项:
强制实现:子类必须实现抽象类中的所有抽象方法,除非子类也是抽象的。
继承限制:一个类只能继承一个抽象类。
构造方法:虽然抽象类不能被实例化,但它们可以有构造方法,这些构造方法在子类的构造过程中被调用(super关键字)。
访问修饰符:抽象方法通常使用
public
访问修饰符,以确保子类可以覆盖它们。抽象类的方法实现:抽象类中的方法可以有实现,这些方法可以被子类继承。
抽象类与接口:在某些语言中,抽象类和接口有相似之处,但它们之间也有区别。例如,在Java中,接口中的方法默认是
public
和abstract
的,而抽象类可以包含private
、protected
和public
方法。抽象类与具体类:抽象类不能直接使用,必须通过具体子类来实现其抽象方法后才能使用。
2.1.4抽象类的作用
讲到这里,你有可能有疑问,抽象类和普通的父类也没有很多的区别啊,也有构造方法,成员方法也可以被重写,那么我们为何在工程中使用抽象类嘞。
那是因为我们在实际工程中有些代码的编写的目的就是起到了“防患于未然的作用”,有些时候我们是希望子类完成各种方法的实现,但如果我们采用普通父类却没有通过子类对方法进行实现,编译器此时不会有任何提醒。但如果我们使用抽象类,它就要求了必须通过子类来完成方法的实现,否则会报错,这就是编译器校验。
2.2接口
2.2.1接口的概念
讲完了抽象类,那接下来接口是什么呢?
接口(Interface)是一种抽象类型,用于指定一组方法,但不提供这些方法的实现。接口的主要作用是定义一种规范或契约,使得实现该接口的类必须遵守这一规范。通过使用接口,可以实现多重继承(即一个类可以实现多个接口)。
2.2.2接口的用法
接口的定义与使用就需要引入以下俩个关键字,interface关键字和implements关键字。
interface
关键字:
interface
关键字用于定义一个接口。接口是一种完全抽象的结构,它包含抽象方法和常量,但不包含实现细节。接口可以被类实现,实现接口的类必须提供接口中所有方法的具体实现。注意:接口中的变量默认是
public static final
的,因此它们是常量。
implements
关键字:
implements
关键字用于实现接口。当一个类使用implements
关键字声明它实现了一个或多个接口时,它必须提供接口中所有抽象方法的具体实现。注意:一个类可以实现多个接口。
接下来让我们附上一段代码更好的理解接口的含义以及用法:
person接口:
public interface person {
int a = 1;//可定义常量
abstract public void behavior();//抽象方法
}
teacher类:
public class teacher implements person{
public String subject;
public teacher(String subject) {
this.subject = subject;
}
@Override
public void behavior() {
System.out.println(this.subject + "老师正在上课");
}
}
student类:
public class student implements person{
public int id;
public student(int id) {
this.id = id;
}
@Override
public void behavior() {
System.out.println("id为" + this.id + "的学生正在上课");
}
}
test测试类:
public class test {
public static void main(String[] args) {
teacher t1 = new teacher("Chinese");
student s1 = new student(001);
t1.behavior();
s1.behavior();
}
}
运行结果:
2.2.3接口的特点
我们掌握了接口的用法,我们接下来总结一下接口的特点特性:
抽象性:
接口只描述对象能做什么,而不关心对象如何去实现这些功能。接口中的方法都是抽象的,没有方法体,不提供具体的实现。
不可实例化:
接口不能实例化,即不能使用
new
关键字来创建接口的对象。接口的存在主要是为了被类实现,从而由类提供具体的实现。
多继承:
类只能单继承,但接口可以多继承。一个接口可以继承多个其他接口,而一个类也可以实现多个接口,从而具备多个接口的功能。(下文我们会展示如何实现多继承)
成员属性与方法:
接口中的成员属性默认且仅可为
public static final
,接口中的方法默认且仅可为public abstract
。在定义接口时,可以不显式地写出这些修饰符,但它们是隐含的。
实现接口的类:
当一个类实现一个或多个接口时,它必须提供接口中所有抽象方法的具体实现(除非这个类也是抽象的,并且不实例化)。如果类没有实现接口中的所有方法,那么这个类必须声明为抽象类。
在这里我们再更加明确一下继承和接口之间的区别:
子类和父类之间是extends 继承关系,类与接口之间是 implements 实现关系。
2.2.4实现多个接口
上文我们展示的代码均是一个类实现一个接口,接下来我们展示一个类实现多个接口,还以上文的情景来同等实现问题:
俩个抽象类person类与gohome类:
public interface person {
void behavior();//抽象方法
}
public interface gohome {
void gohome();
}
teacher类:
public class teacher implements person,gohome{
public String subject;
public teacher(String subject) {
this.subject = subject;
}
@Override
public void behavior() {
System.out.println(this.subject + "老师正在上课");
}
@Override
public void gohome() {
System.out.println(this.subject + "老师下班了");
}
}
student类:
public class student implements person,gohome{
public int id;
public student(int id) {
this.id = id;
}
@Override
public void behavior() {
System.out.println("id为" + this.id + "的学生正在上课");
}
@Override
public void gohome() {
System.out.println("id为" + this.id + "的学生已经放学");
}
}
test测试类:
public class test {
public static void main(String[] args) {
teacher t1 = new teacher("Chinese");
student s1 = new student(001);
t1.behavior();
t1.gohome();
s1.behavior();
s1.gohome();
}
}
运行结果如图:
2.2.5接口间的继承
接口间的继承操作类似类的继承,想必以大家聪明才智无需多言,至于如何操作直接上代码:
public interface gohome {
void gohome();
}
public interface person extends gohome{
void behavior();//抽象方法
}
在使用person接口时,一定要注意讲person中和gohome中的抽象方法都要在子类当中实现。
2.2.6抽象类和接口的区别
到此为止,我们已经讲解完了抽象类和接口的概念以及相关使用,那么到底什么时候使用抽象类,什么时候使用接口呢,接下来就让我们重点讲解以下抽象类与接口之间的区别,这样能让我们更加明确二者的应用场景:
定义和用途:
抽象类:是一个不完全的类,包含未实现的方法(抽象方法)或已实现的方法(具体方法)。它不能被实例化,但可以包含构造器、状态(字段)和行为(方法)。抽象类的主要目的是提供一个类的模板,供其他子类继承并实现未完成的方法。
接口:是一个完全抽象的类,只包含抽象方法。接口不包含任何状态(字段),仅定义方法签名。接口的主要目的是定义一个对象能够做什么,而不关注其如何做到。
继承与实现:
抽象类:通过继承关系来关联,子类使用“extends”关键字来继承抽象类,并必须实现抽象类中定义的所有抽象方法(除非子类也是抽象类)。
接口:通过实现关系来关联,类使用“implements”关键字来实现接口,并必须提供接口中所有方法的具体实现。
多继承与多重实现:
抽象类:java中不支持多继承(一个类不能同时继承多个类),所以抽象类只能被单一继承。
接口:一个类可以实现多个接口,这解决了多继承的问题,允许一个类从多个接口中获取方法定义。
设计原则:
抽象类:适用于描述一个族谱的层次结构,抽象类提供了类之间的一种“是”(is-a)关系。
接口:适用于定义对象之间的行为契约,接口提供了对象之间的一种“能”(can-do)关系。
3.小结
今天关于抽象类和接口的讲解到这里就结束了,喜欢的小伙伴不要忘了点点关注点点收藏支持一下哦,你的支持就是对我最大的鼓励。
标签:java,实现,接口,id,抽象类,方法,public From: https://blog.csdn.net/2301_81073317/article/details/142955467