抽象类与接口(Java系列6)

news2024/11/26 2:38:38

目录

前言:

1.抽象类

1.1抽象类的概念及语法

1.2 抽象类的特征

1.3抽象类的特性

2.接口

2.1接口的概念及语法

2.2接口的使用及特性

2.2.1接口的使用

2.2.2接口的特性

2.3实现多个接口

2.4接口的继承

3.抽象类与接口的区别

结束语:


前言:

上一次小编讲解了继承、组合和多态,这次小编和大家分享一下抽象类与接口的知识点。

1.抽象类

1.1抽象类的概念及语法

在面向对象的概念中,所有的对象都是通过类来描述的,但是反过来,并不是所有的类都是用来描述对象的,如果这个类中没有包含足够的信息来描述一个具体的对象,这样的类就是抽象类。

1.2 抽象类的特征

关键字:abstract

通过abstract修饰的类就叫抽象类,通过abstract修饰的方法叫抽象方法。

代码如下所示:

package demo1;
//抽象类Test
public abstract class Test {
    public int a;//成员变量
    public void func1(){
        //普通方法
    }
    abstract public void func2();//抽象方法
}

注意:

  • 被abstract修饰的方法不能有方法体。 
  • 抽象方法也是类,也可以有类的一般属性,可以有普通方法和属性,甚至构造方法。

1.3抽象类的特性

①抽象类不能直接实例化对象。

②抽象方法不被private、final和static修饰,因为被abstract修饰的方法需要在子类中重写,被修饰之后就不能重写了。

③抽象类必须要被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类,必须要使用abstract修饰。

代码如下所示:

package demo1;
abstract class Shape{
   abstract public void draw();
   abstract void calcArea();
}
class Rect extends Shape{
    private double length;
    private double width;

    public Rect(double length, double width) {
        this.length = length;
        this.width = width;
    }

    @Override
    //该注释可以帮助我们检查重写代码的格式是否正确
    public void draw() {
        //子类必须重写父类的abstract修饰的方法
        System.out.println("矩形为:length=" + length + " width=" + width);
    }

    @Override
    void calcArea() {
        //子类必须重写父类的abstract修饰的方法
        System.out.println("矩形的面积为:" + length * width);
    }
}
public class Test2 {
    public static void main(String[] args) {
        Rect rect = new Rect(12,23);
        rect.draw();
        rect.calcArea();
    }
}


结果如下所示:

④抽象类中不一定包含抽象方法,但包含抽象的方法的类必须是抽象类。

 

 ⑥抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量。

代码如下所示:

package demo1;
abstract class A{
    public int a;
    public int b;
    abstract public void func();

    public A(int a, int b) {
        this.a = a;
        this.b = b;
    }
}
class B extends A{

    public B(int a, int b) {
        super(a, b);
        //先帮助父类构造
    }

    @Override
    public void func() {
        System.out.println("对父类被abstract修饰的方法进行重写!");
    }
}
public class Test3 {
    public static void main(String[] args) {
        B b = new B(1,2);
        b.func();
    }
}

结果如下所示:

2.接口

2.1接口的概念及语法

接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。在java中,接口也可以看做是:多个类的公共规范,是一种引用数据类型。

关键字:interface。

代码如下所示:

interface IUsb{
    //一个接口的定义
    void func();
}

注意:

  • 创建接口时,接口的命名一般以大写字母I开头。 
  • 接口命名时一般使用“形容词”词性的单词。
  • 阿里编码规范中约定,接口中的方法和属性不要加任何修饰符号,保持代码的简洁性。

2.2接口的使用及特性

2.2.1接口的使用

接口不可以直接使用,必须要有一个“实现类”来“实现”该接口,实现接口中的所有抽象方法。

关键字:implements

代码如下所示:

package demo2;

public class Test2 implements IUsb{
    @Override
    public void func() {
        //实现接口中的所有抽象方法
    }
}

