【Java】接口 interface

news2024/11/20 3:21:04

目录

 概述

示例代码:

接口成员访问特点

示例代码:


概述

什么是接口

接口就是一种公共的规范标准,只要符合规范标准,大家都可以调用。

Java 中的接口更多的体现在对行为的抽象!

1. 接口 用关键字 interface 修饰

public interface 接口名 {}

2. 类实现接口用 implements 表示

public class 类 implements 接口 {}

3. 接口不能实例化

  • 接口如何实例化呢?

        参照多态的方式,通过实现类对象实例化,这叫接口多态

  • 多态的形式:具体类多态,抽象类多态,接口多态。

4. 多态的前提:

  • 有继承(抽象类)或者实现(接口)关系;
  • 有方法重写;
  • 有父(类/接口引用)指向(子/实现)类对象

5. 接口的实现类

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

示例代码:

Animal.java

package com.面向对象.Demo28;

public interface Animal {
    // 接口 Animal
    public abstract void eat();

}

CatImpl.java

package com.面向对象.Demo28;

public class CatImpl implements Animal {
    // CatImpl————实现类 实现了Animal接口

    /**
     * 实现类 必须重写 接口中的所有方法
     */
    @Override
    public void eat() {
        System.out.println("CatImpl-eat()-鱼");
    }
    /**
     * abstract class AnimalParent————抽象类  父类
     * Cat extends AnimalParent————子类
     *
     * 接口 主要体现抽象的行为
     * interface Animal————接口  父类
     * CatImpl implements Animal 实现类Animal接口  子类
     *
     * 抽象类 与 接口 有哪些区别?
     */
}

Test01.java

package com.面向对象.Demo28;

public class Test01 {
    public static void main(String[] args) {
//        new Animal();// 报错,抽象类与接口 不能被实例化
        // 都是通过 多态机制
        Animal animal = new CatImpl();
        animal.eat(); //CatImpl-eat()-鱼
    }
}

DogImpl.java

package com.面向对象.Demo28;

//public class DogImpl implements Animal{
    // 不想在实现类里重写Animal接口——abstract

//    @Override
//    public void eat() {}
public abstract class DogImpl implements Animal{

}

MayiktDogImpl.java

package com.面向对象.Demo28;

public class MayiktDogImpl extends DogImpl{
    //类图 Ctrl+Alt+u
    // MayiktDogImpl类 继承 DogImpl类,就必须重写 DogImpl类中的所有方法
    @Override
    public void eat() {

    }
}


接口成员访问特点

1. 成员变量只能是常量;(直接通过接口的名称访问即可)

        默认修饰符 public static final

2. 成员方法只能是抽象方法;(JDK8开始 是可以在接口中定义非抽象方法  需要加上default)

        默认修饰符 public abstract

3. 接口没有构造方法;

        因为接口只要对行为进行抽象,没有具体存在,一个类如果没有父类,默认继承自Object类

示例代码:

Animal.java

package com.面向对象.Demo29;

public interface Animal {
//    public int code1 = 100;
//    public final int code2 = 200; // final 修饰 不能修改
//    public  int code2 = 200; // final 修饰 不能修改, 默认是已经加上final
//    public static int code3 = 300; //static 修饰 Animal.属性名称 访问
//    public  int code3 = 300; //static 修饰 Animal.属性名称 访问,默认是已经加上static

//
    /**
     * 综上,上述代码可以简化,
     * 成员变量只能是常量;
     * 默认修饰符 public static final
     */
    int code1 = 100; //==>public final static int code1 = 100;
    int code2 = 200;
    int code3 = 300;

    /**
     * 抽象方法
     * 默认前面已经加上了public abstract
     */
    void eat();//==>public abstract void eat();

    /**
     * 在接口中 是否可以定义 非抽象方法呢? jdk8 是可以在接口中定义 非抽象方法 default
     * jdk8之前是不可以在接口中定义非抽象方法的
     */
    default void show(){ // ==> public default void show(){
        System.out.println("接口中-非抽象方法-show()");
    }

    /**
     * 在我们的接口中 是没有构造方法
     * 抽象类 和 接口 都是不能 直接 new
     * 抽象类 是有 构造方法
     * 接口 主要是对我们的行为来做抽象的概念
     */
//    public Animal(){}  // 报错,接口是没有抽象方法的
}

