Java技术整理(4)—— Java基础篇

1、Java异常分类及处理

异常处理是为了解决在程序处理时发生错误而无法退出的问题。

(1)异常分类

Object —— Throwable(所有错误或异常的超类)

  • Error: 是指 Java 运行时系统的内部错误和资源耗尽错误,应用程序并不会抛出该对象,如果出现这样的错误,尽量保证系统安全结束
  • Exception: Java 异常有两种异常类型,运行时异常、检查异常
    • RuntimeException: 例如 NullPointerException、ClassCastException,基本上都是程序设计者设计不合理才会产生的异常
    • CheckedException: 例如 IOException、SQLException,一般是外部错误,这种异常都发生在编译阶段,Java 编译器会强制程序捕获异常,即会出现要求你把这段可能出现异常的程序进行try…catch…,这类异常一般包括几个方面:
      • 试图在文件尾部读取数据
      • 试图打开一个错误格式的URL
      • 试图根据给定的字符串查找 class 对象,而这个字符串表示的类并不存在

(2)异常的处理方式

自然抛出异常有三种形式:throw、throws、系统自动抛出异常

捕获异常并处理是以 try…catch… 作为捕获异常并处理代码的结构

(3)throw 与 throws 的区别

  • 位置不同: throws 用在函数声明上,抛出的是异常类,并且可以抛出多个;throw 用在函数内,用来抛出异常对象
  • 功能不同:
    • throws用来声明异常,让调用者了解该功能可能出现的问题,预先给出处理方式;throw 抛出具体的问题对象,执行到throw,程序立即结束,跳转回调用者,并将具体的问题对象抛出调用者,即throw语句独立存在时,后续程序无法执行。
    • throws表示的是异常的可能性,并不一定会发生异常;throw 则一定会抛出确定的异常

2、Java 反射

(1)动态语言: 是指程序运行时可以改变其结构,即新的函数可以引进,已有的函数可以被删除等结构上的变化。
(2)反射机制的概念: Java中的反射机制是在运行状态中,对于任意一个类都能获取这个类所有的属性和方法,并且对于任意一个对象,都能调用它的任意一个方法。
(3)反射的应用场合: 编译时类型和运行时类型

  • 编译时类型: 由声明对象时实用的类型决定,并且无法获取具体方法,如Person person = new Student();,声明的是Person类型,但运行时是Student类型
  • 运行时类型: 由赋值对象的类型决定

当程序运行时可能会接收外部传入的对象,该对象在编译时类型为Object,但程序调用需要知道该对象的运行时类型,所以可以利用反射来获取该对象的类型以及类信息。

(4)反射API

反射 API 用来生成JVM中的类、接口或对象的信息。

  • Class类: 反射的核心类,可以获取类的属性、方法等信息。
  • Field类: java.lang.reflec 包中的类,表示类的成员变量,用来获取和设置类中的属性值
  • Method类: java.lang.reflec 包中的类,表示类的方法,用来获取类中的方法信息或调用方法
  • Constructor类: java.lang.reflec 包中的类,表示类的构造方法

(5)反射的步骤

  • 获取想要操作的Class对象
  • 调用Class类中的方法
  • 使用反射API操作这些信息

(6)获取Class对象的方法

  • 实例对象.getClass(): 是实例对象获取Class对象的方法
  • 类名.class: 是每一个类加载时,都会维护一个class 属性,class 属性中存储了该类的相关信息
  • Class.forName(): Class 类提供基于全路径获取Class对象的静态方法

(7)创建Class对象的方法

  • newInstence(): 这种创建方法要求 Class对象有默认的空构造器
  • Constructor的newInstance(): 这种创建方法要求先获取Constructor,因为需要确认Class对象具有构造器

3、Java注解

