第八天(坚持)

抽象类

1.什么是抽象类,作用特点。

抽象类是面向对象编程中一种特殊的类,它不能被实例化,主要用于作为其他类的基类(父类)。抽象类的主要作用是定义公共结构和行为规范,同时强制子类实现特定的功能,常用于将部分代码抽象到抽象类中。比较典型的就是模板方法模式。

抽象类中可以补定义抽象方法,但抽象方法一定在抽象类中。

注解(抽象类的特点)

1)由abstract修饰的方法为抽象方法,抽象方法没有方法体,需要使用分号结尾

2)若类中包含抽象方法,那么该类必须使用关键字abstract声明成抽象类,final不能修饰抽象类

3)抽象类里,可以没有抽象方法

4)抽象类里可以提供构造器,但是不能实例化,没有意义。

5)一个类继承了抽象类,那么必须重写里面的所有抽象方法,除非该子类也声明为抽象类。

接口

接口中不考虑Java8中default方法情况下,只能定义抽象类。接口主要用于制定规范,一般在实际开发中,我们会先把接口暴露给外部,然后在业务代码中实现接口。

接口特点

  • 使用interface定义

  • 可以提供成员变量,默认提供public static final进行修饰

  • 可以提供成员方法,默认使用public abtract进行修饰

  • 接口中不能存在构造器,接口不能实例化,

  • 与继承不同,一个类可以实现多个接口。接口间使用逗号分开。

  • 使用关键字implements进行实现,必须实现接口中的所有抽象方法

  • 若一个类中没有全部实现接口中的抽象方法,那么该类需要使用abstract声明成抽象类

  • 接口之间可以存在继承关系,即一个接口通过关键字extends可以继承另一个(或多个)接口。

  • 子接口继承了父接口中的所有抽象方法

---------------------------------------------------------------------------------------------------------------------------------

接口和抽象类的区别

1.方法定义:接口和抽象类,最明显的区别就是接口只是定义了一些方法而已,在不考虑Java8中default方法情况下,接口中只有抽象方法,是没有实现的代码的。(Java8中可以有默认方法)
2.修饰符:抽象类中的修饰符可以有public、protected和private和<default>这些修饰符,而接口中默认修饰符是public。不可以使用其它修饰符。(接口中,如果定义了成员变量,还必须要初始化)

3.构造器:抽象类可以有构造器必须私有。接口不能有构造器。

4.接口可以被实现,抽象类可以被继承。一个类可以实现多个接口,一个接口可以继承多个其他接口但,一个抽象类只能继承一个抽象类。

5.职责不同:接口和抽象类的职责不一样。接口主要用于制定规范,一般在实际开发中,我们会先把接口暴露给外部,然后在业务代码中实现接口。抽象类的主要作用是定义公共结构和行为规范,同时强制子类实现特定的功能,常用于将部分代码抽象到抽象类中。比较典型的就是模板方法模式。

---------------------------------------------------------------------------------------------------------------------------------

枚举

在Java中,枚举是一种特殊的引用数据类型,是一个被命名的整型常数的集合,用于声明一组带标识符的常数,枚举在日常生活中很常见,例如表示星期的SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY就是一个枚举。

枚举特点

  • 使用enum关键字定义一个枚举,默认会继承java.lang.Enum类,而且是一个final类,因此不能再继承其他类

  • 必须在枚举类的第一行声明枚举类对象。有多个枚举对象时,使用逗号隔开,最后一个用分号结尾

  • 可以提供构造器,必须是私有的,如果构造器有形参,定义对象时必须显式调用构造器

  • 如果使用无参构造器创建枚举对象,则定义对象时,小括号可以省略

  • 可以提供私有的属性(建议,如不外部可以修该)

public enum Year{//1. 枚举的第一行,必须是该枚举的对象,即你要表达的离散值。多个离散值使用逗号隔开,最后一个值分号结束。JANUARY(1),FEBRUARY(2),MARCH(3),APRIL(4),MAY(5),JUNE(6),JULY(7),AUGUST(8),SEPTEMBER(9),OCTOBER(10),NOVEMBER(11),DECEMBER(12),AAAA; // 如果调用无参构造器,小括号可以省略//2. 枚举可以提供私有属性private int number;//3. 可以提供构造器,但是必须是私有的,  实际上枚举的离散值就是调用构造器产生的,//   调用构造器的格式:   离散值(有参传参)private Year(int number){this.number = number;}//4. 构造器可以重载private Year(){}// 5. 可以给私有的成员变量,提供get/set方法, 不建议提供set方法public int getNumber(){return number;}
​
​
}

