首页 > 编程语言 >java基础(6)抽象类和接口

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

时间:2024-10-16 18:18:39浏览次数:3  
标签:java 实现 接口 id 抽象类 方法 public


目录

​编辑

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

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

标签:java,实现,接口,id,抽象类,方法,public
From: https://blog.csdn.net/2301_81073317/article/details/142955467

相关文章

  • Java基础语法-运算符
    运算符Java语言支持如下运算符:算术运算符:+,-,,/,%,++,--赋值运算符:=关系运算符:>,<,>=,<=,==,!=instanceof逻辑运算符:&&,||,!位运算符:&,|,^,~,>>,<<,>>>(了解!!!)条件运算符:?:扩展赋值运算符:+=,-=,*=,/=//二元运算符inta=10;intb=20;intc=25;intd......
  • 前端开发 --JavaScript
    前言html种script主要包括内联script和引用外部JavaScript文件两张方式1.内联script的用法内联script指的是将JavaScript代码直接写在html文档中某个部位<!--内嵌--><script>alert(1)</script><script>windowonload=function(){vara......
  • JAVA入门必备知识点!!你入门了吗?
    目录技术能力考核——答案一、缓存中间件(一)理论部分请简述你熟悉的一种缓存中间件(如Redis)的底层数据结构,并举例说明其在实际应用中的优势。解释缓存穿透、缓存击穿和缓存雪崩的概念,并分别阐述应对这些问题的策略。在分布式系统中,如何保证缓存与数据库的数据一致性?请列......
  • java,awt,中文方框,中文乱码10/16
    今天,在学习图形化界面时,出现中文乱码。经过多种方法,总结1.在IDEA的顶部菜单栏中,选择“Run”(运行)选项。2.在下拉菜单中选择“EditConfigurations”(编辑配置)选项。3.在构建与运行中点修改选项4.添加虚拟机选项5.设置为-Dfile.encoding=gbk在重新运行就可以了。但是一开始,......
  • java_day12_Collection、List
    CollectionCollection【接口】:我们通过帮助文档发现,Collection是一个接口,不能直接new对象根据元素是否可以发生重复,继续分类-List【接口】元素可以发生重复,且有索引的概念ArrayList-Set【接口】元素不可以发生重复,没有索引借助ArrayList子类对......
  • <Leetcode:算法题及解析>最大子数组和(Javascript版)
    题目描述:给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。本题可以使用Kadane's算法实现,这是一种用于解决最大子数组和问题的高效算法。它由JosephBornKadane在1984年提出。这个算法的核......
  • TypeScript新手学习教程--接口
    TypeScript也支持接口,跟Java类似,这对于学习过java,c#,php语言的人更容易上手,虽然类似,但是也有不同,下面开始学习。1、 接口声明TypeScript的核心原则之一是对值所具有的结构进行类型检查。它有时被称做“鸭式辨型法”或“结构性子类型化”。在TypeScript里,接口的作用就是为......
  • jmeter压测问题: JAVA.NET.BINDEXCEPTION: ADDRESS ALREADY IN USE: CONNECT
    1.报错信息:2. 问题排查  1)询问AI,说端口被占用。修改了jmeter的端口号后,仍是不行  2)最后找到一篇博客,真的解决了问题     我只进行了,增大端口号,减少Time_Wait, Close_WAIT没有处理,仍解决了此问题 ......
  • 拥抱AI-海关机场护照查验-护照查验接口-护照识别真伪核验
    在全球化日益加深的今天,国际旅行已成为人们生活中不可或缺的一部分。无论是商务出行还是休闲旅游,护照作为国际通行的身份证明文件,其真实性和有效性至关重要。为了确保国家安全和旅客的顺利通关,海关机场在护照查验过程中采用了先进的护照识别真伪核验技术。什么是护照查验......
  • python+flask框架的 基于Java的外卖系统设计与实现 前台mp48(开题+程序+论文) 计算机
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景随着互联网技术的飞速发展,外卖服务已成为人们日常生活中不可或缺的一部分。关于外卖系统的研究,现有研究主要以技术实现和用户体验优化为主......