[Java]面向对象高级篇
文章目录
- 包装类
- 包装类层次结构
- 基本类型包装类
- 特殊包装类
- 数组
- 一维数组
- 多维数组
- 可变长参数
- 字符串
- String类
- StringBuilder类
- 内部类
- 成员内部类
- 静态内部类
- 局部内部类
- 匿名内部类
- Lambda表达式
- 方法引用
- 异常机制
- 自定义异常
- 抛出异常
- 异常的处理
- 常用工具类
- 数学工具类
- 随机数
- 数组工具类
包装类
包装类层次结构
基本类型包装类
package com.test.entity;
public class Main {public static void main(String[] args) {Integer a = new Integer(10);Integer b = new Integer(10);System.out.println(a == b);}
}public static void main(String[] args) {Integer a = 10, b = 10;System.out.println(a == b);
}package com.test.entity;
public class Main {public static void main(String[] args) {Integer a = 128, b = 128;System.out.println(a == b);}
}public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high) //这里会有一个IntegerCache,如果在范围内,那么会直接返回已经提前创建好的对象return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);
}
false
true
false
IntegerCache会默认缓存-128~127之间的所有值,将这些值提前做成包装类放在数组中存放
package com.test.entity;
public class Main {public static void main(String[] args) {Integer i = Integer.valueOf("5555");System.out.println(i);Integer j = Integer.parseInt("5555");System.out.println(j);}
}
package com.test.entity;
public class Main {public static void main(String[] args) {Integer i = Integer.decode("036");System.out.println(i);System.out.println(Integer.toHexString(166));}
}
30
a6
特殊包装类
package com.test.entity;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.RoundingMode;
public class Main {public static void main(String[] args) {BigDecimal i = BigDecimal.valueOf(10);i = i.divide(BigDecimal.valueOf(3), 100, RoundingMode.CEILING);//计算10/3的结果,精确到小数点后100位//RoundingMode是舍入模式,就是精确到最后一位时,该怎么处理,这里CEILING表示向上取整System.out.println(i);BigInteger j = BigInteger.valueOf(Long.MAX_VALUE);j = j.pow(100); //来个100次方吧System.out.println(j);}
}
数组
一维数组
package com.test.entity;
public class Main {public static void main(String[] args) {int[] array = new int[]{1,2,43,5};for (int i = 0; i < array.length; i++) {System.out.print(array[i]+" ");}System.out.println();//foreachfor (int a:array){System.out.print(a+" ");}}
}
public static void main(String[] args) {String[] arr = new String[10];Object[] array = arr; //引用类型的数组同样支持向上转型Object[] arr = new Object[10];String[] array = (String[]) arr; //引用类型数组也支持向下转型
}
多维数组
package com.test.entity;
public class Main
{public static void main(String[] args){int[][] arr = new int[][]{{1, 2}, {3, 4}, {5, 6}};for (int i = 0; i < arr.length; i++){ //要遍历一个二维数组,那么我们得一列一列一行一行地来for (int j = 0; j < arr[0].length; j++){System.out.print(arr[i][j]+" ");}System.out.println();}}
}
可变长参数
package com.test.entity;
public class Main
{public static void main(String[] args){test("co","le","ak","66");}public static void test(String... strings){ //strings这个变量就是一个String[]类型的for (String string : strings) {System.out.print(string); //遍历打印数组中每一个元素}}
}
字符串
String类
package com.test.entity;
public class Main
{public static void main(String[] args) {String str1 = "Hello World";String str2 = "Hello World";System.out.println(str1 == str2);}
}
直接使用双引号创建的字符串,如果内容相同,为了优化效率,那么始终都是同一个对象
package com.test.entity;
public class Main
{public static void main(String[] args) {String str1 = new String("Hello World");String str2 = new String("Hello World");System.out.println(str1 == str2);System.out.println(str1.equals(str2)); //字符串的内容比较,一定要用equals}
}
false
true
package com.test.entity;
public class Main
{public static void main(String[] args) {String str = "Hello World";String[] strings = str.split(" ");for (String string : strings){System.out.println(string);}String sub = str.substring(6, 8); //分割字符串,返回新的子串对象,这里返回67字符System.out.println(sub);}
}
Hello
World
Wo
package com.test.entity;
public class Main
{public static void main(String[] args){String str = "Hello World";char[] chars = str.toCharArray();for (char aChar : chars){System.out.println(aChar);}char[] chars2 = new char[]{'c', 'o', 'l'};String str2 = new String(chars2);System.out.println(str2);}
}
StringBuilder类
package com.test.entity;
public class Main
{public static void main(String[] args) {StringBuilder builder = new StringBuilder(); //一开始创建时,内部什么都没有builder.append("AAA"); //我们可以使用append方法来讲字符串拼接到后面builder.append("BBB");System.out.println(builder); //当我们字符串编辑完成之后,就可以使用toString转换为字符串了builder.delete(2, 5); //删除234这个范围内的字符System.out.println(builder.toString());}
}
AAABBB
AAB
内部类
成员内部类
package com.test.entity;
public class Main
{public static void main(String[] args) {Test a = new Test("小明");Test.Inner inner = a.new Inner(); //依附于a创建的对象,那么就是a的inner.test("coleak");}
}package com.test.entity;
public class Test {private final String name;public Test(String name){this.name = name;}public class Inner {String name;public void test(String name){System.out.println("方法参数的name = "+name); //就近原则System.out.println("成员内部类的name = "+this.name); //表示内部类对象System.out.println("成员内部类的name = "+Test.this.name);//如果需要指定为外部的对象,那么需要在前面添加外部类型名称}}
}
方法参数的name = coleak
成员内部类的name = null
成员内部类的name = 小明
静态内部类
package com.test.entity;
public class Test {private final String name;public Test(String name){this.name = name;}public static class Inner {public void test(){System.out.println("我是静态内部类!");}}
}package com.test.entity;
public class Main
{public static void main(String[] args) {Test.Inner inner = new Test.Inner();inner.test();}
}
仅使用静态内部类时,不会加载外部类,而是直接加载内部类,完成内部静态类的初始化和构造方法
局部内部类
public class Test {public void hello(){class Inner{ //局部内部类跟局部变量一样,先声明后使用public void test(){System.out.println("我是局部内部类");}}Inner inner = new Inner(); //局部内部类直接使用类名就行inner.test();}
}
匿名内部类
public class Main {public static void main(String[] args) {
// Student student = new Student(); //抽象类和接口均无法实例化
// student.test();}
}public abstract class Student {public abstract void test();protected String a="coleak";
}public class Main {public static void main(String[] args) {Student student = new Student() {int b;@Overridepublic void test() {System.out.println(a);System.out.println("我是匿名内部类的实现!");}};student.test();}
}
coleak
我是匿名内部类的实现!
Lambda表达式
如果一个接口中有且只有一个待实现的抽象方法,那么我们可以将匿名内部类简写为Lambda表达式
package com.test.entity;
public interface Study {String stu(String str);static int num=10;
}import com.test.entity.Study;
public class Main
{public static void main(String[] args){Study study = (a) ->{System.out.println(Study.num);return "我是学习方法!"+" "+a;};System.out.println(study.stu("coleak"));}
}
10
我是学习方法! coleak
方法引用
package com.test.entity;public interface Study {int sum(int a, int b);
}import com.test.entity.Study;
public class Main {public static void main(String[] args) {//Study study = (a, b) -> a + b;Study study = (a, b) -> Integer.sum(a, b); //直接使用Integer提供求和方法System.out.println(study.sum(10, 20));}
}public static void main(String[] args) {Study study = Integer::sum; //双冒号来进行方法引用,静态方法使用 类名::方法名 的形式System.out.println(study.sum(10, 20));
}
public static int sum(int a, int b) {return a + b; }public static void main(String[] args){Main main = new Main();Study study = String::new;}
异常机制
自定义异常
异常两大类,编译时异常,运行时异常
抛出异常
当别人调用我们的方法时,如果传入了错误的参数导致程序无法正常运行,这时我们就可以手动抛出一个异常来终止程序继续运行下去,同时告知上一级方法执行出现了问题。
我们在重写方法时,如果父类中的方法表明了会抛出某个异常,只要重写的内容中不会抛出对应的异常我们可以直接省去:
public class Main
{public static void main(String[] args) throws Exception {System.out.println(test(30,4));System.out.println(test(30,0));System.out.println("coleak");}public static int test(int a, int b) throws Exception{if(b == 0)throw new RuntimeException("被除数不能为0"); //使用throw关键字来抛出异常return a / b;}
}
异常的处理
public class Main
{public static void main(String[] args) {try { //使用try-catch语句进行异常捕获Object object = null;object.toString();} catch (NullPointerException e){e.printStackTrace(); //打印栈追踪信息System.out.println("异常错误信息:"+e.getMessage()); //获取异常的错误信息}System.out.println("程序继续正常运行!");}
}
import java.io.IOException;public class Main
{public static void main(String[] args) throws IOException {test(10); //必须要进行异常的捕获,否则报错}private static void test(int a) throws IOException { //明确会抛出IOExceptionthrow new IOException();}
}
如果已经是主方法了,那么就相当于到顶层了,此时发生异常再往上抛出的话,就会直接交给JVM进行处理,默认会让整个程序终止并打印栈追踪信息。
import java.io.IOException;
public class Main
{public static void main(String[] args) throws IOException {try {int[] arr = new int[1];arr[1] = 100; //这里发生的是数组越界异常,它是运行时异常的子类} catch (RuntimeException e){ //使用运行时异常同样可以捕获到System.out.println("捕获到异常");}}
}
如果我们要捕获的异常,是某个异常的父类,那么当发生这个异常时,同样可以捕获到
try {//....
}
catch (NullPointerException e){}
catch (IndexOutOfBoundsException e){}
catch (RuntimeException e){}try {//....
} catch (NullPointerException | IndexOutOfBoundsException e) { //用|隔开每种类型即可
}
当代码可能出现多种类型的异常时,我们希望能够分不同情况处理不同类型的异常,就可以使用多重异常捕获
try {//....
}catch (Exception e){}finally {System.out.println("lbwnb"); //无论是否出现异常,都会在最后执行
}
无论是否出现异常,都会在最后执行任务,可以交给
finally
语句块来处理
try
语句块至少要配合catch
或finally
中的一个
常用工具类
数学工具类
import java.io.IOException;
public class Main
{public static void main(String[] args) {//Math也是java.lang包下的类,所以说默认就可以直接使用System.out.println(Math.pow(5, 3.5)); //我们可以使用pow方法直接计算a的b次方Math.abs(-1); //abs方法可以求绝对值Math.max(19, 20); //快速取最大值Math.min(2, 4); //快速取最小值System.out.println(Math.sqrt(9)); //求一个数的算术平方根}
}import java.io.IOException;
public class Main
{public static void main(String[] args) {Math.sin(Math.PI / 2); //求π/2的正弦值,这里我们可以使用预置的PI进行计算Math.cos(Math.PI); //求π的余弦值Math.tan(Math.PI / 4); //求π/4的正切值System.out.println(Math.asin(1)); //求arcsin1的值Math.acos(1);Math.atan(0);}
}public static void main(String[] args) {Math.log(Math.E); //e为底的对数函数,其实就是ln,我们可以直接使用Math中定义好的eMath.log10(100); //10为底的对数函数//利用换底公式,我们可以弄出来任何我们想求的对数函数double a = Math.log(4) / Math.log(2); //这里是求以2为底4的对数,log(2)4 = ln4 / ln2System.out.println(a);
}
import java.io.IOException;
public class Main
{public static void main(String[] args) {System.out.println(Math.log(Math.E)); //e为底的对数函数,其实就是ln,我们可以直接使用Math中定义好的eSystem.out.println(Math.log10(100)); //10为底的对数函数//利用换底公式,我们可以弄出来任何我们想求的对数函数double a = Math.log(4) / Math.log(2); //这里是求以2为底4的对数,log(2)4 = ln4 / ln2System.out.println(a);}}
1.0
2.0
2.0
随机数
import java.util.Random;
public class Main
{public static void main(String[] args) {Random random = new Random(); //创建Random对象for (int i = 0; i < 30; i++) {System.out.print(random.nextInt(100)+" "); //nextInt方法可以指定创建0 - x之内的随机数}}}
数组工具类
import java.util.Arrays;
public class Main {public static void main(String[] args) {int[] arr = new int[]{1, 4, 5, 8, 2, 0, 9, 7, 3, 6};System.out.println(Arrays.toString(arr));Arrays.sort(arr); //可以对数组进行排序,将所有的元素按照从小到大的顺序排放System.out.println(Arrays.toString(arr));int[] arr2 = new int[10];Arrays.fill(arr2, 66);System.out.println(Arrays.toString(arr2));int[] target = Arrays.copyOf(arr, 10);System.out.println(Arrays.toString(target)); //拷贝数组的全部内容,并生成一个新的数组对象System.out.println(arr == target);int[] target2 = Arrays.copyOfRange(arr, 3, 5); //也可以只拷贝某个范围内的内容System.out.println(Arrays.toString(target2));int[] target3 = new int[10];System.arraycopy(arr, 2, target3, 4, 5); //使用System.arraycopy进行搬运System.out.println(Arrays.toString(target3));System.out.println(Arrays.binarySearch(target3, 5));int[][] array = new int[][]{{2, 8, 4, 1}, {9, 2, 0, 3}};System.out.println(Arrays.deepToString(array));int[][] a = new int[][]{{2, 8, 4, 1}, {9, 2, 0, 3}};int[][] b = new int[][]{{2, 8, 4, 1}, {9, 2, 0, 3}};System.out.println(Arrays.equals(a, b)); //equals仅适用于一维数组System.out.println(Arrays.deepEquals(a, b));}
}
[1, 4, 5, 8, 2, 0, 9, 7, 3, 6]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[66, 66, 66, 66, 66, 66, 66, 66, 66, 66]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
false
[3, 4]
[0, 0, 0, 0, 2, 3, 4, 5, 6, 0]
7
[[2, 8, 4, 1], [9, 2, 0, 3]]
false
true
相关文章:

[Java]面向对象高级篇
文章目录包装类包装类层次结构基本类型包装类特殊包装类数组一维数组多维数组可变长参数字符串String类StringBuilder类内部类成员内部类静态内部类局部内部类匿名内部类Lambda表达式方法引用异常机制自定义异常抛出异常异常的处理常用工具类数学工具类随机数数组工具类包装类 …...

苹果应用商店上架流程
上架过程分七个步骤,按步骤一步步来。 仔细看这个流程,少走很多弯路,不用一步步去试错,新手也能快速掌握上架流程。 1、创建APP身份证(App IDs) 2、申请iOS发布证书 3、申请iOS发布描述文件 4、上传ios证…...

基于Eclipse下使用arm gcc开发GD32调用printf
系列目录 第一章 xxx 目录 系列目录 文章目录 文章目录 系列文章目录前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结前言 开发环境:Eclipse代替Keil,IAR 开发平台:GD32 开发编译器:arm-none-eabi- …...

5个降低云成本并提高IT运营效率的优先事项
在过去的十年里,公司在公有云和私有云基础设施上构建了大量的计算工作负载,或者将工作负载转移到云端。Gartner 预测,到2023年,全球终端用户在公共云服务上的支出将达到5910亿美元,比2021年增长43%。这是一个显著的增长…...

95-拥塞控制
拥塞控制1.什么是拥塞控制2.拥塞控制的方法(1)慢启动和拥塞避免(2)快速重传和快速恢复1.什么是拥塞控制 在计算机网络中的链路容量(即带宽)、交换结点中的缓存和处理机等,都是网络的资源。在某段时间,若对网络中某一资源的需求超…...

Linux常见操作命令【二】
一、Vi 编辑器 Vi 编辑器存在三者模式:命令、末行、编辑 1.1 命令模式 输入 vi 默认进入命令模式 输入n或者nG:定位到某一行行首 输入G:跳到文件最后一行行首 输入hjkl:表示左下上右移动光标(方向键也可以…...

Linux驱动中断和定时器
目录 中断 顶半部/底半部机制 软中断: Tasklet: 工作队列: 定时器 中断 中断是正在执行的程序被另一个程序打断,去执行另一个程序的处理函数,当执行完再返回执行被打断的程序。分为内中断(异常)和外中断(硬件中断)。 当cp…...

表达式和函数
表达式: 将数字和运算符连接起来的组合称为表达式。我们可以将数字称为操作数,单个操作数也可以被看作是一个表达式。 操作数:常数,列名,函数调用,其他表达式 运算符:算数运算符,…...

C#基础复习
目录 格式字符串 多重标记和值 预定义类型 用户定义类型 值类型和引用类型 存储引用类型对象的成员 C#类型的分类 静态类型和dynamic关键字 类的基本概念 类成员的类型 为数据分配内存 访问修饰符 格式字符串 多重标记和值 C#程序就是一组类型声明,学习C#就是学习…...

Windows服务器使用代码SSH免密登录并执行脚本
服务器操作系统 Window Server 2016 1、Windows服务器安装OpenSSH 有多种方式,本文介绍一种方式 下载页: https://github.com/PowerShell/Win32-OpenSSH/releases 在下载页下载文件OpenSSH-Win64.zip 本次实验解压至 D:\OpenSSH-Win64\OpenSSH-Win6…...

(Deep Learning)交叉验证(Cross Validation)
交叉验证(Cross Validation) 交叉验证(Cross Validation)是一种评估模型泛化性能的统计学方法,它比单次划分训练集和测试集的方法更加稳定、全面。 交叉验证不但可以解决数据集中数据量不够大的问题,也可以…...

通俗举例讲解动态链接】静态链接
参考动态链接 - 知乎 加上我自己的理解,比较好懂,但可能在细节方面有偏差,但总体是一致的 静态链接的背景 静态链接使得不同的程序开发者和部门能够相对独立的开发和测试自己的程序模块,从某种意义上来讲大大促进了程序开发的效率…...

K8S部署常见问题归纳
目录一. 常用错误发现手段二、错误问题1. token 过期2. 时间同步问题3. docker Cgroup Driver 不是systemd4. Failed to create cgroup(未验证)子节点误执行kubeadm reset一. 常用错误发现手段 我们在部署经常看到的提示是: [kubelet-check] It seems …...

Redis高可用
最近离职后还没开始找工作,在找工作前去学习一下Redis高可用方案。 目录Redis高可用高可用的概念实现方式持久化主从复制简单结构优化结构优缺点哨兵模式(Sentinel)哨兵进程的作用自动故障迁移(Automatic failover)优缺点集群优缺点Redis高可…...

Hyperledger Fabric 2.2版本环境搭建
前言 部署环境: CentOS7.9 提前安装好以下工具 git客户端golangdockerdocker-composecurl工具 以下是个人使用的版本 git: 2.39.2golang: 1.18.6docker: 23.0.3dockkekr-compose: v2.17.2curl: 7.29.0 官方文档参考链接:跳转链接,不同的版本对应的官…...

macOS Monterey 12.6.5 (21G531) Boot ISO 原版可引导镜像
本站下载的 macOS 软件包,既可以拖拽到 Applications(应用程序)下直接安装,也可以制作启动 U 盘安装,或者在虚拟机中启动安装。另外也支持在 Windows 和 Linux 中创建可引导介质。 2023 年 4 月 10 日(北京…...

【软件设计师13】数据库设计
数据库设计 1. 数据库设计过程 2. E-R模型 3. E-R图向关系模型的转换 例如一对一联系,可以将联系单独做为关系模式,也可以存放到任意一个实体中 而一对多要合并只能合并到多这边,不能存放到1 多对多则联系必须单独转成一个关系模式 4. 案…...

SpringMVC的全注解开发
文章目录一、spring-mvc.xml 中组件转化为注解形式二、DispatcherServlet加载核心配置类三、消除web.xml一、spring-mvc.xml 中组件转化为注解形式 跟之前全注解开发思路一致, xml配置文件使用核心配置类替代,xml中的标签使用对应的注解替代 <!-- 组件…...

C# | 导出DataGridView中的数据到Excel、CSV、TXT
C# | 导出DataGridView中的数据到Excel、CSV、TXT 文章目录C# | 导出DataGridView中的数据到Excel、CSV、TXT前言DataGridView数据转存DataTableDataTable转Excel方法一、使用Microsoft.Office.Interop.Excel方法二、使用EPPlus库方法三、使用NPOI库DataTable转CSVDataTable转T…...

新规拉开中国生成式AI“百团大战”序幕?
AI将走向何方? ChatGPT在全球范围掀起的AI热潮正在引发越来越多的讨论,AI该如何管理?AI该如何发展?一系列问题都成为人们热议的焦点。此前,马斯克等海外名人就在网络上呼吁OpenAI暂停ChatGPT的模型训练和迭代…...

日撸 Java 三百行day31
文章目录day31 整数矩阵及其运算面向对象思想java异常处理java中的getter和setter方法代码day31 整数矩阵及其运算 面向对象思想 结合之前day7和day8面向过程开发,只关注了矩阵加法和矩阵乘法的功能。而day31是面向对象开发,一个矩阵类,在这…...

在线绘制思维导图
思维导图是一种可视化的思维工具,它可以将放射性思考具体化为可视的图像和图表。 思维导图利用图文并重的技巧,把各级主题的关系用相互隶属与相关的层级图表现出来,把主题关键词与图像、颜色等建立记忆链接。 它运用图像和颜色等多种元素&…...

月薪20k的性能测试必备技能:发现性能瓶颈掌握性能调优
背景 当下云计算、大数据盛行的背景下,大并发和大吞吐量的需求已经是摆在企业面前的问题了,其中网络的性能要求尤为关键,除了软件本身需要考虑到性能方面的要求,一些硬件上面的优化也是必不可少的。 作为一名测试工作者…...

3、Web前端学习规划:CSS - 学习规划系列文章
CSS作为Web前端开发的第2种重要的语言,笔者建议在学了HTML之后进行。CSS主要是对于HTML做一个渲染,其也带了一些语言语法函数,功能也非常强大。 1、 简介; CSS(层叠样式表)是一种用于描述网页样式的语言。它可以控制网页中的字体、…...

城市轨道交通列车时刻表优化问题【最优题解】
文章目录城市轨道交通列车时刻表优化问题思路文章底部城市轨道交通列车时刻表优化问题 最新进度在文章最下方卡片,加入获取思路数据代码论文:2023十三届MathorCup交流 (第一时间在CSDN分享,文章底部) 题目为数据分析类题目。列车时刻表优化…...

常年不卷,按时下班,工作能力强,同事求助知无不言,不扯皮,不拉帮结派,这样的职场清流竟然被裁掉了!...
在职场上,你永远想不到什么样的员工会被优化,比如下面这位:常年不卷,按时下班,工作很专业,同事问什么都回答,不扯皮,不拉帮结派,简直是职场清流。在上个月竟然被优化了&a…...

基于改进多目标灰狼优化算法的考虑V2G技术的风、光、荷、储微网多目标日前优化调度研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

Python 函数、文件与模块
“探索 Python” 这一系列的前几篇文章已为 Python 编程新手介绍了几方面的主题,包括变量、容器对象和复合语句。本文以这些概念为基础,构造一个完整的 Python 程序。引入了 Python 函数和模块,并展示了构建一个 Python 程序、将其存储在文件…...

在Spring Boot微服务使用RedisTemplate操作Redis
记录:400 场景:在Spring Boot微服务使用RedisTemplate操作Redis缓存和队列。 使用ValueOperations操作Redis String字符串;使用ListOperations操作Redis List列表,使用HashOperations操作Redis Hash哈希散列,使用SetO…...

4月软件测试面试太难,吃透这份软件测试面试笔记后,成功跳槽涨薪30K
4 月开始,生活工作渐渐步入正轨,但金三银四却没有往年顺利。昨天跟一位高级架构师的前辈聊天时,聊到今年的面试。有两个感受,一个是今年面邀的次数比往年要低不少,再一个就是很多面试者准备明显不足。不少候选人能力其…...