注意:子类和父类直接是extends继承关系,类与接口之间是implements实现关系。

2.2.2接口的特性

①接口类型是一种引用类型,但是不能直接new接口的对象。

②接口中的每一个方法都是public的抽象方法,即接口中的方法会被隐式指定为public abstract(只能是public abstract,其他修饰符都会报错)。

interface B{
    void func1();
    public abstract void func2();
    //其中func1和func2之前的修饰符都是一样的。
}

 ③接口中的方法是不能在接口中实现的,只能由实现接口的类来实现。

package demo2;
interface C{
    public abstract void func();
    //不可以在接口中实现该方法,而是应该在实现类中实现该方法!!!
//    public abstract void func2(){
//        System.out.println("接口中实现方法体!");
//    }
}
public class Test5 implements C{

    @Override
    public void func() {
        System.out.println("在实现类中实现!");
    }
}

④重写接口中方法时,不能使用默认的访问权限。

package demo2;
interface D{
    void func();
}
public class Test6 implements D {
    @Override
    void func() {
        System.out.println("不可以使用默认的访问权限!!!");
    }
//    @Override
//    public void func() {
//        System.out.println("使用public修饰的!!!");
//    }

}

⑤接口中可以含有变量,但是接口中的变量会被隐式的指定为public static final变量。

interface E{
    public static final int a = 10;//必须要给定默认值
    double b = 1.2;//默认是被public static final修饰的。
}

⑥接口中不能有静态代码块和构造方法。

interface F{
//    static {
//        //不能有静态代码块
//    }
    int a = 10;
    int b = 20;
    //不可以有构造代码块
//    public F(int a, int b) {
//        this.a = a;
//        this.b = b;
//    }
}

⑦接口虽然不是类,但是接口编译完成后字节码文件后缀格式也是.class。

⑧如果类没有实现接口中的所有的抽象方法,则该类必须设置为抽象类。

package demo2;
interface G{
    void func1();
    void func2();
    //如果类没有实现接口中的所有的抽象方法,则该类必须设置为抽象类。
}
public abstract class Test9 implements G{
    @Override
    public void func1() {
        //只实现一个抽象方法,则该类必须置为abstract
    }
}

⑨JDK8中:接口中还可以包含default方法。

interface H{
    //default void func3();在JDK8中可以。
}

2.3实现多个接口

在Java中,类和类之间是单继承的,一个类只能有一个父类,即Java中不支持多继承,但是一个类可以实现多个接口。

代码如下所示:

package demo3;
interface IEat{
    void eat();
}
interface IRunning{
    void run();
}
public class Animal {
    public String name;
    public int age;
    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
class Cat extends Animal implements IEat,IRunning{
    //先继承,再实现。继承只能继承一个,实现可以实现多个接口
    public Cat(String name, int age) {
        super(name, age);
    }
    @Override
    public void eat() {
        System.out.println(name + "正在吃饭!");
    }

    @Override
    public void run() {
        System.out.println(name + "正在跑!");
    }

    public static void main(String[] args) {
        Cat cat = new Cat("咪咪",12);
        cat.eat();
        cat.run();
    }


}

结果如下所示:

 注意:一个实现类实现多个接口的时候,每一个接口中的抽象方法都要实现,否则该类必须设置为抽象类。

2.4接口的继承

在java中,类和类之间是单继承,一个类可以实现多个接口,接口与接口之间可以多继承,即用接口可以达到多继承的目的。

关键字;extends。

代码如下所示:

package demo4;
interface IRunning{
    void run();
}
interface ISwimming{
    void swimming();
}
interface IFly extends IRunning,ISwimming{
    //实现了接口间的多继承
    void fly();
}
public class Animal {
    public String name;
    public int age;

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
class Duck extends Animal implements IFly{

    public Duck(String name, int age) {
        super(name, age);
    }

    @Override
    public void run() {
        System.out.println(name + "正在跑!");
    }

