Java接口以及static和final关键字

2023-11-18

Java接口以及static和final关键字

一、static

二、final

三、让final元素可以初始化,不用固定赋值

四、接口

五、抽象方法

六、接口能够创建对象吗(匿名内部类)

七、另一实例,开锁

一、static

static代表静态的,唯一

主要有下面两种形式:

  • 修饰 属性: 属性属于类,由类名直接调用,属性只会在内存存在一份

  • 修饰 方法: 类名可以直接调用,不能直接使用本类的成员属性变量

在这里插入图片描述

二、final

final代表最终形态的、不可变

  • 修饰属性: 定义常量,不可修改,且需要定义时赋值

  • 修饰方法: 不能被子类重写

  • 修饰类:不能有子类,不能被继承

修饰属性如果不复制便会报错:
在这里插入图片描述

注意:并不是说必须在id后面直等于一个值进行赋值,只要有相应赋值的代码就可以,这也是下面第三大节我们要讲述的。

既然static代表唯一,final代表不可变,那么我们可以用static final结合来定义一个既不能修改又只能存在一个的常量,例如数学Math中的常量PI
在这里插入图片描述

三、让final元素可以初始化,不用固定赋值

我们很可能有这种情况,想为每个用户创建唯一的id,但是使用final又要固定赋值,不是我们想要的自增效果,那么如何来实现呢?

  1. 代码块:另定义一个static变量专门用来给id赋值,可以使用代码块来每次创建对象对id进行初始化
  2. 构造函数:在构造方法中直接给id赋值。

代码块:
在这里插入图片描述

构造函数:
在这里插入图片描述

我们测试一下第一种方式,因为第二种是按照我们个人随意制定,而第一种每次自动赋值。
在这里插入图片描述

输出:
在这里插入图片描述

可以看到进行了自动赋值,这也符合我们的需求。

四、接口

之前我们是用过ActionListener 接口,用来按钮点击处理,发现它有一个方法,且没有方法体,这是接口的一大特点。

  • 定义: interface /class

  • 1: 接口中所有的属性变量,都默认由static final 关键字修饰,即不可修改

  • 2: 接口中的方法,都默认为没有方法体的方法 ,抽象方法

  • 也可以定义 静态的(static)、默认的方法(default)

  • 格式 : interface 接口名{ }

这里指出了抽象方法,我们来介绍一下抽象方法

五、抽象方法

  • 抽象方法: 对于行为/功能的抽象, 只写了函数名而不写函数体

  • 类的方法是具体的:

    • 对于功能的扩展不方便
  • 使用接口:

    • 以接口中的方法作为 功能/行为的模板
    • 在接口的实现类、基于功能方法的模板进行自定义开发功能
    • 我们之前的ActionListener就很方便

举个买车票的例子:

买车票: 从深圳到北京是一个抽象行为,具体实现从深圳到北京方式以及路线是可以变化的

  • 起始站 目的站

  • A C

    • 火车票
      • A -> Z -> C
      • A -> R -> F -> C
      • A -> F -> V -> C
  • 抽象行为定义为接口

  • 每种具体的实现方式 作为接口的实现类

  • 1:创建一个类实现接口 implements

  • 2: 重写接口中的抽象方法 为实体方法

定义接口深圳去北京SZToBJ

public interface SZToBJ {
    void  fromSZtoBeiJing();
}

另建一个用户类,里面存放着要调用的接口方法,要调用接口的方法,自然函数的要传入一个接口,自然这个接口我们之后会自动使用接口的实现类,发生向上转型

public class User {
    // 由接口作为参数类型 定义一个参数
    public void goBeijing(SZToBJ tobj){
        // 接口变量名调用接口的抽象方法
        tobj.fromSZtoBeiJing ();
    }
}

定义实现接口的类,我这里使用了01,02,03来区分三种实现方式

public class SZToBJ_01 implements SZToBJ{
    // 重写方法
    @Override
    public void fromSZtoBeiJing(){
        System.out.println ("深圳出发");
        System.out.println ("经停拉萨");
        System.out.println ("到达北京");
        System.out.println ("费用:2000");
    }
}

