面向对象-接口的使用

1. 接口的概述

为什么有接口?

借口是一种规则,对于继承而言,部分子类之间有共同的方法,为了约束方法的使用,使用接口。

接口的应用: 接口不是一类事物,它是对行为的抽象。

2. 接口的定义和使用

接口用关键字interface来定义

        public interface 接口名{}

接口不能实例化

接口和类之间是实现关系,通过implements关键字表示

        public class 类名 implements 接口名{}

接口的子类(实现类)

        要么重写接口中的所有抽象方法

        要么是抽象类

注意1:接口和类的实现关系,可以单实现,也可以多实现。

public class 类名 implements 接口名1,接口名2{}

注意2:实现类还可以在继承一个类的同时实现多个接口

public class 类名 extends 父类 implements 接口名1,接口名2{}

练习:

 

父类:
package oopinterface.demo1;

public abstract class Animal {
    private String name;
    private int age;

    public Animal() {
    }

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    public abstract void eat();
}

 

游泳接口:
package oopinterface.demo1;

public interface Swim {
    public abstract void swim();
}
兔子类:
package oopinterface.demo1;

public class Rabbit extends Animal {
    public Rabbit() {
    }

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

    @Override
    public void eat() {
        System.out.println("兔子在吃胡萝卜");
    }
}
青蛙类:
package oopinterface.demo1;

public class Frog extends Animal implements Swim {
    public Frog() {
    }

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

    @Override
    public void eat() {
        System.out.println("青蛙在吃虫子");
    }

    @Override
    public void swim() {
        System.out.println("青蛙在蛙泳");

    }
}
狗类:
package oopinterface.demo1;

public class Dog extends Animal implements Swim{
    public Dog() {
    }

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

    @Override
    public void eat() {
        System.out.println("狗吃骨头");
    }

    @Override
    public void swim() {
        System.out.println("狗在狗刨");

    }
}
测试类:
package oopinterface.demo1;

public class Test {
    public static void main(String[] args) {
        Dog d = new Dog("小黄",2000);
        System.out.println(d.getName() +", " + d.getAge());
        d.eat();
        d.swim();

    }
}

 

3. 接口中成员的特点

成员变量: 只能是常量

默认修饰符:public static final

构造方法:没有

成员方法:只能是抽象方法

默认修饰符:public abstract

JDK7以前:接口中只能定义抽象方法。

JDK8的新特性:接口中可以定义有方法体的方法

JDK9的新特性:接口中可以定义私有方法

4. 接口和类之间的关系

类和类的关系: 继承关系,只能单继承,不能多继承,但是可以多层继承

类和接口的关系

实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口。

接口和接口之间的关系

继承关系,可以单继承,也可以多继承

如果实现类实现了下面的子接口(继承的子类),那么就需要重写所有的抽象方法(包含父类和子类的抽象方法)。

5. 接口和抽象类的综合案例

 

画图:从下往上

写代码:从上往下

父类:人

 

package oopinterface.demo2;
//由于父类的子类全部为抽象类,现在创建父类对象没有意义,所以将父类也设置成抽象类
public abstract class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
运动员:
package oopinterface.demo2;

public abstract class Sportsman extends Person {
    public Sportsman() {
    }

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

    public abstract void study();
}
教练:
package oopinterface.demo2;

public abstract class Coach extends Person {
    public Coach() {
    }

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

    public abstract void teach();
}
说英语接口:
package oopinterface.demo2;

public interface English {
    public abstract void speakEnglish();
}
乒乓球运动员:
package oopinterface.demo2;

public  class PpSportsman extends Sportsman implements English{
    public PpSportsman() {
    }

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

    @Override
    public void speakEnglish() {
        System.out.println("乒乓球运动员在说英语");
    }

    @Override
    public void study() {
        System.out.println("乒乓球运动员在练习打乒乓球");
    }
}
篮球运动员:
package oopinterface.demo2;

public class BasketballSportsman extends Sportsman {
    public BasketballSportsman() {
    }

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