带有value的枚举

package com.rs.shuatiwang.model.enums;
​
import cn.hutool.core.util.ObjectUtil;
​
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
​
public enum AppTypeEnum {
​SCORE("得分类", 0),TEST("测评类", 1);
​private final String text;
​private final int value;
​AppTypeEnum(String text, int value) {this.text = text;this.value = value;}
​/*** 根据 value 获取枚举** @param value* @return*/public static AppTypeEnum getEnumByValue(Integer value) {if (ObjectUtil.isEmpty(value)) {return null;}for (AppTypeEnum anEnum : AppTypeEnum.values()) {if (anEnum.value == value) {return anEnum;}}return null;}
​/*** 获取值列表** @return*/public static List<Integer> getValues() {return Arrays.stream(values()).map(item -> item.value).collect(Collectors.toList());}
​public int getValue() {return value;}
​public String getText() {return text;}
}

内部类

定义在一个类内部的类,就是内部类。内部类可以分为:成员内部类、静态内部类、局部内部类、匿名内部类。

成员内部类(了解)

定义在一个类的内部,与这个类的成员(属性、方法)平级,并且没有用static修饰的类。

1、访问权限可以是任意的权限,类似于一个类中的成员。

2、实例化的过程,需要先实例化外部类对象,再使用外部类对象进行内部类的实例化

3、内部类编译后,也会生成.class字节码文件。格式:外部类$内部类.class

/*** 成员内部类*/
public class Program {public static void main(String[] args) {// 1. 实例化一个外部类的对象Outer outer = new Outer();outer.name = "outer";// 2. 通过外部类的对象,实例化内部类对象Outer.Inner inner = outer.new Inner();inner.name = "inner";inner.show("hello");}
}
​
/*** 外部类*/
class Outer {public String name;public int age1;// 这个类,由于是书写在一个类的内部,因此这个类被称为--内部类// 这个类,由于是写在Outer类中,和类中的属性、方法平级,可以称为是一个类的成员。// 并且,这个类没有使用 static 修饰,这样的类,被称为 -- 成员内部类class Inner {Inner() {System.out.println("实例化了一个Inner的对象");}public String name;public int age2;
​public void show(int age3) {System.out.println("参数age3: " + age3);System.out.println("内部类属性age2: " + age2);System.out.println("外部类属性age1: " + age1);}
​public void show(String name) {System.out.println("参数name: " + name);System.out.println("内部类属性name: " + this.name);System.out.println("外部类属性name: " + Outer.this.name);}}
}

静态内部类(了解)

定义在一个类的内部,与这个类的成员(属性、方法)平级,并且使用static修饰的类。

1、访问权限可以是任意的权限,类似于一个类中的成员。

2、实例化的过程中,直接使用 new实例化一个外部类 .内部类对象即可。

3、内部类编译后,也会生成.class字节码文件。格式:外部类$内部类 .class

/*** 静态内部类*/
public class Program {public static void main(String[] args) {// 1. 实例化静态内部类对象的时候,不需要借助外部类对象的。// Outer.Inner inner = new Outer.Inner();// 2. 如果已经事先导包了,还可以直接进行实例化Inner inner = new Inner();
​}
}
​
class Outer {public String name;// 因为这个类,书写与Outer类内,并且是用static修饰的类// 这样的类,被称为 -- 静态内部类static class Inner {Inner() {System.out.println("实例化了一个Inner对象");}
​public String name;
​public void show(String name) {System.out.println("参数name: " + name);System.out.println("内部类属性name: " + this.name);System.out.println("外部类属性name,此时无法访问" Outer.this.name);}}
}

局部内部类(了解)

定义在某一个代码段中的中。

1、没有访问权限修饰符。

2、在当前方法中,直接实例化即可

3、内部类编译后,也会生成.class字节码文件。格式:外部类$序号内部类 .class

public class Program {public static void main(String[] args) {int a;// 写在某一个局部代码段中(例如:方法中)// 这个类,只能在当前的方法中使用class Inner {
​}Inner inner = new Inner();test();}
​static void test() {class Inner {
​}}
}

4.4 匿名内部类(重点)以及数组自定义排序Comparable接口

匿名内部类是Java中一种特殊的内部类,它没有显式的类名,通常用于简化代码实现一次性使用的类

