网站首页 > java教程 正文
/**
* 包装类的自动封装、自动拆箱和缓存
*/
public class TestWrapper2 {
public static void main(String[] args) {
Integer i1 = 1;
//自动封装 通过编译器编译后转变为 Integer i1 = Integer.valueOf(1); 供虚拟机执行
//Integer i1 引用类型变量
int i2 = i1;
//自动拆箱 通过编译器编译后转变为 int i2 = i1.intValue(); 供虚拟机执行
//int i2 基本数据类型
Integer i3 = null;
i2 = i3;
//运行时报错NullPointerException 在虚拟机运行时代码已经变为 i2 = i3.intValue() 但i3为null空指针 没有指向对象就找不到.intValue()方法
Integer i4 = 4000;
Integer i5 = 4000;
System.out.println(i4==i5);
//结果false i4 = Integer.valueOf(4000) Integer静态方法.valueOf()执行后会new一个新的对象给i4 value值为4000
//i5 = Integer.valueOf(4000) 同样会new一个新的对象给i5 i4和i5分别指向两个对象
System.out.println(i4.equals(i5));
//结果true Integer重写的equals()方法 在判断i5 instanceof Integer 判断i5是Integer的实例后比较i4和i5的value 两个value都是4000所以true
Integer i6 = 123;
Integer i7 = 123;
System.out.println(i6==i7);
//结果true 原因:在Integer初始化时缓存了整数范围在[-128,127]之间的包装类对象
//当i6 = Integer.valueOf(123)时 方法没有new新的包装类对象 而是将缓存中提前创建好的value=123的对象返回给i6
//i7 = 123同理 i6和i7指向的是同一个对象
/*
public static Integer valueOf(int i) {
//静态方法valueOf() 返回Integer类对象
if (i >= IntegerCache.low && i <= IntegerCache.high)
//IntegerCache整数缓存 .low=-128 .high=127 系统运行时已经提前建好了-128到127的整数的包装类放到了缓存数组中
return IntegerCache.cache[i + (-IntegerCache.low)];
//当判断i在-128到127之间 返回对应的对象
return new Integer(i);
//当i不在缓存数组的范围内是new对象返回
*/
}
}
class ImitateInteger {
//imitate模仿Integer缓存数组
private int value;
//每个对象对应一个value值
private ImitateInteger(int i){
//将构造器私有 外部生成对象时需要通过.valueOf()方法
this.value = i;
}
private static final int LOW = -128;
//模拟[-128,127] 两个值设为final常量 private仅方法内判断时调用 static这个属性不需要给对象
private static final int HIGH = 127;
private static final ImitateInteger[] cache = new ImitateInteger[HIGH-LOW+1];
//创建一个数组准备缓存[-128,127]之间的对象 -128到-1是128个 1到127是127个 再加一个0 [127-(-128)+1]
//换一种想法 从HIGH到LOW总共有HIGH-LOW个数 包含HIGH没包含LOW 所以再+1
static {
//静态初始化块 在类加载时执行
for (int i=LOW;i<=HIGH;i++){
cache[i+(-LOW)] = new ImitateInteger(i);
//数组的index范围[0]-[255] i=LOW i-LOW=0 i=HIGH i-LOW=255
//将value=-128的对象交给cache[0] value=127的对象交给cache[255]
//在类加载时即缓存new了-128到127
}
}
public static ImitateInteger valueOf(int i){
//public供外部调用的代替私有构造器的方法 代替构造器所以返回ImitateInteger对象
if (i>=LOW&&i<=HIGH){
//判断i是否在[-128,127]区间
return cache[i+(-LOW)];
//对应静态初始化快中的缓存数组 i对应的对象的index要加128即(-LOW)
}
return new ImitateInteger(i);
//不在区间内则new新对象返回
}
public static void main(String[] args) {
ImitateInteger i1 = ImitateInteger.valueOf(1);
ImitateInteger i2 = ImitateInteger.valueOf(1);
System.out.println(i1==i2);
//结果true i1和i2都没有new对象 返回了cache[1+(-(-128))]即cache[129] cache[129].value对应1
ImitateInteger i3 = ImitateInteger.valueOf(200);
ImitateInteger i4 = ImitateInteger.valueOf(200);
System.out.println(i3==i4);
//结果false i3和i4分别指向new新生成的对象
}
public boolean equals(Object o){
//重写继承自Object 的equals()
if (o instanceof ImitateInteger){
return this.value==((ImitateInteger)o).value;
//比较两个对象的value 将o强转为ImitateInteger
}
return false;
//不是同类返回false
// this.equals(o); 用来比较两个对象所以不是static方法
}
public int intValue(){
return this.value;
//int a = i4.intValue(); 将包装类转为基本数据类型 要转换的是对象 所以不用static
}
@Override
public String toString() {
//重写toString
return ""+this.value;
//返回值只能是字符串
}
}
猜你喜欢
- 2024-11-13 Java面向对象三大特征:封装、继承、多态
- 2024-11-13 利用Java注解的简单封装,进行的一次优化
- 2024-11-13 如何封装原生的 Java NIO 以及扩展?详细到让你分分钟搞定Netty
- 2024-11-13 Java面向对象——基础2 封装、继承、多态
- 2024-11-13 想要 Spring Data JPA/MongoDB 更易用,你应该这样封装
- 2024-11-13 Java面向对象高级特性-封装(java面向对象三大特点)
- 2024-11-13 Java基础类型与封装类型的区别与联系
- 2024-11-13 java程序员必备的基础知识_java面向对象之封装(二)
- 2024-11-13 Java面试基础回顾03-封装(java基础面试题及答案)
- 2024-11-13 java程序员必备的基础知识_java面向对象之封装(一)
你 发表评论:
欢迎- 06-15Linux中如何通过Shell脚本来控制Spring Boot的Jar包启停服务?
- 06-15推荐一款超棒的SpringCloud 脚手架项目
- 06-15IDEA将项目打包成jar包(idea打包普通java项目)
- 06-15Spring Boot3 项目 jar 包打包成 Docker 镜像全攻略
- 06-15记录Dockerfile将jar包构建成部署所需的镜像
- 06-15项目基础部署汇总八---linux下xxl-job安装
- 06-15Spring Boot Jar 包秒变 Docker 镜像实现多环境部署
- 06-15终端执行 java -jar example.jar 时报错:“没有主清单属性” 的解决
- 最近发表
-
- Linux中如何通过Shell脚本来控制Spring Boot的Jar包启停服务?
- 推荐一款超棒的SpringCloud 脚手架项目
- IDEA将项目打包成jar包(idea打包普通java项目)
- Spring Boot3 项目 jar 包打包成 Docker 镜像全攻略
- 记录Dockerfile将jar包构建成部署所需的镜像
- 项目基础部署汇总八---linux下xxl-job安装
- Spring Boot Jar 包秒变 Docker 镜像实现多环境部署
- 终端执行 java -jar example.jar 时报错:“没有主清单属性” 的解决
- 如何将本地JAR文件添加到Maven项目中
- Java 类隔离应用:多 Jar 包支持(java接口隔离原则)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)