class SZToBJ_02 implements SZToBJ{

    // 重写方法
    @Override
    public void fromSZtoBeiJing(){
        System.out.println ("深圳出发");
        System.out.println ("经停重庆");
        System.out.println ("到达北京");
        System.out.println ("费用:1500");
    }
}
class SZToBJ_03 implements SZToBJ{

    // 重写方法
    @Override
    public void fromSZtoBeiJing(){
        System.out.println ("深圳出发");
        System.out.println ("经停上海");
        System.out.println ("经停杭州");
        System.out.println ("到达北京");
        System.out.println ("费用:2500");
    }
}

到最后一步啦!我们要调用不同情况,这个Main类定义在哪里都可以运行的

class Main{

    public static void main(String[] args){
        // 基于接口 实现了三种方式的实现类
        SZToBJ_01 tb01=new SZToBJ_01 ();
        SZToBJ_02 tb02=new SZToBJ_02 ();
        SZToBJ_03 tb03=new SZToBJ_03 ();
        // 用户选择其中一种
        User user1 = new User();
        user1.goBeijing (tb02);
        user1.goBeijing (tb01);
    }
}

在这里插入图片描述

六、接口能够创建对象吗(匿名内部类)

可能小伙伴看了半天,感觉接口和类也没什么大的差别,类能创建对象,那么借口能不能用同样的方式创建对象呢?

我们尝试一下
在这里插入图片描述

经过idea自动改错后,我们发现它变成了这个样子:

在这里插入图片描述

好熟悉!这不就是实现接口中的方法嘛。因此我们这样并不是创建了一个接口对象,而是创建了一个类s来实现接口,这种方式叫做“匿名内部类”,就是创建了一个只可以使用一次的类,创建匿名内部类的目的就是为了简化接口使用,不然我们又要创建子类实现接口方法,然后这个子类又要创建对象。

七、另一实例,开锁

创建锁接口

/**
 * 抽象锁接口
 * - 自己创建一个类,实现接口,从而实现一把具体的锁
 * - Lock 具有对于 开 关 行为的分类 功能
 * - 所有的实现了Lock的实际锁 都是Lock 接口的子类
 */
public interface Lock{
    void lock();
    void unlock();
}

实现多种解锁方法

public class FaceIDLock implements Lock{

  @Override
  public void unlock(){
    System.out.println ("人脸识别正确,解锁 开门 ");
  }

  @Override
  public void lock(){
    System.out.println ("人脸识别正确,上锁 关门");
  }
}

class KeyLock implements Lock{

  @Override
  public void unlock(){
    System.out.println ("Key 验证正确,解锁开门!");
  }

  @Override
  public void lock(){
    System.out.println ("Key 验证正确,上锁 关门 ");
  }
}

实现

public class Door{
  Lock lock; // 接口声明对象变量名

  public void open(){
    lock.unlock ();
  }
  public void close(){
    lock.lock ();
  }
}
class DoorManage{

  public static void main(String[] args){
    Door door1 = new Door ();

    // 先给 lock 初始一个具体的锁对象
    // 创建了Lock 接口的子类对象
    FaceIDLock faceIDLock = new FaceIDLock ();
    // 装锁
    door1.lock = faceIDLock;

    door1.open ();
    door1.close ();

    KeyLock keylock = new KeyLock ();
    door1.lock=keylock;

    door1.open ();
    door1.close ();
  }
}

