Java核心类——包装类型
Java的数据类型分两种:
基本类型:byte,short,int,long,boolean,float,double,char
引用类型:class,interface
引用类型可以赋值为null,表示空,但基本类型不能赋值为null:
String s = null; int n = null; //comile error!
那么,如何把一个基本类型视为对象(引用类型)?
比如,想要把int基本类型变成一个引用类型,我们可以定义一个integer类,
它只包含一个实例字段int,这样,Integer类就可以视为int的包装类(Wrapper class):
public class Integer { private int value; public Integer(int value) { this.value = value; } public int intValue() { return this.value; } }
定义好Integer类,我们就可以把int和Integer互相转换:
Integer n = null; Integer n2 = new Integer(99) //将int转换为Integer int n3 = n2.inValue(); //将integer转换为int
实际上,因为包装类非常有用,Java核心库为每种基本类型都提供了对应的包装类型:
我们可以直接使用,并不需要自己去定义:
public class catchExample2 { public static void main(String[] args) { int i = 100; // 通过new操作符创建Integer实例,这种方式,会有编译警告; Integer n1 = new Integer(i); // 可以通过静态方法valueOf创建Integer实例; Integer n2 = Integer.valueOf(i); // 通过静态方法valueOf(String)创建Integer也是可以的; Integer n3 = Integer.valueOf("100"); System.out.println(n3.intValue()); } }
因为int和Integer可以互相转换:
int i = 100; Integer n = Integer.valueOf(i); int x = n.inValue(); // 所以,Java编译器可以帮助我们自动在int和Integer之间转型: Integer n = 100; //编译器自动使用Integer.valueOf(int) int x = n; //编译器自动使用Integer.inValue()
这种直接把int变为Integer的赋值写法,称为自动装箱(Auto Boxing),
反过来,把Integer变为int的赋值写法,称为自动拆箱(Auto Unboxing)。
注意,自动装箱和自动拆箱只发生在编译阶段,目的是为了减少代码。
装箱和拆箱会影响代码的执行效率,因为编译后的class代码是严格区分基本类型和引用类型的。
并且自动拆箱执行时可能会报NullPointerExecption。
所有的包装类型都是不变类。
public final class Integer { private final int value; }
因此,一旦创建了Integer对象,该对象就是不变的。
我们在创建integer的时候,有两种方法:
Integer n = new Integer(100); Integer n = Integer.valueOf(100);
前者总是创建新的对象,后者方法更优。
我们将能创建新对象的静态方法称为静态工厂方法,
Integer.valueOf()就是静态工厂方法,它尽可能地返回缓存地实例以节省内存。
Integer类本身还提供了大量方法,例如,最常用地静态方法parseInt()可以把字符串解析成一个整数:
int x1 = Integer.parseInt("100"); // 100 int x2 = Integer.parseInt("100", 16); // 256,因为按16进制解析
Integer还可以把整数格式化为指定进制地字符串:
public class Main { public static void main(String[] args) { System.out.println(Integer.toString(100)); // "100",表示为10进制 System.out.println(Integer.toString(100, 36)); // "2s",表示为36进制 System.out.println(Integer.toHexString(100)); // "64",表示为16进制 System.out.println(Integer.toOctalString(100)); // "144",表示为8进制 System.out.println(Integer.toBinaryString(100)); // "1100100",表示为2进制 } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理