面向对象进阶(下)(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
介绍 相信无论是前端还是后端开发,都或多或少地被接口文档折磨过。前端经常抱怨后端给的接口文档与实际情况不一致。后端又觉得编写及维护接口文档会耗费不少精力,经常来不及更新。其实无论是前端调用后端,还是后端调用后端,都期望…...
docker搭建etcd集群环境方式
docker搭建etcd集群环境方式 from: etcd 虚拟机与docker搭建etcd集群环境方式_docker部署etcd集群-CSDN博客 windows系统下 1: “\”要换成:“^” 2: 不能在windows powershell下执行...
重装ubuntu系统后配置
零、我的电脑硬件 1、购买型号 2021年12月25日在京东下单 7196元 联想拯救者15.6英寸 R7000P 2021游戏本 2、运行内存 内存 16 3、显卡型号 GPU nvidia RTX 3050Ti 4GB 一、安装终端 虽然自带的有,但是更方便 sudo apt install terminator 二、两个系统…...
Java基于数据库的分布式可重入锁(带等待时间和过期时间)
文章目录 技术背景介绍代码实现数据库表结构尝试获取锁续约阻塞式获取锁解锁检查锁是否过期或者释放 使用示例优化方案 项目代码 技术背景介绍 一般分布式锁使用最方便的就是使用redis实现,因为他自带超时过期机制、发布订阅模式、高吞吐高性能的优势,…...
国家信息安全水平考试(NISP一级)最新题库-第十七章
目录 另外免费为大家准备了刷题小程序和docx文档,有需要的可以私信获取 1 受到了ARP欺骗的计算机,发出的数据包, 地址是错误的() A.源IP;B.目的IP;C.源MAC;D.目的MAC 正…...
Java 8 新特性概览
Java 8 是 Java 语言发展史上的一个重要里程碑,它引入了许多革命性的特性,极大地提高了开发效率和程序性能。以下是 Java 8 的一些关键新特性: 1. Lambda 表达式 Lambda 表达式是 Java 8 中最引人注目的特性之一。它允许你以简洁的语法编写…...
pyspark==堆叠
安装环境 docker pull jupyter/all-spark-notebook 方式一 from pyspark.sql import SparkSession from pyspark.sql.functions import expr, col# 创建SparkSession spark SparkSession.builder.appName("StudentScores").getOrCreate()# 创建示例数据 data [(…...
Zypher Network Layer3 主网上线,不容错过的“宝藏方舟”活动
前言 随着 Zytron Layer3 主网的上线,Zypher Network 联合 Linea 共同推出了“宝藏方舟”活动,用户可通过参与活动,获得包括代币、积分、SBT 等系列奖励。 Zypher Network 是一个以 ZK 方案为核心的游戏底层堆栈,其提供了一个具备…...
【小白学机器学习21】 理解假设检验的关键:反证法
目录 理解假设检验的关键:反证法 1 假设的检验的出发点:H1假设, 1.1 为什么我们不去直接证明H1是否正确? 2 故意设立一个假设H1的否命题为H0 3 设定显著度α 4 总结假设检验的整个思路就是反证法 5 两类错误的关系 理解假…...
鸿蒙中富文本编辑与展示
富文本在鸿蒙系统如何展示和编辑的?在文章开头我们提出这个疑问,带着疑问来阅读这篇文章。 富文本用途可以展示图文混排的内容,在日常App 中非常常见,比如微博的发布与展示,朋友圈的发布与展示,都在使用富文…...
Python Q-learning 算法详解与应用案例
目录 Python Q-learning 算法详解与应用案例引言一、Q-learning 的基本原理1.1 强化学习基础1.2 Q值及其更新1.3 Q-learning 的特性 二、Python 中 Q-learning 的面向对象实现2.1 QTable 类的实现2.2 Environment 类的实现2.3 Agent 类的实现 三、案例分析3.1 简单环境中的 Q-l…...
了解网站建设的基本流程/网站建设优化
利用生成的批数据对inception_v3模型进行微调,然后进行训练! 1)利用slim.assign_from_checkpoint_fn函数进行恢复 #-*-codingutf-8-*- import tensorflow as tf import tensorflow.contrib.slim as slim import tensorflow.contrib.slim.ne…...
简单aspx网站开发/百度官方客服
级别:★★☆☆☆ 标签:「iOS 本地化」「Storyboard」「Xib」「图片」「应用显示名称」 作者: WYW 审校: QiShare团队 最近项目需要做 “本地化”,“本地化” 是让app支持多种语言的过程。附:官方文档 我将从…...
wordpress单独页面/东莞营销网站建设直播
前言 继续ctf的旅程 攻防世界Misc高手进阶区的3分题 本篇是3-11的writeup 发现攻防世界的题目分数是动态的 就仅以做题时的分数为准了 解题过程 下下来一个png图片 扔进stegsolve 发现PK开头 zip文件 save bin 改后缀 解压 弹出已损坏 用winrar自带的修复 成功修复 得到一…...
关于网页设计的教育网站设计/郑州seo公司排名
作者 | 飞利信产品研发中心地址 | 北京市海淀区塔院志新村2号飞利信大厦21世纪是信息产业及科技飞速发展的世纪,随着移动互联网的发展,用户对会议产品体验要求越来越高,用户早已不满足于仅仅能看到实时的视频图像了,对高清晰、高质…...
wordpress好看的中文主题/营销网站类型
一、分析目的 通过分析2B产品中的团队协作管理软件的对比分析,用于为公司团队协作软件的选型做产考。 二、竞品归属市场概况 2.1.目标用户群及需求 主要面向企业用户,用于解决企业不同地域以及不同职能部门之间的团队协作难点。 2.2.市场规模 中国大概有…...
seo和sem是干什么的/seo有哪些作用
目前在用的是2020.1,想升级一下最新的2021.2。官网上下载的最新的,安装。安装完成后,首次启动,发现自动的在下载2020.1在用的插件。恩,很智能嘛。插件下载完后,没动静了。双击图面图标,依然没有…...