Java初学者笔记-02、单例类枚举类抽象类接口

final关键字

可以修饰:类、方法、变量。

  1. 修饰类:不能被继承。
  2. 修饰方法:方法不能被子类重写。
  3. 修饰变量:有且仅能被赋值一次。

修饰变量分为:

  1. 修饰静态成员变量(static修饰)
public static final String NAME_ID = "666";

final修饰静态变量,被称为常量,通常这个值作为系统的配置信息。

  1. 修饰实例成员变量
private final String name = "666";

一般没有意义。

  1. 修饰局部变量。一般没有意义。

注意:final修饰引用类型的变量,变量存储的地址不能改,但指向的内容可以改。

单例类(设计模式)

什么是设计模式:一个问题的解法是最优的,这个最优解法被总结出来,称之为设计模式。
设计模式有23种。主要学什么:1)解决什么问题;2)设计模式怎么写。

单例类的作用

作用:确保某个类只能创建一个对象。(比如任务管理器只能开一个窗口,word可以开多个)

单例类的写法

  1. 饿汉式单例写法:(1)定义一个私有静态变量(即类变量,static修饰)new一个类对象。(2)类的构造器私有。(3)定义一个公开静态类方法getInstance()),返回对象。
//饿汉式单例:拿对象时,对象早就创建好了。
public class A{private static A a = new A();private A(){}public static A getInstance(){return a;}
}
  1. 懒汉式单例写法:(1)定义一个私有静态变量(即类变量,static修饰),不new。(2)类的构造器私有。(3)定义一个公开静态类方法getInstance()),new对象,并返回对象。
//懒汉式单例类:用对象时,才开始创建对象。
public class A{private static A a;private A(){}public static A getInstance(){if(a == null){a = new A();}return a;}
}

懒汉式的优缺点:第一次拿对象没有饿汉式的快,但如果只用A中的静态方法,就不需要创建对象,到用到对象时调用getInstance()才会创建。

枚举类

枚举类是一种特殊类。是一种多例设计模式。如果名称只有1个,就是单例类。

枚举类的写法

写法:第一行只能罗列枚举对象的名称,这些名称本质是常量

修饰符 enum 枚举类名{名称1,名称2,名称3 ...;其他成员;
}

枚举类的注意事项

  1. 枚举类都是最终类,不可以被继承。
  2. 枚举类第一行只能罗列枚举对象的名称,这些名称本质是常量(static final),并且每个常量都会记住枚举类的一个对象。
  3. 枚举类的构造器是私有的,因此枚举类对外不能创建对象。
  4. 编译器为枚举类新增了几个方法。
public enum A{X,Y,Z;
}A a1 = A.X;
a1.name();//X
a1.ordinal();//0
a1.values();//拿到所有的枚举对象

枚举类的经典应用场景

很适合做信息分类和标志。比如东南西北四个方向,用枚举类。
虽然常量也可以做信息分类和标志,但使用常量,参数值不受约束。

抽象类

abstract可以修饰类、成员方法。修饰类就是抽象类。

抽象类的特点

  1. 抽象类不一定有抽象方法,但抽象方法一定在抽象类中。
  2. 抽象类可以有成员变量,方法,构造器。
  3. 抽象类不能创建对象,仅作为特殊的父类,让子类继承并实现。
  4. 一个抽象类的子类必须实现父类的所有抽象方法,不然这个子类也要定义为抽象类。
  5. 抽象类的使命就是被继承。
  6. 抽象类不是必须的技术,它只是一个最佳实践
  7. 更好支持多态。当父类知道每个子类都要做某个行为,子类的这个行为又不一样,就定义抽象方法,子类分别实现。

抽象类的应用-模板方法设计模式

模板方法的作用

提供一个方法作为完成某类功能的模板。模板方法封装了每个实现步骤,但允许子类提供特定步骤的实现。提高代码复用,简化子类设计。

模板方法的写法

  1. 定义抽象类。定义final模板方法和抽象方法。
public abstract class People{private int age;public final void write(){"111".sout;writeMain();"333".sout;}public abstract void writeMain();
}
  1. 定义子类。重写抽象方法。
public class Student extends People{@overritepublic void writeMain{"Student1 is Writing".sout;}
}Student s = new Student();
s.write();

接口

关键字:interface

JDK8之前

在JDK8之前,接口只能定义:

  1. 常量(必须初始化,接口public static final可以省略)。
  2. 抽象方法(public abstract可以省略)。
    接口是被类实现(implements),实现类,一个类可以同时实现多个接口,必须重写所有接口的全部抽象方法,否则要定义为抽象类。

JDK8之后

JDK8之后新增的三种方法。
defaultprivatestatic修饰。

  1. default使用接口的实现类的对象来调用。
  2. private使用接口中其他实例方法调用。
  3. static只能使用当前接口名来调用。
    优点:在开发时,已经有很多实现类,如果突然要在接口中新增一个功能,JDK8需要在所有的实现类里重写这个新增抽象方法,JDK8之后直接定义带方法体的方法,工作量少。

接口的作用

  1. 弥补了单继承的不足,角色可以更多。
  2. 面向接口编程,更容易解耦合。

接口的注意事项

  1. 接口和接口可以多继承,一个接口可以同时继承多个接口。
  2. 一个接口继承多个接口,如果多个接口中存在方法签名冲突,则不支持多继承,也不支持多实现。

