部分转载:
https://blog.csdn.net/hjf19790118/article/details/7081925
https://blog.csdn.net/gfdonx/article/details/48787187
http://www.cnblogs.com/kelin1314/archive/2010/09/11/1824145.html
一、为什么会有基本类型包装类
- Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为包装类(Wrapper Class),有些地方也翻译为外覆类或数据类型类。
- 将基本数据类型封装成对象的好处在于可以在对象中定义更过的功能方法操作该数据
- java 提供两种不同的类型:引用类型(或者封装类型,Warpper)和原始类型(或内置类型,Primitive)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。
- 引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的 数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。
- 基本类型存储在栈中,因此它们的存取速度要快于存储在堆中的对应包装类的实例对象。从Java5.0(1.5)开始,JAVA虚拟机(Java Virtual Machine)可以完成基本类型和它们对应包装类之间的自动转换。因此我们在赋值、参数传递以及数学运算的时候像使用基本类型一样使用它们的包装类,但这并不意味着你可以通过基本类型调用它们的包装类才具有的方法。另外,所有基本类型(包括void)的包装类都使用了final修饰,因此我们无法继承它们扩展新的类,也无法重写它们的任何方法。
二、常用的操作之一
- 用于基本数据类型与字符串之间的转换。
三、包装类介绍(8种)
- byte →→ Byte
- short →→ Short
- int →→ Integer(特殊)
- long →→ Long
- float →→ Float
- double →→ Double
- char →→ Character(特殊)
- boolean →→ Boolean
注意:在这八个类名中,除了Integer和Character类以后,其它六个类的类名和基本数据类型一直,只是类名的第一个字母大写即可。
四、主要作用
1.作为和基本数据类型对应的类类型存在,方便涉及到对象的操作。
2.包含每种基本数据类型的相关属性如最大值、最小值等,以及相关的操作方法。
五、主要方法
由于八个包装类的使用比较类似,下面以最常用的Integer类为例子介绍包装类的实际使用。
1、实现int和Integer类之间的转换
在实际转换时,使用Integer类的构造方法和Integer类内部的intValue方法实现这些类型之间的相互转换,实现的代码如下:
int n = 10;
Integer in = new Integer(100);
//将int类型转换为Integer类型
Integer in1 = new Integer(n);
//将Integer类型的对象转换为int类型
int m = in.intValue();
2、Integer类内部的常用方法
在Integer类内部包含了一些和int操作有关的方法,下面介绍一些比较常用的方法:
a、parseInt方法
public static int parseInt(String s)
该方法的作用是将数字字符串转换为int数值。在以后的界面编程中,将字符串转换为对应的int数字是一种比较常见的操作。使用示例如下:
String s = “123”;
int n = Integer.parseInt(s);
则int变量n的值是123,该方法实际上实现了字符串和int之间的转换,如果字符串都包含的不是都是数字字符,则程序执行将出现异常。(说明:异常的概念将在下一章进行讲述)
另外一个parseInt方法:
public static int parseInt(String s, int radix)
则实现将字符串按照参数radix指定的进制转换为int,使用示例如下:
//将字符串”120”按照十进制转换为int,则结果为120
int n = Integer.parseInt(“120”,10);
//将字符串”12”按照十六进制转换为int,则结果为18
int n = Integer.parseInt(“12”,16);
//将字符串”ff”按照十六进制转换为int,则结果为255
int n = Integer.parseInt(“ff”,16);
这样可以实现更灵活的转换。
注意:基本数据类型包装类中有八种,其中7种都有parseXxx的方法。将字符串转换成xxx型。
只有Character类中没有,因为字符串中有多个字符,放在一个char里是装不下的。字符串到字符的转换可以通过toCharArray()方法就可以把字符串转换成字符数组。
b、toString方法
public static String toString(int i)
该方法的作用是将int类型转换为对应的String类型。
使用示例代码如下:
int m = 1000;
String s = Integer.toString(m);
则字符串s的值是”1000”。
另外一个toString方法则实现将int值转换为特定进制的字符串:
public static int parseInt(String s, int radix)
使用示例代码如下:
int m = 20;
String s = Integer.toString(m);
则字符串s的值是”14”。
其实,JDK自从1.5(5.0)版本以后,就引入了自动拆装箱的语法,也就是在进行基本数据类型和对应的包装类转换时,系统将自动进行,这将大大方便程序员的代码书写。使用示例代码如下:
//int类型会自动转换为Integer类型
int m = 12;
Integer in = m;
//Integer类型会自动转换为int类型
int n = in;
所以在实际使用时的类型转换将变得很简单,系统将自动实现对应的转换。
六、java基本类型和包装类的区别
在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配
而实际的对象是在存储堆内存中。即
int i = 5;//直接在栈中分配空间
Integer i = new Integr(5);//对象是在堆内存中,而i(引用变量)是在栈内存中
在堆中分配的内存,由java虚拟机的自动垃圾回收器来管理。 因为在堆中分配空间所需的时间远大于从栈中分配存储空间,所以JAVA速度比C 慢。
七、java有自动封装功能,以下是一些构造及常用方法
package test1; public class PackagClass { public static void main(String[] args) { // TODO Auto-generated method stub //包装类,每一个基本类型都有对应的包装类, //并且都有一个将基本类型创建成包装类的构造方法。 Boolean bobj = new Boolean(true); Integer iobj = new Integer(1); Long lobj = new Long(1); Short sobj = new Short((short) 1); Character cobj = new Character('a'); Float fobj = new Float(1.0f); Double dobj = new Double(1.0); Byte byobj = new Byte((byte) 1); //每个包装类都有一个valueOf()方法,用于将字符串转成相应的包相类 System.out.println(Boolean.valueOf("false")); System.out.println(Integer.valueOf("1")); System.out.println(Short.valueOf("1")); System.out.println(Long.valueOf("1")); System.out.println(Float.valueOf("1.0")); System.out.println(Double.valueOf("1.0")); System.out.println(Byte.valueOf("1")); //Character类是构造将基本类型char转成包装类型Character System.out.println(Character.valueOf('a')); //第个包装类都有一个parseXxx方法,将字符串转成对应的基本类型,除Character类 System.out.println(Boolean.parseBoolean("false")); System.out.println(Integer.parseInt("1")); System.out.println(Short.parseShort("1")); System.out.println(Long.parseLong("1")); System.out.println(Float.parseFloat("1.0")); System.out.println(Double.parseDouble("1.0")); System.out.println(Byte.parseByte("1")); //Character包装类的常用方法 Character.isLetter('a');//判断这个字符是否为英文字母 Character.isDigit('1');//判断这个字符是否为数字 Character.isUpperCase('A');//判断这个字符是否为大写 Character.isLowerCase('a');//判断这个字符是否为小写 Character.isWhitespace(' ');//判断这个字符是否为空格或回车 } }