    @Override
    public void study() {
        System.out.println("篮球运动员在学习打篮球。");
    }
}
篮球教练:
package oopinterface.demo2;

public class BaskateballCoach extends Coach {
    public BaskateballCoach() {
    }

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

    @Override
    public void teach() {
        System.out.println("篮球教练正在教打篮球。");
    }
}
乒乓球教练:
package oopinterface.demo2;

public class PpCoach extends Coach implements English{
    public PpCoach() {
    }

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

    @Override
    public void teach() {
        System.out.println("乒乓球教练在教打乒乓球。");
    }

    @Override
    public void speakEnglish() {
        System.out.println("乒乓球教练在学习说英语。");
    }
}
测试类;
package oopinterface.demo2;

public class Test {
    public static void main(String[] args) {
        PpSportsman pps = new PpSportsman("ml",24);
        System.out.println(pps.getName() + "," + pps.getAge());
        pps.speakEnglish();
        pps.study();
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

理论结合实践:用Umami构建网站分析系统

个人博客地址(欢迎大家访问):理论结合实践:用Umami构建网站分析系统 1. 引言 网站统计分析是一种通过收集、处理和分析网站数据来评估网站性能、用户行为和流量来源的综合方法。通过分析用户访问模式、页面浏览量、访问时长、用户…

【AI最前线】DP双像素sensor相关的AI算法全集:深度估计、图像去模糊去雨去雾恢复、图像重建、自动对焦

Dual Pixel 简介 双像素是成像系统的感光元器件中单帧同时生成的图像:通过双像素可以实现:深度估计、图像去模糊去雨去雾恢复、图像重建 成像原理来源如上,也有遮罩等方式的pd生成,如图双像素视图可以看到光圈的不同一半&#x…

sysbench压测DM的高可用切换测试

一、配置集群 1. 配置svc.conf [rootlocalhost dm]# cat /etc/dm_svc.conf TIME_ZONE(480) LANGUAGE(CN)DM(192.168.112.139:5236,192.168.112.140:5236) [DM] LOGIN_MODE(1) SWITCH_TIME(300) SWITCH_INTERVAL(200)二、编译sysbench 2.1 配置环境变量 [dmdba~]# vi ~/.bas…

高性能linux服务器运维实战小结 性能调优工具

性能指标 进程指标 进程关系 父进程创子进程时,调fork系统调用。调用时,父给子获取一个进程描述符,并设置新的pid,同事复制父进程的进程描述符给子进程,此时不会复制父进程地址空间,而是父子用相同地址空…

pcb元器件选型与焊接测试时的一些个人经验

元件选型 在嘉立创生成bom表,对照bom表买 1、买电容时有50V或者100V是它的耐压值,注意耐压值 2、在买1117等降压芯片时注意它降压后的固定输出,有那种可调降压比如如下,别买错了 贴片元件焊接 我建议先薄薄的在引脚上涂上锡膏…

【zookeeper03】消息队列与微服务之zookeeper集群部署

ZooKeeper 集群部署 1.ZooKeeper 集群介绍 ZooKeeper集群用于解决单点和单机性能及数据高可用等问题。 集群结构 Zookeeper集群基于Master/Slave的模型 处于主要地位负责处理写操作)的主机称为Leader节点,处于次要地位主要负责处理读操作的主机称为 follower 节点…

C 语言复习总结记录三

C 语言复习总结记录三 一 函数的定义 维基百科中对函数的定义:子程序 在计算机科学中,子程序(英语:Subroutine, procedure, function, routine, method, subprogram, callable unit),是一个大型程序中的…

MYSQL——多表设计以及数据库中三种关系模型

大致介绍数据库中三种关系模型 一对多(1:N) 定义: 一个实体可以与另一个实体的多个实例相关联,而后者只能与前者的一个实例相关联。 例子: 学生和课程的关系。 学生(1):每个学生…

OpenCV和Qt坐标系不一致问题

“ OpenCV和QT坐标系导致绘图精度下降问题。” OpenCV和Qt常用的坐标系都是笛卡尔坐标系,但是细微处有些不同。 01 — OpenCV坐标系 OpenCV是图像处理库,是以图像像素为一个坐标位置,即一个像素对应一个坐标,所以其坐标系也叫图像…

实验四:构建园区网(OSPF 动态路由)

目录 一、实验简介 二、实验目的 三、实验需求 四、实验拓扑 五、实验步骤 1、在 eNSP 中部署网络 2、设计全网 IP 地址 3、配置二层交换机 4、配置路由交换机并测试通信 5、配置路由接口地址 6、配置 OSPF 动态路由,实现全网互通 一、实验简介 使用路由…

《剖析 Spring 原理:深入源码的旅程(二)》

六、Spring 的 Bean 注入与装配 Spring 的 Bean 注入与装配的方式有很多种,可以通过 xml、get set 方式、构造函数或者注解等。简单易用的方式就是使用 Spring 的注解,Spring 提供了大量的注解方式,如 Autowired、Qualifier 等。Spring 还支持…

Java文件上传解压

目录结构 工具类 枚举 定义文件类型 public enum FileType {// 未知UNKNOWN,// 压缩文件ZIP, RAR, _7Z, TAR, GZ, TAR_GZ, BZ2, TAR_BZ2,// 位图文件BMP, PNG, JPG, JPEG,// 矢量图文件SVG,// 影音文件AVI, MP4, MP3, AAR, OGG, WAV, WAVE}为了避免文件被修改后缀&#xff0…

CSRF保护--laravel进阶篇

laravel对csrf非常重视,专门针对csrf作出了很多的保护。如果您是刚刚接触laravel的路由不久,那么您可能对于web.php路由文件的post请求很疑惑,因为get请求很顺利,而post请求则可能会遭遇失败。其中一个失败的原因是由于laravel的c…

jupyter notebook的 markdown相关技巧

目录 1 先选择为markdown类型 2 开关技巧 2.1 运行markdown 2.2 退出markdown显示效果 2.3 注意点:一定要 先选择为markdown类型 3 一些设置技巧 3.1 数学公式 3.2 制表 3.3 目录和列表 3.4 设置各种字体效果:加粗,斜体&#x…

【GAT】 代码详解 (1) 运行方法【pytorch】可运行版本

GRAPH ATTENTION NETWORKS 代码详解 前言0.引言1. 环境配置2. 代码的运行2.1 报错处理2.2 运行结果展示 3.总结 前言 在前文中,我们已经深入探讨了图卷积神经网络和图注意力网络的理论基础。还没看的同学点这里补习下。接下来,将开启一个新的阶段&#…

redis工程实战介绍(含面试题)

文章目录 redis单线程VS多线程面试题**redis是多线程还是单线程,为什么是单线程****聊聊redis的多线程特性和IO多路复用****io多路复用模型****redis如此快的原因** BigKey大批量插入数据测试数据key面试题海量数据里查询某一固定前缀的key如果生产上限值keys * ,fl…

神经网络问题之二:梯度爆炸(Gradient Explosion)

梯度爆炸(Gradient Explosion)是神经网络训练过程中常见的一个问题,它指的是在反向传播过程中,梯度值变得非常大,超出了网络的处理范围,从而导致权重更新变得不稳定甚至不收敛的现象。 一、产生原因 梯度爆…

小杨的N字矩阵c++

题目描述 小杨想要构造一个m*m 的 N 字矩阵( m为奇数),这个矩阵的从左上角到右下角的对角线、第1 列和第m 列都 是半角加号 ,其余都是半角减号 - 。例如,一个 5*5 的 N 字矩阵如下: --- -- -- -- --- 请…

2024 年企业中的生成式 AI 现状

2024: The State of Generative AI in the Enterprise - Menlo Ventures 企业 AI 格局正在被实时改写。随着试点(Pilot)让位于生产(Production),我们对 600 名美国企业 IT 决策者进行了调查,以揭示新出现的…

Ubuntu24虚拟机-gnome-boxes

推荐使用gnome-boxes, virtualbox构建失败,multipass需要开启防火墙 sudo apt install gnome-boxes创建完毕~