    @Override
    public void swimming() {
        System.out.println(name + "正在游泳!");
    }

    @Override
    public void fly() {
        System.out.println(name + "正在飞");
    }

    public static void main(String[] args) {
        Duck duck = new Duck("阿飞",13);
        duck.fly();
        duck.run();
        duck.swimming();
    }
}

结果如下所示:

3.抽象类与接口的区别

抽象类:

  • 是对一个事物在抽象。
  • 可以继承一个普通类。
  • 可以继承一个抽象类。
  • 可以继承一个普通类/抽象类同时实现多个接口。

接口:

  • 是对一个行为或者规范在设定标准。
  • 可以通过extends拓展多个接口的功能。

结束语:

这次小编主要和大家分享了抽象类和接口的一些简单知识点,至于具体的应用后期小编还会继续出的,敬请期待,希望对大家有所帮助,想要学习的同学记得关注小编和小编一起学习吧!如果文章中有任何错误也欢迎各位大佬及时为小编指点迷津(在此小编先谢过各位大佬啦!) 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/114182.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分布式理论之分布式选举

写在前面 一个国家需要领导人制定各种国家决策,一个军队也需要最高统领来制定各种军事决策,同理,一个分布式集群也需要一个领导,来协调整个集群的事务,比如保证数据一致性(这也是最重要的!),分…

uni-app学习总结

本文以B站黑马教程的uni-app项目实战视频为载体,总结uni-app相关用法,如有误,请指出~ 一、创建项目: HbuilderX工具-->文件-->新建-->项目---》选择uni--app项目,创建。 二、项目初始化: 去掉一…

设计模式之结构型模式:适配器模式

前言 前面讲解完了设计模式中的创建性模式,本文开始讲解设计模式中的结构性模式之一:适配器模式。 一、适配器模式的是干什么的? A类想要使用B类中的某些方法,但是不能直接使用,需要一个中间类对B类进行处理后&…

C++的类型转换

目录C语言中的类型转换为什么C需要四种类型转换C强制类型转换static_castreinterpret_castconst_castdynamic_castC语言中的类型转换 在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不…

【Linux】第七部分 Linux中系统管理

【Linux】第七部分 Linux中系统管理 文章目录【Linux】第七部分 Linux中系统管理7. Linux中系统管理7.1 进程和服务7.2 service 服务管理systemctl 基本语法systemctl设置后台服务的自启动配置关机重启命令总结7. Linux中系统管理 7.1 进程和服务 一个正在执行的程序或命令&a…

2023年快到了,就简单用python写个对联吧

人生苦短 我用python 我知道现在离过年还早~ 但是早点准备早点轻松~ Python写对联挺火的,但是代码又不是人人都用,那就直接写个界面打包一下呗~ 主要实现只要运行后输入上联下联、横批,然后自动生成春联保存在代码文件夹,如果…

梦想SkyPython IDLE入门

IDLE是Python软件包自带的一个集成开发环境,初学者可以利用它方便地创建、运行、测试和调试Python程序。 一、IDLE的安装 实际上,IDLE是跟Python一起安装的,不过要确保安装时选中了“Tcl/Tk”组件,准确地说,应该是不要…

六、应用层(一)网络应用模型

目录 1.1 客户/服务器模型 1.2 P2P模型 应用层是计算机网络体系结构的最顶层,是设计和建立计算机网络的最终目的,也是计算机网络中发展最快的部分。 早期基于文本的应用(电子邮件、远程登陆、文件传输、新闻组)20世纪90年代将…

node.js+uni计算机毕设项目基于微信小程序的培训机构管理系统小程序(程序+小程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等…

六、应用层(二)域名系统(DNS)

目录 2.1层次域名空间 2.2域名服务器 2.3域名解析过程 域名系统(Domain Name System,DNS)是因特网使用的命名系统,用来把便于人们记忆的具有特定含义的主机名转换为便于机器处理的IP地址。 多台主机可以映射到同一个域名上(如负…

智慧工地车辆冲洗系统 工地渣土车未冲洗自动抓拍 yolo

智慧工地车辆冲洗系统 工地渣土车未冲洗自动抓拍 通过Python基于YOLOv7深度学习网络对现场画面实时监测分析。当识别到现场车辆冲洗不干净或者没有冲洗,系统就立即抓拍。与C / C等语言相比,Python速度较慢。也就是说,Python可以使用C / C轻松…

SpringCloud图文详解 | 两种注册中心远程调用负载均衡服务网关... | 系统性学习 | 无知的我费曼笔记

无知的我正在复盘SpringCloud,顺便上传笔记。 下图是我总结的 SpringCloud 知识的初级思维导图,后续会不断补充 文章目录微服务技术演变单体架构分布式架构微服务 - 特点微服务实现 - 技术对比微服务技术 - 实际应用SpringCloud知识点总结服务拆分和…

SSM框架学习记录-SpringMVC_day02

1.SSM整合 代码参考Springmvc_08_ssm 流程分析 添加依赖:pom.xml编写配置类: Spring的配置类SpringConfig.javaSpringMVC的配置类SpringMvcConfig.javaWeb项目的入口配置类ServletConfig.javaMyBatis的配置类MyBatisConfig.java第三方数据源的配置类Jdbc…

uniapp动态切换显示不同内容组件

需求描述 通过点击注册或是登录按钮切换不同的组件.默认显示登陆界面,登录字样加粗显示,登录页面显示手机号密码登录.点击注册切换到注册页面,注册字样加粗显示,页面显示手机号和验证码以及注册按钮.对应页面显示如下: 实现代码: <template><view class"conte…

pytorch实战(五)——时间序列多步预测的五种方法介绍

当需要根据已有的时间序列数据&#xff0c;预测未来多个时刻的状态时&#xff0c;被称之为时间序列多步预测。 时间序列多步预测有五种策略&#xff0c;分别为&#xff1a; 1、直接多步预测&#xff08;Direct Multi-step Forecast&#xff09; 2、递归多步预测&#xff08;Rec…

Redis5.0+——主从复制

说明 主机数据更新后根据配置和策略&#xff0c;自动同步到备机的master/slave机制&#xff0c;Master以写为主&#xff0c;Slave以读为主&#xff08;一主一从&#xff0c;一主多从&#xff09; 能实现目的 读写分离&#xff0c;性能拓展容灾区快速恢复&#xff08;当一个从…

【软件测试】资深测试的总结,接口测试中的最常见的几个错误......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 为了彻底进行API接口…

入门力扣自学笔记221 C++ (题目编号:1739)

1739. 放置盒子 题目&#xff1a; 有一个立方体房间&#xff0c;其长度、宽度和高度都等于 n 个单位。请你在房间里放置 n 个盒子&#xff0c;每个盒子都是一个单位边长的立方体。放置规则如下&#xff1a; 你可以把盒子放在地板上的任何地方。 如果盒子 x 需要放置在盒子 y…

工作流运行

工作流运行 定义内涵 工作流运行是工作流模板的依次执行&#xff0c;在工作流运行时&#xff0c;用户可以随时取消或查看正在 运行的任务。由于工作流运行的模板的不同&#xff0c;运行过程中可能会产生不同的新资源&#xff0c;如数据 处理类型的工作流会产生新的数据集&…

DJ15 8086 中断程序设计

目录 一、8086/8088 中断系统 1. 8086/8088 中断源类型 2. 中断向量表 3. CPU 中断类型码的获取方法 二、8259A 的引线及内部结构 1. 外部引线 2. 内部结构 3. 与系统总线的连接方式 4. 级联连接方式 5. 中断触发方式 三、8259A 的工作过程 四、8259A 的工作方式 …