包装类
大纲
包装类的使用
1.为什么要使用包装类?
为了使基本数据类型的变量具备引用数据类型变量的相关特征(比如:封装性、继承性、多态性)。我们给各个基本
数据类型的变量都提供了对应的包装类。
2.(掌握)基本数据类型对应的包装类类型
byte -> Byte
short -> Short
int -> Integer
long -> Long
float -> Float
double -> Double
------------------以上的继承父类:Number
char -> Character
boolean -> Boolean
3.掌握基本数据类型 与 包装类之间的转换。
3.1 为什么需要转换
> 一方面,在有些场景下,需要使用基本数据类型对应的包装类的对象。此时就需要将基本数据
类型的变量转换为包装类的对象。比如:ArrayList的add(Object obj);Object类的equals(Object obj)
> 对于包装类来讲,既然我们使用的是对象,那么对象是不能进行+ - * /等运算的。为了能够进行这些运算,
就需要将包装类的对象转换为基本数据类型的变量。
3.2 如何转换:
(装箱)基本数据类型 ---> 包装类:1.使用包装类的构造器 2.(建议)调用包装类的valueOf(xxx xx)
(拆箱)包装类 ---> 基本数据类型:调用包装类的xxxValue()
注意:原来使用基本数据类型变量的位置,改成包装类以后,对于成员变量来说,其默认值变化了!
jdk5.0新特性:自动装箱、自动拆箱
4. String 与 基本数据类型、包装类之间的转换。
基本数据类型、包装类 ---> String类型:1.调用String的重载的静态方法valueOf(xxx xx);
2.基本数据类型的变量 + "";
String类型 ---> 基本数据类型、包装类:基本数据类型没有方法,就只能调用包装类的静态方法parseXxx();
为什么需要包装类
Java提供了两个类型系统,基本数据类型
和引用数据类型
。使用基本数据类型在于效率,然而当要使用只针对对象设计的API或新特性(例如泛型),怎么办呢?例如:
//情况1:方法形参
Object类的equals(Object obj)
//情况2:方法形参
ArrayList类的add(Object obj)
//没有如下的方法:
add(int number)
add(double d)
add(boolean b)
//情况3:泛型
Set<T>
List<T>
Cllection<T>
Map<K,V>
有哪些包装类
Java针对八种基本数据类型定义了相应的引用类型:包装类(封装类)。有了类的特点。就可以调用类中的方法,Java才是真正的面向对象。
封装以后的,内存结构对比:
public static void main(String[] args){
int num = 520;
Integer obj = new Integer(520);
}
自定义包装类
public class MyInteger{
int value;
public MyInteger(){
}
public MyInteger(int value){
this.value = value;
}
@Override
public String toString(){
return String.valueOf(value);
}
}
包装类与基本数据类型间的转换
-
装箱
装箱:把基本数据类型转换为包装类对象
转为包装类的对象,是为了使用专门为对象设计的API和特性
基本数据类型---->包装对象
Integer obj1 = new Integer(4);//使用构造函数 Float f = new Float(3.66F); Long l = new Long("abccd");//NumberFormatException Integer obj2 = Integer.valueOf(4);//使用包装类的valueOf方法
-
拆箱
拆箱:把包装类对象拆为基本数据类型
转为基本数据类型,一般是因为需要运算,Java中的大多数运算符是为基本数据类型设计的。比较、算数等
包装对象---->基本数值
Integer obj = new Integer(4); int num1 = obj.intValue();
-
自动装箱与拆箱
由于我们经常要做基本数据类型与包装类之间的转换,从JDK5.0开始,基本类型与包装类的装箱、拆箱动作可以自由完成。例如:
Integer i = 4;//自动装箱。相当于Integer i = new Integer(4); i = i + 5;//等号右边,将i对象转成基本数值(自动拆箱)i.intValue() + 5; //加法运算完成后,再次装箱,把基本数值转成对象。
注意:只能与自己对应的类型之间才能实现自动装箱与拆箱。
Integer i = 1; Double d = 1;//错误的,1是int类型
package oop.demo16_wrapper; import org.junit.Test; public class WrapperTest { /* 基本数据类型 ---> 包装类:1.使用包装类的构造器 2.(建议)调用包装类的valueOf(xxx xx) 包装类 ---> 基本数据类型:调用包装类的xxxValue() */ /* jdk5.0新特性:自动装箱、自动拆箱。 */ @Test public void test4(){ //自动装箱:基本数据类型 ---> 包装类 int i1 = 10; Integer ii1 = i1;//自动装箱 System.out.println(ii1.toString()); Integer ii2 = ii1 + 1;//自动装箱 Boolean bb1 = true;//自动装箱 Float f1 = 12.6F;//自动装箱 //自动拆箱:包装类 ---> 基本数据类型 int i2 = ii1;//自动拆箱 boolean b2 = bb1; } //基本数据类型转包装类如下: //基本数据类型 ---> 包装类:1.使用包装类的构造器 2.(建议)调用包装类的valueOf(xxx xx) @Test public void test(){ int i1 = 10; Integer ii1 = new Integer(i1);//ii1已经对象了 System.out.println(ii1.toString()); Float f1 = 13.14F; f1 = 30.1F; Float ff1 = new Float(f1); System.out.println(ff1.toString()); String s1 = "30.2"; Float ff2 = new Float(s1); System.out.println(ff2); // String s2 = "abc"; // Float ff3 = new Float(s2);//运行时报异常 java.lang.NumberFormatException: For input string: "abc" // System.out.println(ff3); boolean b1 = true; Boolean bb1 = new Boolean(b1); System.out.println(bb1); String s3 = "50false"; Boolean bb2 = new Boolean(s3); System.out.println(bb2); //只要不是true(可以忽略大小写),他都输出false //推荐使用: int i2 = 10; Integer ii2 = Integer.valueOf(i2); Boolean b2 = Boolean.valueOf(true); Float f2 = Float.valueOf(15.7F); Double d1 = Double.valueOf(30.1); } //包装类转基本数据类型如下: //包装类 ---> 基本数据类型:调用包装类的xxxValue() @Test public void test2(){ Integer i3 = new Integer(10); int ii3 = i3.intValue(); ii3 = ii3+1; System.out.println(ii3); Float ff1 = new Float(13.8F); float f1 = ff1.floatValue(); System.out.println(f1); Boolean b2 = Boolean.valueOf(true); boolean bb2 = b2.booleanValue(); System.out.println(bb2); Double d1 = new Double(20.3); double d2 = d1.doubleValue(); d2 = d2+6; System.out.println(d2); } @Test public void test3(){ Account b1 = new Account(); System.out.println(b1.isFlag1);//false System.out.println(b1.isFlage2);//null System.out.println(b1.balance1);//0.0 System.out.println(b1.balance2);//null System.out.println(b1.i1);//null } } class Account{ boolean isFlag1;//基本数据类型 Boolean isFlage2;//包装类 double balance1; Double balance2; Integer i1; }
基本数据类型、包装类与字符串间的转换
-
基本数据类型转为字符串
- 方式1:调用字符串重载的valueOf()方法
int a = 10; //String str = a;//错误的 String str = String valueOf(a);
- 方式2:更直接的方式
int a = 10; String str = a + "";
-
字符串转为基本数据类型
- 方式1:处理Character类之外,其他所有包装类都具有parseXxx静态方法可以将字符串参数转换为对应的基本类型,例如:
public static int parseInt(String s)
:将字符串参数转换为对应的int基本类型。public static long parseLong(String s)
:将字符串参数转换为对应的long基本类型。public static double parseDouble(String s)
:将字符串参数转换为对应的double基本类型。- 方式2:字符串转换为包装类,然后可以自动拆箱为基本数据类型
public static Integer valueOf(String s)
:将字符串参数转换为对应的Integer包装类,然后可以自动拆箱为int基本类型。public static Long valueOf(String s)
:将字符串参数转换为对应的Long包装类,然后可以自动拆箱为long基本类型。public static Double valueOf(String s)
:将字符串参数转换为对应的Double包装类,然后可以自动拆箱为double基本类型。注意:如果字符串参数的内容无法正确转换为对应的基本类型,则会抛出**
java.lang.NumberFormatException
**异常。- 方式3:通过包装类的构造器实现
int a = Integer.parseInt("整数的字符串"); double d = Double.parseDouble("小数的字符串"); boolean b = Boolean.parseBoolean("true或false"); int a = Integer.valueOf("整数的字符串"); double d = Double.valueOf("小数的字符串"); boolean b = Boolean.valueOf("true或false") int i = new Integer("12");
其他方式小结:
注意,图片中红色为推荐使用。
package oop.demo16_wrapper; import org.junit.Test; public class WrapperTest1 { /* 基本数据类型、包装类 ---> String类型:1.调用String的重载的静态方法valueOf(xxx xx); 2.基本数据类型的变量 + ""; String类型 ---> 基本数据类型、包装类:基本数据类型没有方法,就只能调用包装类的静态方法parseXxx(); */ @Test public void test1(){ //方式1:调用String的重载的静态方法valueOf(xxx xx); int i = 10; String str1 = String.valueOf(i); System.out.println(str1);//"10" boolean b1 = true; Boolean b2 = b1; String str2 = String.valueOf(b2); System.out.println(str2); //方式2:基本数据类型的变量 + ""; String str4 = i + ""; String str5 = b2 + ""; } @Test public void test2(){ String s1 = "123"; int i = Integer.parseInt(s1); System.out.println(i+10);//133 String s2 = "不是true(可不分大小写)的都是false"; boolean b = Boolean.parseBoolean(s2); System.out.println(b);//false String s3 = "TrUe"; boolean b1 = Boolean.parseBoolean(s3); System.out.println(b1);//true //特别的 String s4 = "123abc"; int i1 = Integer.parseInt(s4); System.out.println(i1);//异常java.lang.NumberFormatException } }
-
例题:
题目:
利用Vector代替数组处理:从键盘读入学生成绩(以负数代表输入结束),找出最高分,并输出学生成绩等级。
提示:数组一旦创建,长度就固定不变,所以在创建数组前就需要知道它的长度。而向量类java.util.Vector可以根据需要动态伸缩。
1、创建Vector对象:Vector v = new Vector();
2、给向量添加元素:v.addElement(Object obj); //obj必须是对象
3、取出向量中的元素:Object obj = v.elementAt(0);
注意第一个元素的下标是0,返回值是Object类型的。
4、计算向量的长度:v.size();
5、若与最高分相差10分内:A等; 20分内:B等; 30分内:C等; 其他:D等
答:
package oop.demo16_wrapper.exer;
import java.util.Scanner;
import java.util.Vector;
public class ScoreTest {
public static void main(String[] args) {
//1、创建Vector对象:Vector v = new Vector();
Vector v = new Vector();
Scanner scanner = new Scanner(System.in);
int maxScore = 0;//纪录最高分
//2.从键盘获取多个学生成绩,存放到V中(以负数代表输入结束)
while (true){ //for(;;)
System.out.println("请输入学生成绩(以负数代表结束): ");
int intScore = scanner.nextInt();
if (intScore < 0){
break;
}
// //装箱:int ---> Integer对象
// Integer score = intScore;
// //添加学生成绩到容器v中
// v.addElement(score);
//jdk5.0之后 :自动装箱
v.addElement(intScore);
//3.获取学生的最大值
if (maxScore < intScore){
maxScore = intScore;
}
}
System.out.println(v.size() + "个学生的最高分为: " + maxScore);
//4.依次获取v中的每个学生成绩,与最高分进行比较,获取学生等级,并输出
for (int i = 0; i < v.size(); i++) {
Object objScore = v.elementAt(i);
//方式1:
// Integer integerScore = (Integer) objScore;
// //拆箱
// int score = integerScore.intValue();
//方式2:自动拆箱
int score = (Integer) objScore;
char grade ;
if (maxScore - score <= 10){
grade = 'A';
}else if (maxScore - score <= 20){
grade = 'B';
}else if (maxScore - score <= 30){
grade = 'C';
}else {
grade = 'D';
}
System.out.println("student " + i + " is " + score + " grade is " + grade);
}
scanner.close();
}
}
输出:
-
真题注意:
注意1:
package oop.demo16_wrapper.interview;
public class InterviewTest1 {
public static void main(String[] args) {
//说明:如果赋值的值在[-128,+127]范围内,则Integer对象使用的是IntegerCache中数组cache中的元素
Integer i = new Integer(1);
Integer j = new Integer(1);
System.out.println(i == j);//false
//底层都会调用Integer的valueOf()
Integer m = 1;//自动装箱
Integer n = 1;
System.out.println(m == n);//true
Integer x = 128;//如果在-128到127之间的数就是true
Integer y = 128;
System.out.println(x == y);//false
}
}
/*
Byte -128~127
Short -128~127
Integer -128~127
Long -128~127
Float 没有
Double 没有
Character 0~127
Boolean true和false
*/
注意2:
package oop.demo16_wrapper.interview;
public class InterviewTest2 {
public static void main(String[] args) {
//题目1:
int i = 10;
double d = 10.2;
System.out.println(i == d);//false
//题目2:
Integer i1 = 10;
Double d1 = 10.2;
//System.out.println(i1 == d1);//编译报错
//题目3:
Integer m = 1000;//自动拆箱
double n = 1000;
System.out.println(m == n);//true
//题目4:
Integer x = 1000;
int y = 1000;
System.out.println(x == y);//true
}
}
注意3:
package oop.demo16_wrapper.interview;
public class InterviewTest3 {
public static void main(String[] args) {
Object o1 = true ? new Integer(1):new Double(2.6);
System.out.println(o1);//1.0
Object o2;
if (true)
o2 = new Integer(1);
else
o2 = new Double(2.6);
System.out.println(o2);//1
}
}