public class Teacher implements Comparable<Teacher> {private int age;public Teacher(int age) {this.age = age;}
public int getAge() {return age;
}
​
@Override
public String toString() {return "Teacher{" +"age=" + age +'}';
}
​
@Override
public int compareTo(Teacher o) {return this.age - o.age;
}
}

import java.util.Arrays;
import java.util.Comparator;
​
public class TeacherTest {public static void main(String[] args) {//定义一个Teacher类型的数组,存储4个Teacher对象Teacher[] ts = new Teacher[4];for (int i = 0; i < ts.length; i++) {ts[i] = new Teacher((int)(Math.random()*10)+30);}//排序:调用数组工具类的排序方法Arrays.sort(ts);System.out.println(Arrays.toString(ts));
​//想要在不改变Teacher源码的情况下,降序/** 匿名内部类:* 1.  写在方法中。* 2.  因为只在该处使用一次,因此没有必要定义出来该类的类结构。* 3.  匿名内部类一般都是向上造型这种多态写法,父类一般都是抽象类或者是接口。* 4.  语法结构:*      父类型名  变量名 = new 父类型名(){*         //要重写的方法*      };*/Comparator c = new Comparator<Teacher>(){public int compare(Teacher o1, Teacher o2) {return o2.getAge()-o1.getAge();}};Arrays.sort(ts, c);System.out.println(Arrays.toString(ts));}
​
}

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

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

相关文章

在Ubuntu上使用QEMU仿真运行ARM汇编

ARM汇编一般无法在PC上直接运行&#xff0c;因为ARM和x86架构是不一样的。但是很多时候用ARM开发板是很不方便的&#xff0c;所以能不能直接在PC上仿真运行ARM汇编来练习呢&#xff1f;当然可以&#xff0c;那就是&#xff1a;使用QEMU来仿真。这篇文章我们就来演示下如何在Ubu…

【趣味解读】淘宝登录的前后端交互机制:Cookie-Session 如何保障你的账户安全?

在现代Web应用中&#xff0c;前后端交互是核心功能之一&#xff0c;而用户认证又是其中最关键的部分。本文将以淘宝登录为例&#xff0c;详细解析基于Cookie-Session的前后端交互流程&#xff0c;帮助开发者理解这一常见的安全认证机制。生动理解一下什么是cookie和seesion我们…

贪心算法(基础算法)

1.引言 ok啊&#xff0c;拖更这么长时间也是没有压力&#xff08;doge&#xff09; 不说啥&#xff0c;直接进入正题。 2.概念 这个贪心算法呢&#xff0c;看名字就知道&#xff0c;不就是每个步骤都挑最好的嘛&#xff0c;有啥难的。 这么说的话......其实确实&#xff0c…

简单的mcp 服务示例

参考&#xff1a;https://www.bilibili.com/video/BV1nyVDzaE1x 编写自己的tools.py #### tools.py from pathlib import Path import osbase_dir Path("./test")def read_file(name: str) -> str:"""Return file content. If not exist, return …

DeepSeek-R1+豆包迭代一次完成中国象棋游戏

DeepSeeek- R1生成的棋盘符合中国象棋风&#xff0c;单独豆包无法画好象棋棋盘。提示词&#xff1a;使用html实现中国象棋游戏&#xff0c;要求支持人机对弈。等等&#xff0c;你需要实现完整版本。代码如下&#xff08;电脑走棋不对&#xff09;&#xff1a;<!DOCTYPE html…

阿里通义千问Qwen3深夜升级:架构革新+性能碾压

&#xff08;以下借助 DeepSeek-R1 & Grok3 辅助整理&#xff09; 北京时间2025年7月22日凌晨&#xff0c;阿里云通义千问团队发布了Qwen3旗舰模型的最新更新——Qwen3-235B-A22B-Instruct-2507-FP8。这一更新不仅在性能上实现了突破&#xff0c;还标志着开源大模型技术架…

pip关于缓存的用法

pip cache info查看 pip 缓存的大小&#xff0c;运行示例 Package index page cache location (pip v23.3): c:\users\xxx\appdata\local\pip\cache\http-v2 Package index page cache location (older pips): c:\users\xxx\appdata\local\pip\cache\http Package index page c…

嵌入式学习-(李宏毅)机器学习(2)-day29

十五个作业不同类型的Functions两大类任务一个是Regression&#xff08;回归&#xff09; 一个是 Classification&#xff08;分类&#xff09;一个是给出一个数值&#xff0c;一个是从类别中选择一个还有一类任务 Structured Learning 机器要学会创造文件 机器学习预测频道第…

【C++11】哈希表与无序容器:从概念到应用

文章目录一、前言二、哈希表&#xff08;Hash Table&#xff09;1. 基本概念2. 哈希函数3. 冲突解决方法链地址法&#xff08;Separate Chaining&#xff09;开放寻址法&#xff08;Open Addressing&#xff09;4. 性能分析5. 动态扩容6. 应用场景7. 优缺点二. 无序容器的介绍1…

【智能大数据分析 | 实验二】Spark实验:部署Spark集群

【作者主页】Francek Chen 【专栏介绍】⌈⌈⌈智能大数据分析⌋⌋⌋ 智能大数据分析是指利用先进的技术和算法对大规模数据进行深入分析和挖掘&#xff0c;以提取有价值的信息和洞察。它结合了大数据技术、人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&#xf…

使用pymongo进行MongoDB的回收

在 PyMongo 中使用 compact 命令进行 MongoDB 碎片回收的完整操作指南如下&#xff1a; 一、核心执行方法 from pymongo import MongoClient import time# 1. 连接到 MongoDB 实例 client MongoClient("mongodb://username:passwordhost:27017/dbname?authSourceadmin&q…

Azure DevOps 使用服务主体配置自托管代理 (Self-hosted Agent) 配置指南

Azure DevOps 使用服务主体配置自托管代理配置指南1. 概述2. 在 Azure AD 中创建服务主体 (SP)3. 授予 Azure DevOps 权限3.1. 组织层级&#xff1a;用户身份与访问级别3.2. 组织层级&#xff1a;Agent pools管理员3.3. 在 Linux VM 上安装和配置代理3.4. 启动并设置为系统服务…

Java学习第六十四部分——Nginx

目录 一、前言提要 二、核心特点 三、核心作用 四、架构优势 五、应用场景 六、常用命令 七、性能对比——Nginx vs Apache 八、典型用户 九、配置示例 十、Java应用需配合的配置 十一、性能优化策略 十二、常见问题排查 十三、文件结构配置 十四、总结归纳概述 …

几个常用的Oxygen编辑器插件

Oxygen XML Editor是罗马尼亚的SyncroSoft公司开发的结构化文档编辑和发布软件。 除了Oxygen编辑器带的功能&#xff0c;它还提供了丰富的插件来提供额外的功能来辅助资料开发人员更高效率、更低成本地开发结构化资料。 本文介绍几个比较常用和有用的插件。 - 1 - Git Clie…

基于springboot的软件缺陷管理跟踪平台

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;没有什么华丽的语言&#xff0…

【LINUX】Centos 9使用nmcli更改IP

1. 查看连接名称 nmcli connection show输出类似&#xff1a; NAME UUID TYPE DEVICE Wired connection 1 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ethernet enp1s02. 修改 IP 地址&#xff08;以静态 IP 为例&#xf…

ConvMixer模型:纯卷积为何能够媲美Transformer架构?深入浅出原理与Pytorch代码逐行讲解实现

ConvMixer 是一个简洁的视觉模型&#xff0c;仅使用标准的卷积层&#xff0c;达到与基于自注意力机制的视觉 Transformer&#xff08;ViT&#xff09;相似的性能&#xff0c;由此证明纯卷积架构依然很强大。核心原理&#xff1a;极简的卷积设计&#xff1a;它摒弃了复杂的自注意…

教程:如何通过代理服务在国内高效使用 Claude API 并集成到 VSCode

对于许多开发者来说&#xff0c;直接访问 Anthropic 的 Claude API 存在网络障碍。本文将介绍一个第三方代理服务&#xff0c;帮助你稳定、高效地利用 Claude 的强大能力&#xff0c;并将其无缝集成到你的开发工作流中。 一、服务介绍 我们使用的是 open.xiaojingai.com 这个…

从零开始:Vue 3 + TypeScript 项目创建全记录

一次完整的现代前端项目搭建经历,踩坑与收获并存 📖 前言 最近创建了一个新的 Vue 3 项目,整个过程中遇到了不少有趣的选择和决策点。作为一个技术复盘,我想把这次经历分享出来,希望能帮助到其他开发者,特别是那些刚接触 Vue 3 生态的朋友们。 🛠️ 项目初始化:选择…

[spring6: @EnableWebSocket]-源码解析

注解 EnableWebSocket Retention(RetentionPolicy.RUNTIME) Target(ElementType.TYPE) Documented Import(DelegatingWebSocketConfiguration.class) public interface EnableWebSocket {}DelegatingWebSocketConfiguration Configuration(proxyBeanMethods false) public …