内部类、泛型、常用API

内部类

  • 内部类是类中的五大成分之一(成员变量、方法、构造器、代码块、内部类)

  • 如果一个类定义在另一个类的内部,这个类就是内部类。

  • 场景:当一个类的内部,包含了一个完整的事物,且这个事物没有必要单独设计时,就可以把这个事物设计成内部类。

  • public class Car{// 内部类public class Engine{}
    }
    

成员内部类

是定义在一个类中成员位置的类,在内部类中也可以定义成员属性和方法
public class Outer {// 成员内部类public class Inner {// 成员属性和方法}
}
创建对象的格式
外部类名.内部类名 对象名 = new 外部类(...).new 内部类(...);
Outer.Inner in =  new Outer().new Inner();
  • 成员内部类中访问其他成员的特点:
    • 成员内部类中可以定义实例成员,静态成员 (注意: 静态成员从JDK16开始支持)
    • 成员内部类中的实例方法中,可以直接访问外部类的实例成员,静态成员
    • 如果内部类和外部类出现了重名的成员,可以通过(外部类名.this.xxx) 强行访问外部类的成员

成员内部类的访问拓展:

  • 成员内部类中是否可以直接访问外部类的静态成员?
    • 可以,外部类的静态成员只有一份可以被共享访问。
  • 成员内部类的实例方法中是否可以直接访问外部类的实例成员?
    • 可以的,因为必须先有外部类对象,才能有成员内部类对象,所以可以直接访问外部类对象的实例成员。

总结

  • 成员内部类是什么样的、有什么特点?
    • 无static修饰,属于外部类的对象。
    • 可以直接访问外部类的静态成员,实例方法中可以直接访问外部类的实例成员。
  • 成员内部类如何创建对象?
    • 外部类名.内部类名 对象名 = new 外部类构造器.new 内部类构造器();

静态内部类

使用static修饰的成员内部类
public class Outer{// 静态内部类public static class Inner{}
}
创建对象的格式:    
外部类名.内部类名 对象名 = new 外部类.内部类();Outer.Inner in =  new Outer.Inner();静态内部类中访问外部类成员的特点
可以直接访问外部类的静态成员,不可以直接访问外部类的实例成员。
+ 静态内部类的使用场景、特点、访问总结。+ 如果一个类中包含了一个完整的成分,如汽车类中的发动机类。 
+ 特点、使用与普通类是一样的,类有的成分它都有,只是位置在别人里面而已。
+ 访问总结:可以直接访问外部类的静态成员,不能直接访问外部类的实例成员。
+ 注意:开发中实际上用的还是比较少。

局部内部类

局部内部类是定义在方法中、代码块中、构造器等执行体中
public class Test {public static void main(String[] args) {}public static void go(){class A{}abstract class B{}interface C{}}
}

匿名内部类