(1)概念: Annotation 是 Java 提供的一种对元程序中关联信息和元数据(metadata)的途径和方法;它是一种接口,程序可以通过反射来获取指定程序中的Annotation对象,通过Annotation对象来获取元数据信息。
(2)元注解: 元注解的作用是负责注解说明其它注解,JDK 5 定义了 4 个标准的 meta-annotation 类型。

  • @Target: 说明修饰的对象范围
    • packages
    • types: 类、接口、枚举、Annotation类型
    • 类型成员: 方法、构造方法、成员变量、枚举值
    • 方法参数
    • 本地变量: 如循环变量、catch参数
  • @Retention: 定义Annotation的生命周期
    • @SOURSE: 在源文件中有效
    • @CLASS: 在class文件中有效
    • @RUNTIME: 在运行时有效
  • @Documented: 描述-javadoc,用来描述其它类型的annotation应该被作为被标注的程序成员的公共API
  • @Inherited: 描述某个被标注的类型是被继承的,若该注解在某个类上,则这个类的子类也会继承父类拥有的注解

(3)注解处理器

注解处理器是用于注解读取与使用注解的核心程序。

实现注解处理器:

//1、创建注解处理器
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitProvider {public int id() default -1;public String name() default "";public String address default "";
}//2、使用注解处理器
public class Apple{@FruitProvider(id=1,name="陕西红富士集团",address="陕西省西安市延安路")private String appleProvider;public void setAppleProvider(String appleProvider){this.appleProvider = appleProvider;}public String getAppleProviderO (return appleProvider;}
}//3、注解处理器
public class FruitInfoUtil {public static void getFruitInfo(Class<?> clazz) {String strFruitProvicer = "供应商信息:";Field[] fields = clazz.getDeclaredFields(); //获取成员变量for (Field field : fields){FruitProvider fruitProvider = (FruitProvider) field.getAnnotation(FruitProvider.class);strFruitProvicer = "供应商编号:" + fruitProvider.id() + "供应商名称:" + fruitProvider.name() + "供应商地址:" +  fruitProvider.address();System.out.println(strFruitProvicer);}}
}

4、Java内部类

Java类中不仅可以定义变量和方法,还可以定义类,定义在类内部的类称为内部类,根据定义方式不同,内部类分为静态内部类、成员内部类、局部内部类、匿名内部类四种。

  • 静态内部类: 使用static关键字修饰的内部类,这种内部类可以与外部类共享所有的静态资源,通过使用外部类名.内部类名获得编译时类型。例如,HashMap类内部就有一个静态内部类Entry。
  • 成员内部类: 普通的内部类,这种类不能定义静态方法和变量(因为只有静态资源才属于类对象,并且JVM先加载静态资源,容易产生冲突)
  • 局部内部类: 定义在方法内部的类,充当临时对象进行存储。
  • 匿名内部类: 匿名内部类必须继承一个父类或只实现一个接口,同时也没有class关键字,通过new关键字直接生成一个对象的引用。

5、泛型

泛型是用来声明无法确定的对象类型,编译器会通过传入的值来确定对象类型。

(1)泛型方法<E>

public static <E> void printArray(E[] inputArray){for(E element : inputArray) {System.out.printf("%s", element);}
}
  • <? extends T>: 表示该通配符代表T的所有子类
  • <? super T>:表示该通配符代表T的所有父类

(2)泛型类 <T>

public class Box<T>{private T t;public void add(T t){this.t = t;}public T get(){return t;}
}

(3)类型通配符 <?>

类型通配符通常使用 ?来代替具体的类型参数,例如List<?> 在逻辑上是所有List具有泛型约束的父类

(4)类型擦除

Java中的泛型基本上是在编译器层面的实现,在生成的字节码中是不存在泛型的,在编译时,自动将传入的数据类型覆盖到泛型使用的位置上,这样的过程叫类型擦除。


6、序列化

(1)序列化的作用: 序列化操作可以持久化对象及其状态到内存或者磁盘中
(2)序列化的存储: 序列化是将传入对象转为字节数组进行存储,但是序列化只关注其成员变量,而不关注静态资源
(3)序列化的使用场景: 持久化对象;网络传递对象等等…
(4)序列化的实现:

  • Java提供了 java.io.Serializable 接口,只要类实现接口,就可以被序列化
  • 利用ObjectOutputStream和ObjectInputStream进行序列化和反序列化
  • 利用writeObject和readObject实现自定义序列化策略

(5)反序列化的关键点——序列化ID:

