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关键字 的相关文章

随机推荐

  • 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代