这是一种特殊的局部内部类
所谓匿名:指的是程序员不需要为这个类声明名字
new  类或接口(参数值…) {方法实现(){}
};
new Animal(){@Overridepublic void cry() {}
};public interface Swimming{void swim();
}public class Test {public static void main(String[] args) {go(new Swimming() {@Overridepublic void swim() {System.out.println(“猫也还行~~~");}});}public static void go(Swimming s){System.out.println("开始============");s.swim();}}
总结
  • 匿名内部类的作用?
    • 方便创建子类对象,最终目的为了简化代码编写。
  • 匿名内部类的格式?
Animal a = new Employee() { public void run() {  }};a. run();
  • 匿名内部类的特点?
    • 匿名内部类是一个没有名字的内部类,同时也代表一个对象。
    • 匿名内部类的对象类型,相当于是当前new的那个类型的子类类型。

泛型

认识泛型

定义类、接口、方法时,同时声明的类型变量(如:<E>) ,称为泛型。

集合体系的全部接口和实现类都是支持泛型的使用的。

泛型:是JDK5中引入的特性,可以在编译阶段约束操作的数据类型,并进行检查。

集合体系的全部接口和实现类都是支持泛型的使用的。

public class ArrayList<E>{ . . . }

**作用: **

  • 作用:泛型提供了在编译阶段约束所能操作的数据类型,并自动进行检查的能力!这样可以避免强制类型转换,及其可能出现的异常。
  • 本质:把具体的数据类型作为参数传给类型变量
  • 分类:泛型类、泛型接口、泛型方法

泛型的好处:

  • 统一数据类型。
  • 把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为编译阶段类型就能确定下来。
修饰符 class 类名<类型变量,类型变量,…> { 
}
public class ArrayList<E>{ . . . }注意:类型变量建议用大写的英文字母,常用的有:ETKV

1、泛型类的核心思想:

  • 把出现泛型变量的地方全部替换成传输的真实数据类型

2、泛型类的作用

  • 编译阶段约定操作的数据的类型,类似于集合的作用。
  • 方法中可以使用泛型接收一切实际类型的参数,方法更具备通用性

泛型接口

修饰符 interface 接口名<类型变量,类型变量,…> { }
public interface A<E>{ . . . }
注意:类型变量建议用大写的英文字母,常用的有:ETKV 等
作用: 泛型接口可以让实现类选择当前需要操作的数据类型
原理: 实现类可以在实现接口的时候传入自己操作的数据类型,这样重写的方法都将是针对于该类型的操作。
作用: 泛型接口可以约束实现类,实现类可以在实现接口的时候传入自己操作的数据类型这样重写的方法都将是针对于该类型的操作。

泛型方法

修饰符 <类型变量,类型变量,…>  返回值类型 方法名(形参列表) { }
public static <T> void test(T t){ }public E get(int index){return (E) arr[index];
}

泛型通配符、上下限

  • 通配符
    • 就是 “?” ,可以在“使用泛型”的时候代表一切类型; E T K V 是在定义泛型的时候使用。
  • 泛型的 上 下限
    • 泛型上限: ? extends Car: ? 能接收的必须是Car或者其子类 。
    • 泛型下限:? super Car :? 能接收的必须是Car或者其父类。

泛型的擦除问题和注意事项

  • 泛型是工作在编译阶段的,一旦程序编译成class文件,class文件中就不存在泛型了,这就是泛型擦除。
  • 泛型不支持基本数据类型,只能支持对象类型(引用数据类型)。

常用API

什么是API?

  • API(Application Programming interface) 应用程序编程接口。
  • 简单来说:就是Java帮我们已经写好的一些方法,我们直接拿过来用就可以了。

Object类的作用:

  • 一个类要么默认继承了Object类,要么间接继承了Object类,Object类是Java中的祖宗类。
  • Object作为所有类的父类,提供了很多常用的方法给每个子类对象拿来使用。
方法名说明
public String toString()默认是返回当前对象在堆内存中的地址信息:类的全限名@内存地址
public boolean equals(Object o)默认是比较当前对象与另一个对象的地址是否相同,相同返回true,不同返回false
Object的toString方法:

问题引出

l开发中直接输出对象,默认输出对象的地址其实是毫无意义的。

l开发中输出对象变量,更多的时候是希望看到对象的内容数据而不是对象的地址信息。

toString存在的意义

  • 父类toString()方法存在的意义就是为了被子类重写,以便返回对象的内容信息,而不是地址信息!!
  • Object的toString方法的基本作用是什么,存在的意义是什么?
    1. 基本作用:给子类继承,子类对象调用可以返回自己的地址。
    2. 意义:让子类重写,以便返回子类对象的内容。
Object的equals方法:
  • Object的equals方法的基本作用,存在的意义是什么?

    • 基本作用:默认是与另一个对象比较地址是否一样

    • 存在的意义:让子类重写,以便比较对象的内容是否相同。

Objects的常见方法:
方法名说明
public static boolean equals(Object a, Object b)比较两个对象的,底层会先进行非空判断,从而可以避免空指针异常。再进行equals比较
public static boolean isNull(Object obj)判断变量是否为null ,为null返回true ,反之

image-20230507182745269

  • 对象进行内容比较的时候建议使用什么?为什么?
    • 建议使用Objects提供的equals方法。
    • 比较的结果是一样的,但是更安全。
Object类提供的对象克隆方法

当某个对象调用这个方法时,这个方法会复制一个一模一样的新对象返回。

方法名说明
protected Object clone()对象克隆
浅克隆

拷贝出的新对象,与原对象中的数据一模一样(引用类型拷贝的只是地址)

image-20240410142213843

深克隆
  • 对象中基本类型的数据直接拷贝。
  • 对象中的字符串数据拷贝的还是地址。
  • 对象中还包含的其他对象,不会拷贝地址,会创建新对象。

image-20240410143418805

包装类

为什么要有包装类?
基本类型的数据byteshortintlongcharfloatdoubleboolean

包装类就是把基本类型的数据包装成对象。

基本数据类型对应的包装类(引用数据类型)
byteByte
shortShort
intInteger
longLong
charCharacter
floatFloat
doubleDouble
booleanBoolean
基本类型的数据包装成对象的方案
public Integer(int value):已过时
public static Integer valueOf(int i)
自动装箱:自动拆箱:
基本数据类型可以自动转换为包装类型。包装类型可以自动转换为基本数据类型。
包装类其他常见操作

可以把基本类型的数据转换成字符串类型。

public static String toString(double d)
public String toString()

可以把字符串类型的数值转换成数值本身对应的数据类型。

public static int parseInt(String s)
public static Integer valueOf(String s)

StringBuilder

StringBuilder概述
  • StringBuilder是一个可变的字符串的操作类,我们可以把它看成是一个对象容器。
  • 使用StringBuilder的核心作用:操作字符串的性能比String要更高(如拼接、修改等)。
StringBuilder构造器
名称说明
public StringBuilder()创建一个空白的可变的字符串对象,不包含任何内容
public StringBuilder(String str)创建一个指定字符串内容的可变字符串对象
StringBuilder常用方法
方法名称说明
public StringBuilder append(任意类型)添加数据并返回StringBuilder对象本身
public StringBuilder reverse()将对象的内容反转
public int length()返回对象内容长度
public String toString()通过toString()就可以实现把StringBuilder转换为String
  • 为什么拼接、反转字符串建议使用StringBuilder?
    • StringBuilder:内容是可变的、拼接字符串性能好、代码优雅。
    • String :内容是不可变的、拼接字符串性能差。
    • 定义字符串使用String
    • 拼接、修改等操作字符串使用StringBuilder
总结
  • 1、String和StringBuilder的区别是什么,分别适合什么场景?
    • String: 是不可变字符串、频繁操作字符串会产生很多无用对象,性能差。
      适合字符串内容不变的场景
    • StringBuilder:是内容可变的字符串、拼接字符串性能好、代码优雅。
      适合字符串内容频繁变化的场景
  • 2、StringBuilder和StringBuffer的区别是什么,分别适合什么场景?
    • StringBuilder和StringBuffer都是可变字符串
    • StringBuffer 线程安全, 性能稍差
    • StringBuilder 线程不安全, 性能更高

StringJoiner

既能高效,又能实现更方便的拼接?

速度慢

public class Test {public static void main(String[] args) {String s = "";for (int i = 0; i < 1000000; i++) {s += "abc";}System.out.println(s);    }
}

速度快

public static String getArrayData(int[] arr){// 1、判断arr是否为nullif(arr == null){return null;}// 2、arr数组对象存在。 arr = [11, 22, 33]StringBuilder sb = new StringBuilder();sb.append("[");for (int i = 0; i < arr.length; i++) {if(i == arr.length - 1){sb.append(arr[i]);}else {sb.append(arr[i]).append(", ");}}sb.append("]");return sb.toString();
}

JDK8开始才有的,跟StringBuilder一样,也是用来操作字符串的,也可以看成是一个容器,创建之后里面的内容是可变的。

**好处:**不仅能提高字符串的操作效率,并且在有些场景下使用它操作字符串,代码会更简洁

构造器说明
public StringJoiner (间隔符号)创建一个StringJoiner对象,指定拼接时的间隔符号
public StringJoiner (间隔符号,开始符号,结束符号)创建一个StringJoiner对象,指定拼接时的间隔符号、开始符号、结束符号
方法名称说明
public StringJoiner add (添加的内容)添加数据,并返回对象本身
public int length()返回长度 ( 字符出现的个数)
public String toString()返回一个字符串(该字符串就是拼接之后的结果)

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

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

相关文章

20240403-算法复习打卡day43||● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零

1049. 最后一块石头的重量 II class Solution { public:int lastStoneWeightII(vector<int>& stones) {vector<int> dp(15001, 0);int sum 0;for (int i 0; i < stones.size(); i) sum stones[i];int target sum / 2;for (int i 0; i < stones.siz…

智慧城市中的物联网革命——青创智通

工业物联网解决方案-工业IOT-青创智通 得益于物联网 (IoT)的变革力量&#xff0c;智慧城市的概念正在迅速成为现实。物联网正在从根本上改变城市的运作方式&#xff0c;为城市居民带来更高的效率、可持续性和生活质量。在本文中&#xff0c;我们将探讨物联网在智慧城市中的作用…

49 样式迁移【李沐动手学深度学习v2课程笔记】

1. 样式迁移&#xff08;Style Transfer) 计算机视觉的应用之一&#xff0c;将样式图片中的样式&#xff08;比如油画风格等&#xff09;迁移到内容图片&#xff08;比如实拍的图片&#xff09;上&#xff0c;得到合成图片 可以理解成为一个滤镜&#xff0c;但相对于滤镜来讲…

基于SSM框架JAVA仓库管理系统源代码Mysql数据库(可当毕设,实训项目,设计大赛)

仓库管理系统实现的功能包括店铺管理&#xff0c;员工管理&#xff0c;部门管理&#xff0c;商品管理&#xff0c;权限管理&#xff0c;入库管理&#xff0c;出库管理&#xff0c;盘点管理&#xff0c;统计管理等功能。该项目采用了Mysql数据库&#xff0c;Java语言&#xff0c…

Hibernate多事务同时调用update(T t) ,字段被覆盖问题

前言 今天现网有个订单卡单了&#xff0c;经过排查发现没有任何异常日志&#xff0c;根据日志定位发现本应该更新的一个状态&#xff0c;也sql肯定执行了(使用了Hibernate的ORM框架)&#xff0c;但是数据库里面的状态没有更新。大概逻辑如下 String hql from orderInfo where…

大模型训练:如何解决GPU万卡互联挑战?

如何解决GPU万卡互联的挑战 近日&#xff0c;字节跳动携手北京大学研究团队发布重磅论文&#xff0c;揭示了一项革命性技术&#xff1a;将大型语言模型训练扩展至超10,000块GPU的生产系统。此系统不仅解决了万卡集群训练大模型时的效率和稳定性难题&#xff0c;更标志着人工智能…

用dbms_shared_pool.purge清除执行计划

1.Oracle 11g如何清除share pool中某条SQL的执行计划 以前在Oracle 10g数据库上,如果遇到绑定窥探导致执行计划慢的情况,想要清除某条SQL的执行计划,让它硬解析,找了很久都没有找到直接操作share pool的方法&#xff08;总不能alter system flush shared_pool&#xff09;,只能…

rocketmq和rabbitmq总是分不清?

1. 官方解答 摘自百度搜索&#xff1a; 2. 通俗易懂的回答

【Gem5】获取构建教程

gem5-tutorial-hpca-2023 1 介绍 1.1 Gem5是什么1.2 Gem5可以用来做什么1.3 获取并构建gem5 gem5-tutorial-hpca-2023 打开网址&#xff1a; github 创建教程代码空空间 “Code” -> “Codespaces” -> “Create Codespace on master” GitHub Codespaces 是一个由…

最坏情况为线性时间的第k大元素

在统计和数据分析中&#xff0c;我们经常会遇到求最大值、最小值、中位数、四分位数、Top K等类似需求&#xff0c;其实它们都属于顺序统计量&#xff0c;本文将对顺序统计量的定义和求解算法进行介绍&#xff0c;重点介绍如何在最差时间复杂度也是线性的情况下求解第k大元素。…

在Debian 12系统上安装Docker

Docker 在 Debian 12 上的安装 安装验证测试更多信息引言 在现代的开发环境中,容器技术发挥着至关重要的作用。Docker 提供了快速、可靠和易于使用的容器化解决方案,使开发人员和 DevOps 专业人士能够以轻松的方式将应用程序从一个环境部署到另一个环境。 Docker 的安装过程在…

实用运维工具(转载)

1、查看进程占用带宽情况-Nethogs Nethogs 是一个终端下的网络流量监控工具可以直观的显示每个进程占用的带宽。 下载&#xff1a;http://sourceforge.net/projects/nethogs/files/nethogs/0.8/nethogs-0.8.0.tar.gz/download [rootlocalhost ~]#yum -y install libpcap-deve…

C语言—每日选择题—Day68

第一题 1、运行以下C语言代码&#xff0c;输出的结果是&#xff08;&#xff09; #include <stdio.h> int main() {char *str[3] {"stra", "strb", "strc"};char *p str[0];int i 0;while(i < 3){printf("%s ",p);i;} retur…

在win10上虚拟一个LoongOS系统(类似虚拟机)作为开发环境

文章目录 1.安装1.1.下载这三个东西1.2.安装好qemu。1.3.创建一个启动脚本startup_mate.bat&#xff0c;然后把三部分东西放到一起1.4.然后双击startup.bat就可以启动了。 2.文件的传输2.1.使能虚拟机系统的ssh2.2.连接ssh 3.Qt相关安装Qt安装opencv 1.安装 注意&#xff0c;一…

ClickHouse--17--argMin() 和argMax()函数

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 argMin() 和argMax()函数业务场景使用案例1.准备表和数据&#xff1a;业务场景一&#xff1a;查看salary 最高和最小的user业务场景二&#xff1a;根据更新时间获取…

再也不怕面试官问 OOM了,一次生产环境 Metaspace OOM 排查流程实操!

问题背景 小奎公司的运维同时今天反映核心业务一个服务目前 CPU 的使用率、堆内存、非堆内存的使用率有点高。刚反映没有过多久该服务就直接 OOM 了&#xff0c;以下是生产监控平台监控信息。 CPU 使用率监控 堆内存和非堆内存使用率 OOM 产生的日志报错信息 问题分析 根…

Go第三方框架--ants协程池框架

1. 背景介绍 1.1 goroutine ants是站在巨人的肩膀上开发出来的&#xff0c;这个巨人是goroutine&#xff0c;这是连小学生都知道的事儿&#xff0c;那么为什么不继续使用goroutine(以下简称go协程)呢。这是个思考题&#xff0c;希望讲完本文大家可以有个答案。 go协程只涉及用…

Docker部署minio集群

1.基本定义 由于是非常轻量级的软件&#xff0c;所以架构上也没有这么复杂&#xff0c;他使用操作系统的文件系统作为存储介质&#xff0c;我们在向任意节点写数据的时候&#xff0c;minio会自动同步数据到另外的节点&#xff0c;而机制叫做erasure code&#xff08;纠删码&am…

linux内核驱动-在内核代码里添加设备结点

linux中&#xff0c;一切皆文件 我们在用户层用一些系统函数&#xff08;如&#xff1a;fopen等等&#xff09;时&#xff0c;会进入内核&#xff0c;内核会在字符注册了的设备号链表中查找。如果找到就运行我们写的设备文件的&#xff08;驱动&#xff09;函数 我们在前面已经…

RuoYi-Vue若依框架-vue前端给对象添加字段

处理两个字段的时候有需求都要显示在下拉框的同一行&#xff0c;这里有两种解决方案&#xff0c;一是后端在实体类添加一个对象&#xff0c;加注解数据库忽略处理&#xff0c;在接口处拼接并传给前端&#xff0c;二是在前端获取的数据数组内为每个对象都添加一个字段&#xff0…