  • 序列化ID: 虚拟机是否支持反序列化,不仅取决于类路径和功能代码是否一致,还取决于两个类的序列化ID是否一致

(6)序列化在子父类中的使用: 若子类实现序列化,而想要父类也能够序列化,那么父类必须也实现Serializable接口
(7)阻止某个变量不进行序列化: Java 提供了 Transient 关键字来声明变量不参与序列化过程,在反序列化时,对应的 trasient 变量则被初始化。


7、Java复制

Java 程序中若想要将一个对象复制给另一个对象,一共有三种方法:直接赋值、浅拷贝、深拷贝。

  • 直接赋值: 直接引用同一对象,从表面上看确实是复制了一个对象,但在内部依旧是同一个内存空间
  • 浅拷贝: 创建一个新对象,复制非静态字段到新对象,但若旧对象中有一个引用对象,则复制的是引用对象的地址,即直接赋值给新对象的引用对象变量。
  • 深拷贝: 创建一个新对象,将旧对象的所有资源打个包,创建一个副本提供给新对象,即两个成为结构相同,但存储地址不同的对象。(实现方式可以通过序列化与反序列化操作进行对象创建)

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

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

相关文章

C++ | C++11新特性(上)

目录 前言 一、列表初始化 二、声明 1、auto 2、decltype 3、nullptr 三、STL容器的变化 四、右值引用与移动语义 1、左值与左值引用 2、右值与右值引用 3、右值引用与左值引用的比较 4、右值引用的场景及意义 &#xff08;1&#xff09;做参数 &#xff08;2&a…

影响亚马逊Listing转化率的14大因素你知道吗?

我们都知道亚马逊listing转化率对于链接的推新和维稳来说有多么重要&#xff0c;只要转化率的比值无法达到整体市场平均比值的及格线&#xff0c;你就很可能会慢慢被亚马逊的飞轮算法所淘汰。 那么&#xff0c;具体是哪些因素在影响着你的listing转化率呢?这里我们可以分为显…

LeetCode1732. 找到最高海拔

题干 有一个自行车手打算进行一场公路骑行&#xff0c;这条路线总共由 n 1 个不同海拔的点组成。自行车手从海拔为 0 的点 0 开始骑行。 给你一个长度为 n 的整数数组 gain &#xff0c;其中 gain[i] 是点 i 和点 i 1 的 净海拔高度差&#xff08;0 < i < n&#xff…

wm8960没有声音

最近在imx6ull上调试这个声卡&#xff0c;用官方的镜像是能发声的&#xff0c;换到自己做的镜像上&#xff0c;就没有声音。 记录一下过程&#xff1a; 内核和设备树。只要有下面的显示&#xff0c;就说明加载成功。 再看一下aplay的显示 到此&#xff0c;驱动都是正常的。但…

数学建模-元胞自动机

clc clear n 300; % 定义表示森林的矩阵大小 Plight 5e-6; Pgrowth 1e-2; % 定义闪电和生长的概率 UL [n,1:n-1]; DR [2:n,1]; % 定义上左&#xff0c;下右邻居 vegzeros(n,n); % 初始化表示森林的矩阵 imh ima…

适配器模式-java实现

意图 复用已经存在的接口&#xff0c;与所需接口不一致的类。即将一个类&#xff08;通常是旧系统中的功能类&#xff09;&#xff0c;通过适配器转化成另一个接口的实现。&#xff08;简单来说&#xff0c;就是复用旧系统的功能&#xff0c;去实现新的接口&#xff09; 我们举…

在R中比较两个矩阵是否相等

目录 方法一&#xff1a;使用all.equal()比较两个R对象是否近似相等 方法二&#xff1a;使用identical比较两个R对象是否精确相等。 方法一&#xff1a;使用all.equal()比较两个R对象是否近似相等 使用函数&#xff1a;all.equal(x,y) 比较两个R对象x和y是否近似相等 > M1…

Oracle ORA-00054锁表处理

ORA-00054 锁表处理 1. 现象 删除表的时候&#xff0c;提示资源繁忙。 SQL> drop table SALEMAN; drop table SALEMANORA-00054: resource busy and acquire with NOWAIT specified or timeout expired2.处理 &#xff08;1&#xff09;锁对象 查询锁对象。 SQL> s…

DEVICENET转ETHERCAT网关连接西门子支持ethercat吗

你有没有遇到过生产管理系统中&#xff0c;设备之间的通讯问题&#xff1f;两个不同协议的设备进行通讯&#xff0c;是不是很麻烦&#xff1f;今天&#xff0c;我们为大家介绍一款神奇的产品&#xff0c;能够将不同协议的设备进行连接&#xff0c;让现场的数据交换不再困扰&…

嵌入式开发学习(STC51-18-LCD液晶显示)

内容 在LCD1602液晶上显示字符信息&#xff1b; LCD1602介绍 简介 1602液晶也叫1602字符型液晶&#xff0c;它能显示2行字符信息&#xff0c;每行又能显示16个字符&#xff1b; 它是一种专门用来显示字母、数字、符号的点阵型液晶模块&#xff1b; 它是由若干个5x7或者5x…

WSL2安装CentOS7和CentOS8

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、下载ZIP包&#xff1f;二、安装1.打开Windows子系统支持2.安装到指定位置3.管理虚拟机4.配置虚拟机1.配置国内源2.安装软件3.安装第三方源 5.配置用户1.创建…

redis 集群 1:李代桃僵 —— Sentinel

目前我们讲的 Redis 还只是主从方案&#xff0c;最终一致性。读者们可思考过&#xff0c;如果主节点凌晨 3 点突发宕机怎么办&#xff1f;就坐等运维从床上爬起来&#xff0c;然后手工进行从主切换&#xff0c;再通知所有的程序把地址统统改一遍重新上线么&#xff1f;毫无疑问…

用于自然语言处理 (NLP) 的 MLOps

介绍 自然语言处理( NLP )的人工智能关注的是计算机和人们如何用日常语言进行交流。鉴于 NLP 模型在生产系统中的部署,我们需要简化 NLP 应用程序的不断使用,从而使 MLOps(机器学习操作)对 NLP 有所帮助。在生产系统中自动创建、训练、测试和部署 NLP 模型是 MLOps for …

使用 Splashtop Secure Workspace 改进安全访问

前言&#xff1a;Splashtop 首席执行官兼联合创始人 Mark Lee 我们在十多年前推出 Splashtop 远程访问和支持产品线时&#xff0c;专注于为用户提供高性能和卓越的用户体验&#xff0c;以便用户能够随处访问计算资源。如今&#xff0c;我们有25万企业客户和3000万个人用户&…

机器学习深度学习——卷积的多输入多输出通道

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——从全连接层到卷积 &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文章对你们有所帮…

C++三个线程依次打印abc

代码 #include<iostream> #include<thread> #include<mutex> #include<condition_variable> using namespace std; mutex mtx; condition_variable cv; int flag0; void A(){unique_lock<mutex>lk(mtx);int count0;while(count<10){while(fl…

Jmeter录制HTTPS脚本

Jmeter录制HTTPS脚本 文章目录 添加“HTTP代理服务器”设置浏览器代理证书导入存在问题 添加“HTTP代理服务器” 设置浏览器代理 保持端口一致 证书导入 点击一下启动让jmeter自动生成证书&#xff0c;放在bin目录下&#xff1a; 打开jmeter的SSL管理器选择刚刚生成的证书&…

Vue——formcreate表单设计器自定义组件实现(二)

前面我写过一个自定义电子签名的formcreate表单设计器组件&#xff0c;那时初识formcreate各种使用也颇为生疏&#xff0c;不过总算套出了一个组件不是。此次时隔半年又有机会接触formcreate&#xff0c;重新熟悉和领悟了一番各个方法和使用指南。趁热打铁将此次心得再次分享。…

THS4301 振荡问题排查及解决过程

项目背景简介: 本项目是基于一款微弱信号处理前级模拟电路设计方案。 问题描述: 在生产标定中,发现以前的程序在小量程标定后,切换到差分和单端后,两者的直流偏置不一样,且切换到差分输入时,能发现有振荡现象(有设备单端输入也有振荡); 排查分析过程: 1)首先可以…

tomcat上部署jpress

一.确保有jdk&#xff0c;tomcat和mysql环境 二.新建jpress数据库&#xff0c;新建jpress用户并赋予所有权限 三.将jpress的war上传到tomcat/apache-tomcat-8.5.70/webapps&#xff0c;具体根据你的实际tomcat安装路径为准&#xff0c;上传完成后他会自己解包 四.到浏览器完…