//先给 lock 初始一个具体的锁对象
    // 创建了Lock 接口的子类对象
    FaceIDLock faceIDLock = new FaceIDLock ();
    // 装锁
    door1.lock = faceIDLock;

    door1.open ();
    door1.close ();

    KeyLock keylock = new KeyLock ();
    door1.lock=keylock;

    door1.open ();
    door1.close ();
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java接口以及static和final关键字 的相关文章

  • Java 中类似 HashMap 的可排序数据结构?

    Java 中是否有某种类似于 HashMap 的数据结构 可以按键或值排序 在 PHP 中 您可以拥有可排序的关联数组 Java中有这样的东西吗 HashMaps 几乎按照定义是未排序的 一个好的哈希函数会产生看似随机的密钥分布 如果你想使
  • CompletableFuture:whenCompleteAsync() 不允许我重新抛出异常

    我是 CompletableFuture 世界的新手 我正在尝试做一些负面测试 以允许我故意抛出异常的方式 该异常将决定通过 失败 这是代码片段 protected CompletableFuture
  • 从字符串中删除多个子字符串 - Java

    我需要从给定字符串中删除多个子字符串 例子 String exclude one two three String input if we add one and two we get three 我希望我的程序从输入字符串中删除所有出现的
  • JAVA_HOME环境变量和Java JDK趣事

    我想让 Java 在 1 6xxx 上运行 我更改了 JAVA HOME 变量并将其指向目录 C Program Files Java jdk1 6 0 16 我重新启动 PC 我想我可以检查我的机器指向哪个版本的 Java 但它仍然指向旧
  • cygwin有java sdk吗?

    cygwin有java sdk吗 如果有一个使用 cygwin 文件系统和 X windows 进行显示的本机 cygwin 实现 那就太好了 不幸的是我不知道这样的版本 我认为移植 OpenJDK 也需要付出很大的努力 但我还没有尝试过
  • 如何通过两跳 SSH 隧道使用 JProfiler

    我正在尝试将 JProfiler 连接到在我将调用的服务器上运行的 JVMremote 该服务器只能从我的工作站访问 local 通过我将调用的另一台服务器middle 我的计划是将 JProfiler 连接到remote是这样的 安装 J
  • Spring批量写入器限制

    我正在工作 Spring Batch 项目 从数据库读取记录然后写入rabbitmq 然后发送到HTTP消息网关 网关有150TPS我需要将我的应用程序限制为 150TPS 有没有办法带弹簧批的油门或者还有其他更好的方法吗 你能行的 在 S
  • 打印数组时出错

    我得到这个代码 import java util import java io public class Oblig3A public static void main String args OrdAnalyse O new OrdAna
  • LibGDX 闪烁

    我已经使用 LibGDX UI 设置来启动一个项目 我在实现 ApplicationListener 中唯一拥有的是 public void create setScreen new LoadingScreen this 这应该会触发 Lo
  • 如何使用jdbc驱动编写事务?

    我想使用 jdbc 编写一个事务java 我尝试过这个简单的交易 BEGIN TRANSACTION NL GO NL UPDATE table SET col test where id 1010 NL GO NL COMMIT 我尝试过
  • 使用 JavaFX 将可执行 Jar 限制为一个窗口

    我正在通过构建 JavaFX 应用程序E fx 剪辑 and Java场景生成器 基本功能是登录窗口 登录后 将打开新窗口 然后登录窗口消失 目前还处于原型阶段 用完eclipse后 我想要的功能都有了 启动时显示登录窗口 代码如下 Ove
  • oracle.jdbc.driver.OracleDriver ClassNotFoundException

    这是我收到错误的代码 我的classes12 jar已作为外部 jar 导入 import java io IOException import java io PrintWriter import java sql Connection
  • Spring portlet mvc:@Valid 似乎不起作用

    我创建了一个 bean 类并在我的控制器中使用它 但它似乎不起作用 也就是说 即使我输入了无效的年龄 result hasErrors仍然是假的 豆类 public class User Min 13 private int age pri
  • 当 javadoc 未附加到依赖项时,如何将 javadoc 引用到 Maven 的 eclipse 插件中的依赖项

    我在开发中使用 Eclipse Maven 和 Java 我使用 Maven 下载依赖项 jar 文件和 javadoc 如果可用 并使用 Maven 的 eclipse 插件为 Eclipse 生成 project 和 classpath
  • jsch - 发送特殊键(CTRL-C、CTRL-D 等)

    我需要向远程终端发送特殊密钥 如何使用 JSCH 做到这一点 Thanks Walter 尝试发送两个字节 0x03 0x04 Check ASCII 表 http www bbdsoft com ascii html了解更多
  • 如何在 logback 中启动时滚动日志文件

    我想配置 logback 来执行以下操作 记录到文件 当文件达到 50MB 时滚动文件 仅保留 7 天的日志 启动时始终生成一个新文件 滚动 除了最后一项 启动卷 外 我一切都正常 有谁知道如何实现这一目标 这是配置
  • 旧的和奇异的 JVM 上 java.io.BufferedInputStream 的默认缓冲区大小是多少?

    我一直在为一篇关于以下内容的博客文章进行一些研究java io BufferedInputStream和缓冲区 显然 多年来 默认值已从区区 512 字节增长到 8192 字节 冒昧地 Sun 的 Java 7 实现 甚至在JDK 1 1
  • 无法取消 GWT 中的重复计时器

    我正在尝试在 GWT 中安排一个重复计时器 它将每一毫秒运行一次 轮询某个事件 如果发现满意 则执行某些操作并取消计时器 我尝试这样做 final Timer t new Timer public void run if condition
  • 每次修改代码时都必须 mvn clean install

    我不是来自 Java 世界 但我必须为我的一个项目深入研究它 我不明白为什么每次修改或更新代码时 都必须 mvn clean install 来调试代码的最新版本 你知道为什么吗 尝试按Ctrl Shift F9 热插拔 有时会有所帮助
  • 仅当用户开始输入时清除 JavaFX TextField 中的提示文本

    默认行为是当字段获得焦点时 字段中的提示文本将被删除 那是标记在场上的时候 是否可以配置文本字段 以便仅在用户开始输入时删除提示文本 否则 我需要在每个文本字段旁边 上方添加一个标签 以描述其中的值 我知道它有点旧 但我自己也需要它 这仍然