方法签名冲突,比如同样的返回值和方法名是可以合并的,但不同的返回值相同的方法名就会冲突。

  1. 父类和接口中有同名的方法,实现类会优先用父类的。
class Dog extends Animal implements A2{public void go{//想要用接口中的,只能用这样的方法中转show();//父类的super.show();//父类的A2.super.show();//接口的}
}
  1. 一个类实现的多个接口中有同名方法,可以不冲突,只要重写该方法即可。

抽象类和接口的区别

相同点

  1. 都是抽象形式,都可以有抽象方法,都不能创建对象。
  2. 都是派生子类形式,抽象类是被子类继承使用,接口是被实现类实现。
  3. 继承抽象类或者所有接口,都必须重写所有抽象方法,否则自己要成为抽象类。
  4. 都能支持多态,都能够实现解耦合。

不同点

  1. 抽象类中可以定义类的全部普通成员,接口只能定义常量和抽象方法。
  2. 抽象类只能被类单继承,接口可以被类多实现。
  3. 抽象类体现模板思想,更利于做父类,实现代码的复用性。接口更适合做功能的解耦合,更灵活(多个实现类作为多个方案一起实现解耦合)。这只是最佳实践,最佳实现,最优雅。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多光谱火焰识别摄像机

多光谱火焰识别摄像机是一种别摄像机具有以下几个显著优势:具有高度智能化技术的设备,能够. 更高的准确性:多光谱技术可以同时观测不同的火焰特征,从而准确、快速地检测火灾并定位火焰提高了火焰检测的准确性。不同物质燃烧时产生的光谱特征是不同的的位置和辐射强度。这种…

阿里二面和面试官争论Spring程序配置优先级

0 前言 一般用application.yml实现Spring Boot应用参数配置。但Spring配置有优先级,避免重复配置项的覆盖,须清晰优先级。 Spring通过Environment抽象出:Profile:规定场景。定义诸如dev、test、prod等环境 Property:PropertySources,各种配置源。一个环境中可能有多个配置…

yappi,Python性能分析库

yappi是为Python设计的线程感知型性能分析器,不仅支持CPU时间分析,还能够准确追踪线程级别的性能问题。 安装pip install yappi -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com基本用法import yappi import time import threadingdef func1()…

HTML4、HTML5 和 HTML6 之间的主要区别对比,以表格形式展示:

HTML4、HTML5 和 HTML6 之间的主要区别对比,以表格形式展示:特性 / 版本 HTML4 HTML5 HTML6 (预期)发布年份 1999 2014 尚未发布(预计未来发布)文档类型声明 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd…

Jenkins - 分布式构建

1 - 简介 Jenkins支持分布式多节点(Master-Slave)运行模式。将安装Jenkins的主机作为Master节点,然后通过界面配置(或远端启动服务)来添加Slave节点。在这种部署结构下,Master通常只充当管理者的角色,负责任务的调度,slave节点的管理,任务状态的收集等工作,具体的构建任…

Jenkins - 安装并启动Jenkins

1 - 关于Jenkins 构建流水线(build pipeline)工具Jenkins可以轻松地定义和管理各种各样的操作(构建、测试等),并将这些操作像管道pipe一样自由地进行组合,从而自动、流畅地执行一系列处理。将操作以项目project为单位整合并运行,操作简洁 消除手工操作,安全可靠 保留执…

Jenkins - 初识

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 通常企业都会将持续集成和持续交付的过程标准化一个单独的生态系统,将涉及的特定工具标…

10分钟搞懂大模型备案

大模型备案作为合规化运营的重要资质,办理难度大,申报周期长。为了方便大家快速弄懂大模型备案,我将大量涉及文件和繁杂的流程进行了精简和总结,力求让大家能快速理解重点。一、申报材料 大模型备案主要涉及语料安全评估、模型安全评估、安全措施评估三部分,主要申报材料如…

视频为什么会糊(二)?B站的码率变化

原文链接:https://tingxuanr.github.io/note/视频为什么会糊二b站的码率变化/ 摘要:流媒体平台(不只B站,所有流媒体都在干,画质最差的还得是优爱腾三家)为了节约成本,不断的降低自家视频的码率。很多所谓的4k、蓝光清晰度还不如六七年前的,纯粹是自欺欺人。上一篇对比 …

爬取二手房案例--parsel教学篇(CSS选择器)

本文通过一个爬取二手房的案例,来分享另外一种解析数据的方式:解析神器python第三方库parsel库。之所以叫他解析神奇,是因为它支持三种解析方式。 可以通过Xpath,CSS选择器和正则表达式来提取HTML或XML文档中的数据。@目录前言导航parsel的使用安装parsel创建Selector对象解…

duckX 读写word,替换word中内容的整理

一、库编译 1.下载地址:https://github.com/amiremohamadi/DuckX 2. 使用git 下载: git clone https://github.com/amiremohamadi/DuckX 3.编译 1.打开代码所在目录 2.创建生成目录build 3.依次点击 config generate 4. 打开项目,选择编译库的种类 生成库位置二、使用 C++读…

OpenAI 宕机思考丨Kubernetes 复杂度带来的服务发现系统的风险和应对措施

本文以社区主流服务发现系统 Nacos 为例,从可靠性、可伸缩性、高性能、可维护性等 4 个方面探讨如何提升 Kubernetes 中微服务应用的稳定性。作者:王建伟(正己) 12 月 11 日,OpenAI 旗下 AI 聊天机器人平台 ChatGPT、视频生成工具 Sora 及其面向开发人员的 API 自太平洋时…