面向对象进阶(下)(JAVA笔记第二十二期)
p.s.这是萌新自己自学总结的笔记,如果想学习得更透彻的话还是请去看大佬的讲解
目录
- 抽象方法和抽象类
- 抽象方法定义格式
- 抽象类定义格式
- 抽象方法和抽象类注意事项
- 接口
- 接口的定义
- 接口中成员变量的特点
- 接口中没有构造方法
- 接口中成员方法的特点
- 在接口中定义具有方法体的方法
- 在接口中新增默认方法(解决接口升级的问题)
- 在接口中新增静态方法(不能被重写)
- 在接口中新增私有方法
- 接口与类之间的关系
- 类与类之间的关系
- 类与接口之间的关系
- 接口与接口之间的关系
- 接口的多态
- 设计模式
- 适配器设计模式
- 内部类
- 成员内部类
- 获取成员内部类的对象
- 成员内部类如何获取外部类的成员变量
- 特殊的成员内部类:静态内部类
- 创建静态内部类的对象
- 调用非静态方法的格式:先创建对象,用对象调用
- 调用静态方法的格式:外部类名.内部类名.方法名();
- 局部内部类
- 匿名内部类
- 使用场景
抽象方法和抽象类
抽象方法:如果一个方法抽取到父类中,不确定方法体,那就不要写方法体,再用abstract关键字修饰,那么这个方法就叫做抽象方法。
作用:父类有抽象方法,子类必须强制重写抽象方法,否则子类代码直接报错
而抽象方法所在的类就叫抽象类
抽象方法:将共性(同名)的行为(方法)抽取到父类之后,由于每一个子类执行的内容不一样,所以在父类当中无法确定具体的方法体,该方法即可定义为抽象方法
抽象类:如果一个类里面存在抽象方法,,那么该类则必须声明为抽象类
抽象方法定义格式
public abstract 返回值类型 方法名(参数列表);
抽象类定义格式
public abstract class 类名{}
抽象方法和抽象类注意事项
抽象类不能实例化(即不能创建对象)
抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
抽象类可以有构造方法
抽象类的子类要么重写抽象类中的所有抽象方法,要么是抽象类
举例
public abstract class Person {private String name;private int age;public abstract void work();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;}
}
//=============================================
class Student extends Person{@Overridepublic void work() {System.out.println("学生的工作就是学习");}//重写抽象类的所有抽象方法public Student() {}public Student(String name, int age) {super(name, age);}}
//=============================================
class Test{public static void main(String[] args) {Student student = new Student("张三",18);System.out.println(student.getName()+", "+student.getAge());}
}
接口
接口是一个抽象类型,是抽象方法的集合,一个类通过继承接口的方式,从而来继承接口的抽象方法。(可以看作是一种规则)
.
接口的子类也叫实现类,其要么实现重写接口当中所有的抽象方法,要么其为一个抽象类
.
接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。
.
除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。(具体原因参考抽象方法与抽象类)
.
接口无法被实例化,即不能创建接口的对象,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。
.
接口的定义
接口用interface来定义
格式
public interface 接口名{}
接口与类之间是实现关系,通过implements关键字表示
格式
public class 类名 implements 接口名{}
注意:一个类可以实现单个接口(单实现),也可以实现多个接口(多实现)
举例public class 类名 implements 接口名1,接口名2{}注意:实现类可以在继承一个类的同时实现多个接口
举例public class 类名 extends 父类 implements 接口名1,接口名2{}
接口中成员变量的特点
只能是常量
默认修饰符:public static final (即就算你不加,系统也会自动给你加上)
调用方式:接口名.常量名
接口中没有构造方法
接口中成员方法的特点
JDK8以后接口中可以定义抽象方法、有方法体的方法(默认方法、静态方法)、私有方法。
其中抽象方法也有默认修饰符:pubilc abstract
在接口中定义具有方法体的方法
在接口中新增默认方法(解决接口升级的问题)
由于只要添加接口中的抽象方法时,其对应的实现类也要添加对应的抽象方法,否则实现类就会报错
所以JDK8以后允许在接口中定义默认方法,需要用关键字default修饰
定义格式为public default 返回值类型 方法名(参数列表){ }注意:默认方法不是抽象方法,所以不强制重写。但是如果被重写,重写的时候要去掉default关键字
public可省略,但default关键字不可以省略
如果实现了多个接口,多个接口中存在同名的默认方法,则子类就必须对该方法进行重写(因为系统不知道你以后调用的是哪个接口中的默认方法,干脆让你重写得了)
在接口中新增静态方法(不能被重写)
JDK8以后允许在接口中定义静态方法,需要用关键字static修饰
定义格式为public static 返回值类型 方法名(参数列表){ }注意:静态方法只能通过接口名调用,不能通过实现类名或对象名调用
public可省略,但static关键字不可以省略
接口和实现类中有两个重名的静态方法,这不叫重写,只是恰好同名而已
在接口中新增私有方法
由于在接口中有一些方法的代码重复了,但我又不想让这些代码被别的接口、类使用,于是我们便可以将这些代码写在一个方法里并将其私有化,使其只能在本接口中使用。
JDK9以后允许在接口中定义私有方法,需要用关键字private修饰,且不能加用default修饰
.
给默认方法调用的叫普通私有方法private 返回值类型 方法名(参数列表){ }给静态方法调用的叫静态私有方法
private static 返回值类型 方法名(参数列表){ }.
接口与类之间的关系
类与类之间的关系
继承关系。只能单继承,不能多继承,但是可以多层继承
类与接口之间的关系
实现关系。可以单实现,也能多实现,还可以再继承一个类的时候同时实现多个接口
如果实现类实现了多个接口。那么就要把所有接口的所有抽象方法进行重写
如果有多个重名的抽象方法,这个抽象方法只需要重写一次就可以了
接口与接口之间的关系
继承关系。能单继承,也能多继承
如果实现类实现的是底层的子接口,那么实现类要把该接口以及其所有父类接口里面的抽象方法重写
接口的多态
当一个方法的参数是接口时,可以传递接口所有实现类的对象,这种方式称为接口多态
定义格式:接口类型 变量 = new 实现类对象();
其遵守编译看左边、运行看右边的原则
设计模式
设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结(说白了就是一套公式)
使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码的可用性、程序的重用性
适配器设计模式
解决接口和实现类之间的矛盾问题:接口中有n个抽象方法,但实现类只想使用其中一个。如果重写所有抽象方法会提高后期代码的维护难度
适配器设计模式解决方案:定义一个中间类(即适配器)(xxxAdapter)(一般是抽象类,目的是为了让外界无法创建它的对象)实现接口并且对接口中的抽象方法进行空实现(即重写接口中的抽象方法但不写方法体)
这时再让原本的实现类不再实现接口,而是继承中间类。这样需要使用哪个方法,就重写那个方法就行了
内部类
内部类就是在一个类里面再定义一个类
我们可以在外部其他类中创建内部类的对象并调用内部类的方法
意义:假如创建一个汽车的JavaBean类型,属性有发动机的年龄、最大功率、汽车颜色、汽车品牌。
这时我们便可以将发动机的属性定义在一个内部类里面,从而提高了代码的可读性
内部类一般来说遵循以下规则:
内部类中的事物是外部类中的一部分;内部类单独出现没有任何意义(比如汽车的发动机、人的大脑)
内部类的访问特点:
内部类可以直接访问外部类的成员,包括私有;外部类要访问内部类的成员,必须创建对象
内部类分为四种:成员内部类、静态内部类、局部内部类、匿名内部类
成员内部类
写在成员位置(类中方法外)的,属于外部类的成员之一(比如汽车的发动机)
成员内部类可以被一些修饰符所修饰,比如private、默认、protected、public等
用private修饰则外部其他类不能直接创建内部类的对象,只能在外部类里面创建内部类的对象
默认的话则内部类只能在本包当中使用,在其他包里面不起作用
用protected修饰则在其他包的子类中也可以使用
用public修饰则所有的地方都可以创建成员内部类的对象
.
JDK16以后,在成员内部类里面可以定义静态变量
获取成员内部类的对象
方法一:在外部类中编写方法,对外提供内部类的对象(成员内部类被private修饰的时候)
举例:public Inner getInstance(){return new Inner();}方法二:直接创建格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象
举例:Outer.Inner inner = new Outer().new Inner();
成员内部类如何获取外部类的成员变量
若没有重名,就直接调用
若重名,则外部类名.this.变量名
举例
public class Outer {private int a = 10;class Inner{private int a = 20;public void show(){int a = 30;System.out.println(Outer.this.a);//a==10System.out.println(this.a);//a==20System.out.println(a);//a==30}}
}
内存原理分析
特殊的成员内部类:静态内部类
如果成员内部类前面用static修饰,则这个成员内部类就叫做静态内部类
静态内部类只能访问外部类中的静态变量和静态方法,如果想要访问非静态的需要创建对象,再用外部类的对象进行调用
静态内部类的实例不依赖于外部类的实例。
创建静态内部类的对象
创建格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象
举例:Outer.Inner inner = new Outer.Inner();
只要是静态的东西,都可以用类名.来获取
调用非静态方法的格式:先创建对象,用对象调用
调用静态方法的格式:外部类名.内部类名.方法名();
局部内部类
将内部类定义在方法里面就叫做局部内部类,类似于方法里面的局部变量
外界无法直接使用,需要在方法内创建对象并使用
该类可以直接访问外部类的成员,也可以访问方法内的局部变量
举例
public class Outer1 {int a = 10;public void show(){int b = 20;class Inner{//局部内部类String name;int age;public void method(){System.out.println("访问外部类的成员"+a);System.out.println("访问局部变量"+b);System.out.println("局部内部类的方法");}public static void method1(){System.out.println("局部内部类的静态方法");}}//在局部方法中创建内部类的对象Inner inner = new Inner();System.out.println(inner.age);System.out.println(inner.name);inner.method();Inner.method1();}
}
//=========================================================
class Test1{public static void main(String[] args) {Outer1 outer1 = new Outer1();outer1.show();}
}
匿名内部类
匿名内部类,即隐藏了名字的内部类。可以写在成员位置,也可以写在局部位置
格式
new 类名或接口名(){重写方法;
};
上面的整体格式为创建一个匿名内部类对象的格式
其中包含了三部分:继承/实现、方法重写、创建对象
理解匿名内部类的定义格式
使用场景
当方法的参数是接或者类的时候
以接口为例,可以传递这个接口的实现类对象
如果实现类中使用一次的话,就可以使用匿名内部类简化代码
举例
public class Test2 {public static void main(String[] args) {method( new Animal(){@Overridepublic void eat() {System.out.println("狗吃骨头");}});//创建一个匿名内部类对象并作为参数}public static void method(Animal animal){animal.eat();}}abstract class Animal{public abstract void eat();
}相关文章:
面向对象进阶(下)(JAVA笔记第二十二期)
p.s.这是萌新自己自学总结的笔记,如果想学习得更透彻的话还是请去看大佬的讲解 目录 抽象方法和抽象类抽象方法定义格式抽象类定义格式抽象方法和抽象类注意事项 接口接口的定义接口中成员变量的特点接口中没有构造方法接口中成员方法的特点在接口中定义具有方法体…...
通信协议——UART
目录 基础概念串行&并行串行的优缺点 单工&双工 UART基本概念时序图思考:接收方如何确定01和0011 基础概念 串行&并行 串行为8车道,并行为1车道 串行的优缺点 通行速度快浪费资源布线复杂线与线之间存在干扰 单工&双工 单工…...
最优阵列处理技术(七)-谱加权
阵列的加权技术等价于时间序列谱分析中的加窗或锐化技术。在加权过程中,需要考虑的是如何降低旁瓣并使主波束宽度的增长最小。 首先需要明确的是,在 u u u空间下的波束方向图为 B u ( u ) =...
Java | Leetcode Java题解之第486题预测赢家
题目: 题解: class Solution {public boolean PredictTheWinner(int[] nums) {int length nums.length;int[] dp new int[length];for (int i 0; i < length; i) {dp[i] nums[i];}for (int i length - 2; i > 0; i--) {for (int j i 1; j …...
leetcode动态规划(十五)-完全背包
题目 leetcode上没有纯完全背包题目,可以看卡码网上的题目 完全背包 思路 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次)ÿ…...
AI视听新体验!浙大阿里提出视频到音乐生成模型MuVi:可解决语义对齐和节奏同步问题
MuVi旨在解决视频到音乐生成(V2M)中的语义对齐和节奏同步问题。 MuVi通过专门设计的视觉适配器分析视频内容,以提取上下文 和时间相关的特征,这些特征用于生成与视频的情感、主题及其节奏和节拍相匹配的音乐。MuVi在音频质量和时间同步方面表现优于现有基线方法,并展示了其在风…...
对比两个el-table,差异数据突显标记
前言 在数据分析和数据处理的过程中,经常需要对比两个数据集,以便发现其中的差异和变化。本文将介绍如何使用 el-table 组件来对比两个数据集,并通过差异数据的突显标记,帮助用户更直观地理解数据的变化。 cell-style 属性 其实利…...
调研funasr时间戳返回时间坐标效果可用性
# 背景 : 分析funasr识别结果中每个中文字的时间戳偏差情况 1.评价指标: ①偏差公式: A=标注字的时间戳(帧长区间) B=识别字的时间戳(帧长区间) 偏差=(AB的区间并集-AB的区间交际) 偏差百分比=(AB的区间并集-AB的区间交际)/(A的帧长) def calculate_bias(la…...
Tomcat默认配置整理
Connector: 处理请求的具体配置 Tomcat的连接等待队列长度,默认是100 Tomcat的最大连接数,默认是8192 Tomcat的最小工作线程数,默认是10 Tomcat的最大线程数,默认是200 Tomcat的连接超时时间,默认是20s Server port…...
深入理解Rust中的指针:裸指针 智能指针
Rust是一种注重安全性的系统编程语言,它通过所有权、借用和生命周期等机制来保证内存安全。在Rust中,指针的使用是小心翼翼的,因为指针操作是导致内存错误的主要原因之一。然而,指针在处理底层数据和性能优化时又是必不可少的。本…...
物联网实训项目:绿色家居套件
1、基本介绍 绿色家居通过物联网技术将家中的各种设备连接到一起,提供家电控制、照明控制、电话远程控制、室内外遥控、防盗报警、环境监测、暖通控制、红外转发以及可编程定时控制等多种功能和手段。绿色家居提供全方位的信息交互功能,甚至为各种能源费…...
缓存雪崩是什么
背景 Redis的缓存雪崩是指在某一时间段内,大量缓存数据同时失效,导致大量请求直接打到数据库上,造成数据库压力激增,甚至可能导致数据库宕机。这种情况类似于雪崩效应,突然的大量请求涌入数据库,系统无法承…...
【格物刊】龙信刊物已上新
文章关键词:电子数据取证、电子物证、手机取证、介质取证 深藏注册表的秘密:一次揭开金融阴谋的成功取证 一场看似无懈可击的金融操作,背后是否隐藏着阴谋?执法部门接到举报,指控几名金融机构的高层管理人员涉嫌利用…...
DNA存储介绍
1. DNA存储的基本原理 DNA存储技术基于DNA分子的双螺旋结构,利用其四种碱基(A、T、C、G)来编码信息。每个碱基可以代表一个二进制位(bit),其中A和C可以代表0,G和T可以代表1,或者使用…...
如何修改MAC地址破解网络无线网络限制-担心别人蹭网,路由器设置MAC地址过滤,限定了能访问无线网络的网卡地址-供大家学习参考
路由器都设置了MAC地址过滤,也就是限定了能访问无线网络的网卡的MAC地址。因为无线路由器不一定由自己控制,所以当更换了笔记本或者更换了无线网卡的时候,也许就上不了网了。我们可以修改网卡的MAC地址实现上网。 下载:https://do…...
C端产品经理与B端产品经理的区别
一:需求量级不一样 C端是面向消费者,吃的是人口红利,可能与社会大环境关系比较大,C端一般中大厂的需求多 B端是面向公司,吃的是产业红利,B端产品经理无论什么规模的公司都需要。 二:B端产品更…...
书生营 L0G4000 玩转HF/魔搭/魔乐社区
模型下载 在codespace上给环境装包,按照教材即可 运行后下载成功 建立下载json文件 新建下载internlm2_5-chat-1_8b的json文件 运行结果 基本上没啥问题,照着教程来就行 模型上传(可选) push的时候需要先认证token 最后的…...
轻松检测麦克风功能:使用Python的sounddevice和soundfile库
轻松检测麦克风功能:使用Python的sounddevice和soundfile库 在进行音频处理或开发需要使用麦克风的应用程序时,确保麦克风功能正常是非常重要的。本文将介绍一个简单的Python脚本,它能够帮助我们检测本地麦克风的功能,确保我们的设…...
k8s 部署步骤整理(containerd)
版本:v1.31 容器运行时:containerd 网络插件:flannel 系统:Ubuntu22.04 安装部署步骤 安装containerd sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl …...
Swagge详解,SpringBoot项目集成Swagger
介绍 相信无论是前端还是后端开发,都或多或少地被接口文档折磨过。前端经常抱怨后端给的接口文档与实际情况不一致。后端又觉得编写及维护接口文档会耗费不少精力,经常来不及更新。其实无论是前端调用后端,还是后端调用后端,都期望…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...
Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...