随机推荐

  • UI自动化测试潮流代表工具—testsigma CI/CD

    Step1 创建测试计划 Step2 添加测试机器和测试套件 Step3 进入CI CD integrations Step4 复制测试计划API Step5 命令行执行测试计划API Step6 点击View Report Step7 验
  • unity暂停和继续按钮

    Unity暂停和继续菜单 目的 在一个游戏场景里设置暂停 并且在暂停后 可选择回到游戏 重新开始的功能效果 添加各种控件 新建一个空对象GameObject 将它命名为 ButtonPauseMenu 放在Canves下 用来放所有暂停功能
  • @Configuration和@Bean

    spring Boot提倡约定优于配置 如何将类的生命周期交给spring 1 第一种自己写的类 Controller Service 用 controller service即可 2 第二种 集成其它框架 比如集成shiro权限框架 集成
  • 堆排序(堆的构造及代码实现)

    简介 java系列技术分享 持续更新中 初衷 一起学习 一起进步 坚持不懈 如果文章内容有误与您的想法不一致 欢迎大家在评论区指正 希望这篇文章对你有所帮助 欢迎点赞 收藏 留言 更多文章请点击 文章目录 一 堆的简介 二 堆的实现 2 1
  • golang 接口和方法探讨

    一 方法简介 方法 Go语言里有两种类型的接收者 值接收者和指针接收者 使用值类型接收者定义的方法 在调用的时候 使用的其实是值接收者的一个副本 所以对该值的任何操作 不会影响原来的类型变量 如果我们使用一个指针作为接收者 那么就会其作用了
  • vue-element-admin基本使用

    vue element admin 是开发后台管理系统的一个比较完备的前端解决方案 本地运行体验 git clone https github com panjiachen vue element admin git 从github上拉取代
  • Axure 9.0.0.3699 授权码

    产品经理主力工具 Axure 在2020年5月26日更新了最新的 3699版本 具体更新如下 很多小伙伴在更新后会出现之前的授权无法使用的情况 如果出现这种情况大家可以通过在产品栈查找相对应的版本进行获取最新的授权码 获取地址 https
  • Vue项目中使用@代替src——并在VScode中开启@路径自动提示

    这篇文章是为了记录一下项目里面经常使用的一个配置 路径别名 我自己个取的名 一般的 路径别名 src components src components 以上的路径别名的好处就是 当项目文件较多的时候 可以避免 这样的一层一层的回溯路径 当
  • findbugs使用_程序员技能与成长:使用静态代码分析工具和代码审查

    使用静态代码分析工具 前面的小节介绍了一些编码规范及最佳实践 如果在编码阶段可以很好地遵循这些规范 并践行最佳实践的话 就可以大大提升代码的质量 提高可读性 降低维护成本等 在很多公司内部及开发团队中 为了保证大家都遵循这些规范 都会有静态
  • SD卡容量变小后怎么恢复

    我是因为给linux板子刷系统 所以导致SD卡内存从16G变成了40MB 恢复方法 1 win r 启动命令行 2 输入diskpart回车 运行DISKPART 3 list disk回车 列出电脑的硬盘清单 4 看看你的u盘是哪一个 选
  • 【数据结构 002】 算法复杂度

    1 算法定义 Algorithm Defintion 2 算法特性 Algorithm Feature 输入 有0个或者多个输入 输出 至少1个或者多个输出 有穷性 算法在执行有限的步骤之后 会自动结束而不会出现无限循环 并且每个步骤都在可
  • 阿里资深架构师三年整理出:Java面试核心知识点原理篇文档

    本文是对Java程序员面试必备知识点的总结 详细讲解了JVM原理 多线程 数据结构和算法 分布式缓存 设计模式等内容 希望读者能通过阅读本书对Java的基础原理有更深入 全面的理解 面试官通常会在短短两小时内对面试者的知识结构进行全面了解
  • win电脑C/D盘清理技巧

    dir AD 查看当前路径下的所有文件夹 1 下载 和安装 磁盘文件占用空间分析工具TreeSize Free 可以查看某个目录下的每个文件 文件夹占用的磁盘空间大小 大文件夹使用win自带 的右键属性查看大小会耗时很久 2 把自己安装在C
  • 【华为OD机试真题】不开心的小朋友- python

    题目描述 不开心的小朋友 输入一个数代表摇摇车的数量 在下一行输入一串数字 用空格隔开 每个数字代表不同的小朋友的编号 小朋友的编号不能重复 每个小朋友只有一个编号 小朋友排队坐摇摇车 如果小朋友离开之前没有摇摇车坐视为不开心的小朋友 同现
  • mysql更新区间的数_解决针对MySQL中对于某一个区间段范围的数据更新的情况

    1 在使用更新update的过程中 我们可能会想要更新比如id段在某一个指定范围内的数据 如果我们是想要更新前面多少行的数据的话可以直接 UPDATE tb name SET column name value ORDER BY id AS
  • 华为OD机试 - 滑动窗口最大和 - 滑动窗口(Java 2023 B卷 100分)

    目录 专栏导读 一 题目描述 二 输入描述 三 输出描述 四 解题思路 五 Java算法源码 六 效果展示 1 输入 2 输出 3 说明 华为OD机试 2023B卷题库疯狂收录中 刷题点这里 专栏导读 本专栏收录于 华为OD机试 JAVA
  • 配置多个TOMCAT

    1 把下载好的tomcat解压到想存放的目录 它不用安装的 在官网下载好 一解压就是了 2 打开电脑的 编辑环境变量 配置CATALINA HOME环境变量如图 我这里装了9和10 先配一个CATALINA HOME9 值是tomcat9的
  • Qt样式表-详解

    一 QT样式表简介 1 1 QT样式表简介 QSS的主要功能是使界面的表现与界面的元素分离 使得设计皮肤与界面控件分离的软件成为可能 QT样式表是允许用户定制widgets组件外观的强大机制 此外 子类化QStyle也可以定制widgets
  • Latex数学公式方程格式总结

    单行公式有自动标号 一般式子之间行距较大 begin equation T tilde nabla lim Delta v rightarrow 0 frac 1 Delta v left oint s T hat n mathrm d s
  • Java接口以及static和final关键字

    Java接口以及static和final关键字 一 static 二 final 三 让final元素可以初始化 不用固定赋值 四 接口 五 抽象方法 六 接口能够创建对象吗 匿名内部类 七 另一实例 开锁 一 static static代