java基础(6)抽象类和接口

发布于:2024-10-15 ⋅ 阅读:(144) ⋅ 点赞:(0)


目录

​编辑

1.前言

2.正文

2.1抽象类

2.1.1抽象类的概念

2.1.2抽象类的语法

2.1.3抽象类的特点

2.1.4抽象类的作用

2.2接口

2.2.1接口的概念

2.2.2接口的用法

2.2.3接口的特点

2.2.4实现多个接口

2.2.5接口间的继承 

2.2.6抽象类和接口的区别

3.小结


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抽象类的特点

那么抽象类有哪些特点呢,又有哪些使用的时候需要注意的事项呢?

特点:

  • 不能实例化:抽象类不能直接创建对象,只能作为基类被继承。

  • 包含抽象方法:抽象类可以包含一个或多个抽象方法,这些方法没有实现,必须由子类提供实现。

  • 包含具体方法:抽象类也可以包含具体方法,这些方法有实现,可以直接被子类继承。

  • 多态性:抽象类允许多态,即可以通过抽象类类型的引用或指针来引用子类对象。


注意事项:

  1. 强制实现:子类必须实现抽象类中的所有抽象方法,除非子类也是抽象的

  2. 继承限制:一个类只能继承一个抽象类。

  3. 构造方法:虽然抽象类不能被实例化,但它们可以有构造方法,这些构造方法在子类的构造过程中被调用(super关键字)。

  4. 访问修饰符:抽象方法通常使用 public 访问修饰符,以确保子类可以覆盖它们。

  5. 抽象类的方法实现:抽象类中的方法可以有实现,这些方法可以被子类继承。

  6. 抽象类与接口:在某些语言中,抽象类和接口有相似之处,但它们之间也有区别。例如,在Java中,接口中的方法默认是 publicabstract 的,而抽象类可以包含 privateprotectedpublic 方法。

  7. 抽象类与具体类:抽象类不能直接使用,必须通过具体子类来实现其抽象方法后才能使用。

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.小结

今天关于抽象类和接口的讲解到这里就结束了,喜欢的小伙伴不要忘了点点关注点点收藏支持一下哦,你的支持就是对我最大的鼓励。


网站公告

今日签到

点亮在社区的每一天
去签到