目录
3. 面向对象高级 - 常用的API
什么是API?
- API(Application Programming interface) 应用程序编程接口。
- 简单来说:就是 Java 帮我们已经写好的一些类和方法,我们直接拿过来用就可以了
3.1 Object 类
3.1.1 Object 类介绍
- 所有的类,都直接或者间接的继承了 Object 类 (祖宗类)
- Object类的方法是一切子类都可以直接使用的,所以我们要学习Object类的方法。
3.1.2 Object类的常用方法:
public class ToStringDemo { /* public String toString() 返回该对象的字符串表示 public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); } getClass().getName() : 类名称, 全类名(包名 + 类名) Integer.toHexString() : 转十六进制 hashCode() : 返回的是对象内存地址 + 哈希算法, 算出来的整数 (哈希值) ------------------------------------------------------- 细节: 使用打印语句, 打印对象名的时候, println方法, 源码层面, 会自动调用该对象的toString方法. public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString(); } */ public static void main(String[] args) { A a = new A(); System.out.println(a); System.out.println(a.toString()); Student stu = new Student("张三",23); System.out.println(stu); ArrayList<String> list = new ArrayList<>(); list.add("abc"); list.add("abc"); list.add("abc"); System.out.println(list); } } class A { @Override public String toString() { return "大哥重写了toString方法"; } }
结论: Object类中的equals方法, 默认比较的是对象内存地址 - 通常会重写equals方法, 让对象之间, 比较内容
3.1.3 Objects 概述
Objects类与 Object 还是继承关系,Objects类是从JDK 1.7开始之后才有的。
3.2 Math 类
包含执行基本数字运算的方法
3.3 System 类
3.3.1 System 类概述
- System的功能是静态的,都是直接用类名调用即可 ------ 工具类
3.3.2 常用方法
3.4 BigDecimal 类
3.4.1 BigDecimal 类概述
用于解决小数运算中, 出现的不精确问题
BigDecimal类 : 解决小数运算中, 出现的不精确问题
BigDecimal创建对象 :
public BigDecimal(double val) : 不推荐, 无法保证小数运算的精确
---------------------------------------------------------------
public BigDecimal(String val)
public static BigDecimal valueOf(double val)
BigDecimal常用成员方法 :
public BigDecimal add(BigDecimal b) : 加法
public BigDecimal subtract(BigDecimal b) : 减法
public BigDecimal multiply(BigDecimal b) : 乘法
public BigDecimal divide(BigDecimal b) : 除法
public BigDecimal divide (另一个BigDecimal对象,精确几位,舍入模式) : 除法
注意: 如果使用BigDecimal运算, 出现了除不尽的情况, 就会出现异常
3.4.2 BigDecimal 类使用
● 常用方法
3.4.3 BigDecimal 类使用
- divide 除法细节
3.5 包装类
3.5.1 包装类的介绍
将
基本数据类型
,
包装成
类
(
变成引用数据类型
)
3.5.2 包装类的好处
3.5.3 基本类型对应的包装类
将基本数据类型, 包装成类 (变成引用数据类型)
3.5.4 以Integer包装类为例
由于基本数据类型对应的包装类使用方式大同小异,以下以Interger包装类为例展开
包装类 : 将基本数据类型, 包装成类, 变成引用数据类型
----------------------------------------------------------------------------------
手动装箱: 调用方法, 手动将基本数据类型, 包装成类
1. public Integer(int value) : 通过构造方法 (不推荐)
2. public static Integer valueOf(int i) : 通过静态方法
手动拆箱: 调用方法, 手动将包装类, 拆成(转换)基本数据类型
1. public int intValue() : 以 int 类型返回该 Integer 的值
JDK5版本开始, 出现了自动拆装箱 :
3.5.5 Interger 常用方法
3.5.6 包装类面试题
public class InterView {
/*
看程序说结果, 并说明原因
自动装箱的时候, 如果装箱的数据范围, 是-128~127, ==号比较的结果就是true, 反之都是false
-----------------------------------------------------------------------------------
自动装箱的原理 : 自动帮我们调用了 Integer.valueOf(127);
// i = 127
public static Integer valueOf(int i) {
if (i >= -128 && i <= 127) {
return IntegerCache.cache[255];
}
return new Integer(i);
}
如果装箱的数据, 不在 -128 ~ 127 之间, 会重新创建新的对象
如果装箱的数据, 在 -128 ~ 127 之间, 不会创建新的对象, 而是从底层的数组中, 取出一个提前创建好的Integer对象, 返回
- Integer类中, 底层存在一个长度为256个大小的数组, Integer[] cache
在数组中, 存储了256个Integer对象, 分别是 -128 ~ 127
*/
public static void main(String[] args) {
Integer i1 = 127;
Integer i2 = 127;
System.out.println(i1 == i2); // true
Integer i3 = 129;
Integer i4 = 129;
System.out.println(i3 == i4); // false
Long i11 = 129L;
Long i22 = 129L;
System.out.println(i11 == i22);
System.out.println(i11.equals(i22));
}
}
3.5.7 今日学习目标
3.6 Runtime
Runtime表示当前虚拟机的运行环境
3.6.1 获取Runtime对象的方法
观察下面源码知:由于RunTime 构造方法被私有化,故获取Runtime的对象的方法为:
RunTime.getRuntime()
3.6.2 Runtime 的方法
3.7 浅拷贝、深拷贝
3.7.1 对象克隆
把A对象的属性值完全拷贝给B对象,也叫对象拷贝、对象复制
2.克隆对象
细节: 方法在底层会帮我们创建一个对象,并把原对象中的数据拷贝过去。
3.书写细节:
- 重写Object中的clone方法
- 让javabean类实现Cloneable接口
- 创建原对象并调用clone就可以了
Cloneable 如果一个接口里面没有抽象方法
表示当前的接口是一个标记性接口
现在Cloneable表示一旦实现了,那么当前类的对象就可以被克降
如果没有实现,当前类的对象就不能克隆
Cloneable接口源码
3.7.1 浅拷贝
浅拷贝内存结构演示
3.7.2 深拷贝
深拷贝内存结构演示
浅克隆与深克隆的区别
深拷贝的使用方式
一般会用第三方工具进行克隆
1.第三方写的代码导入到项目中
2.编写代码 Gson gson =new Gson(); //把对象变成一个字符串 String s=gson.toJson(u1); //再把字符串变回对象就可以了 User user =gson.fromJson(s, User.class);
具体代码如下
public class ObjectDemo4 {
public static void main(String[] args) throws CloneNotSupportedException {
// protected object clone(int a) 对象克隆
//1.先创建一个对象
int[] data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0};
User u1 = new User(1, "zhangsan", "1234qwer", "girl11", data);
//User u2 =(User)u1.clone();
//验证一件事情:Object中的克隆是浅克隆
//想要进行深克隆,就需要重写clone方法并修改里面的方法体
//int[] arr = u1.getData();
//arr[0] = 100;
//System.out.println(u1);
//System.out.println(u2);
//以后一般会用第三方工具进行克隆
//1.第三方写的代码导入到项目中
//2.编写代码
//Gson gson =new Gson();
//把对象变成一个字符串
//String s=gson.toJson(u1);
//再把字符串变回对象就可以了
//User user =gson.fromJson(s, User.class);
//int[] arr=u1.getData();
//arr[0] = 100;
//打印对象
//System.out.println(user);
}
}