DogImpl.java

package com.面向对象.Demo29;

public class DogImpl implements Animal { //==>public class DogImpl extends Object implements Animal{
    @Override
    public void eat() {
        System.out.println("DogImpl-eat()");
    }

    public DogImpl() {
        super(); // 默认,父类中 无参构造方法 是我们Object 父类
    }
    /**
     * 既然 Animal接口中不可以定义无参构造方法(也不属于父类),那这里的是如何super()访问父类的?
     *  ∵ 定义了一个类 如果没有继承任何父类,则在默认情况下 就继承了我们的 object父类
     *  任何类的父类 都是 Object
     *  new DogImpl()————先执行Object父类-无参构造方法,再执行DogImpl-无参构造方法
     */
}

Test01.java

package com.面向对象.Demo29;

public class Test01 {
    public static void main(String[] args) {
        /**
         * 1.在接口中 定义的 成员变量 都是为 常量
         *      默认的成员变量是已经加上public final static 关键字的,
         * 2.在接口中 定义的 成员方法 默认的情况下 就是为 抽象方法
         *      默认已经加上了 public abstract 修饰成员方法,实现类 必须重写 接口中所用的抽象方法
         */
        Animal dog = new DogImpl();
        System.out.println(dog.code1); //100
        System.out.println(dog.code2); //200
        System.out.println(dog.code3); //300

//        dog.code1 = 300;//报错,常量是不可以修改
//        dog.code2 = 200;//报错,Cannot assign a value to final variable 'code2'
//        dog.code3 = 100;//报错,在接口中 定义的 成员变量 都是为 常量
        System.out.println("===========");
        System.out.println(Animal.code1); //100
        System.out.println(Animal.code2); //200
        System.out.println(Animal.code3); //300
    }
}

下一篇文章:

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

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

相关文章

AtCoder Beginner Contest 231(D-F,H)

D - Neighbors (atcoder.jp) (1)题意 给出M组关系,问是否有一个排列,能表示A[i]和B[i]相邻 (2)思路 考虑如果有环,显然不能满足排列,因为排列中度数最多为2,若有超过2的显…

JavaScript操作CSS样式

上节课我们基本完成了游戏的主体,这节课我们来学习如果使用JavaScript去操作CSS样式 ● 例如,我们现在想当玩家输入对的数字之后,我们讲背景改为绿色,并且把number的框宽度变大 const secretnumber Math.trunc(Math.random() * …

第十六章 类和对象——运算符重载

运算符重载概念:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。 一、加号运算符重载 作用:实现两个自定义数据类型相加的运算 class Person {public:Person() {};Person(int a, int b){this->m_A a;t…

5个适合初学者的初级网络安全工作,网络安全就业必看

前言 网络安全涉及保护计算机系统、网络和数据免受未经授权的访问、破坏和盗窃 - 防止数字活动和数据访问的中断 - 同时也保护用户的资产和隐私。鉴于公共事业、医疗保健、金融以及联邦政府等行业的网络犯罪攻击不断升级,对网络专业人员的需求很高,这并…

【异常错误】WSL2设置为全核cpu和全部内存

今天偶尔发现 WSL占用的内存是真实内存的一半(通过htop命令查看即可) 现在需要修改配置到使用全部的CPU资源: Windows R 键, 输入 %UserProfile% 并运行进入用户文件夹, 新建文件 .wslconfig,文件内容如下&#xf…

light client轻节点简介

1. 引言 前序博客: Helios——a16z crypto构建的去中心化以太坊轻节点 去中心化和自我主权对于Web3的未来至关重要,但是这些理想并不总适用于每个项目或应用程序。在非托管钱包和bridges等工具中严格优先考虑安全性而不是便利性的用户,可选择运行全节…

【JavaEE】多线程(五)- 基础知识完结篇

多线程(五) 文章目录 多线程(五)volatile关键字保证内存可见性JMM(Java Memory Model) 不保证原子性 wait 和 notifywait()notify()线程饿死 上文我们主要讲了 synchronized以及线程安全的一些话题 可重入…

【Unity】3D贪吃蛇游戏制作/WebGL本地测试及项目部署

本文是Unity3D贪吃蛇游戏从制作到部署的相关细节 项目开源代码:https://github.com/zstar1003/3D_Snake 试玩链接:http://xdxsb.top/Snake_Game_3D 效果预览: 试玩链接中的内容会和该效果图略有不同,后面会详细说明。 游戏规则 …

图像分割中的色块的提取

一 色块提取方法: ①首先是色彩模型的转换 由RGB颜色空间转到HSV颜色空间 原因:RGB颜色空间适合显示系统,但是各分量间相关性很强,比如当图像亮度发生变化时,RGB三个分量都会发生相应改变 但是HSV颜色空间更能感知颜色…

【Java 进阶篇】JDBC 数据库连接池 C3P0 详解

数据库连接池是数据库编程中常用的一种技术,它可以有效地管理数据库连接,提高数据库访问的性能和效率。在 Java 编程中,有多种数据库连接池可供选择,其中之一就是 C3P0。本文将详细介绍 C3P0 数据库连接池的使用,包括原…

LabVIEW使用ZigBee无线传感器开发住宅负载电力应用

LabVIEW使用ZigBee无线传感器开发住宅负载电力应用 长期以来,住宅客户的需求一直是电力行业的一部分。由于公用事业需要建设基础设施以满足即时和长期需求,因此公用事业账单既包含能源费用,其中衡量客户随时间消耗的总电量,也包含…

网络攻击常见手段总结

网络攻击常见手段总结 IP 欺骗 IP 欺骗技术是什么? IP 欺骗技术就是伪造某台主机的 IP 地址的技术。通过 IP 地址的伪装使得某台主机能够伪装另外的一台主机,而这台主机往往具有某种特权或者被另外的主机所信任。 攻击时,伪造大量的 IP 地…

文件操作 和 IO - 详解

一,认识文件 1.1 树形结构组织和目录 文件是对于"硬盘"数据的一种抽象,在一台计算机上,有非常多的文件,这些文件是通过 "文件系统" 来进行组织的,本质上就是通过 "目录"(文件夹) 这样…

PyTorch实例:简单线性回归的训练和反向传播解析

文章目录 🥦引言🥦什么是反向传播?🥦反向传播的实现(代码)🥦反向传播在深度学习中的应用🥦链式求导法则🥦总结 🥦引言 在神经网络中,反向传播算法…

第八章 排序 四、冒泡排序

目录 一、算法思想 二、例子 三、代码实现 四、验证 五、算法性能分析 注意:要分清楚交换次数和移动次数 六、总结 一、算法思想 从后往前,两两比较相邻元素的值,若为逆序,则交换它们的值,直到全部比较完。 二…

typescript: Builder Pattern

/*** file: CarBuilderts.ts* TypeScript 实体类 Model* Builder Pattern* 生成器是一种创建型设计模式, 使你能够分步骤创建复杂对象。* https://stackoverflow.com/questions/12827266/get-and-set-in-typescript* https://github.com/Microsoft/TypeScript/wiki/…

制作 3 档可调灯程序编写

PWM 0~255 可以将数据映射到0 75 150 225 尽可能均匀电压间隔

Python的NumPy库(一)基础用法

NumPy库并不是Python的标准库,但其在机器学习、大数据等很多领域有非常广泛的应用,NumPy本身就有比较多的内容,全部的学习可能涉及许多的内容,但我们在这里仅学习常见的使用,这些内容对于我们日常使用NumPy是足够的。 …

【Python】datetime 库

# timedelta(days, seconds, microseconds,milliseconds, minutes, hours, weeks) 默认按顺序传递参数 # 主要介绍 datetime.datetime 类 # 引入 from datetime import datetime today datetime.now() # 获取当前时间 2023-10-05 15:58:03.218651 today1 datetime.utcnow() #…

经典算法-----汉诺塔问题

前言 今天我们学习一个老经典的问题-----汉诺塔问题,可能在学习编程之前我们就听说过这个问题,那这里我们如何去通过编程的方式去解决这么一个问题呢?下面接着看。 汉诺塔问题 问题描述 这里是引用汉诺塔问题源自印度一个古老的传说&#x…