Java面向对象 包装类

先引入单元测试方法的使用:
在这里插入图片描述

包装类

Java提供了八种基本数据类型对应的包装类,使基本数据类型的变量具有类的特征。
在这里插入图片描述基本类型、包装类与String类间的转换:
①基本数据类型转换为包装类

package com.atguigu.java;

import org.junit.Test;

public class WrapperTest {
	//基本数据类型-->包装类:调用包装类的构造器
	@Test
	public void test1(){
		int num1=10;
//		System.out.println(num1.toString); 行不通,num1为一基本数据类型数据,没有类的一些方法
		//可以先转换为一包装类
		Integer in1 = new Integer(num1); //此处调用包装类的构造器将基本数据类型-->包装类
		System.out.println(in1.toString());  //10。Integer属于包装类,而包装类中重写了toString()方法,因此显示实体内容,
		
		Integer in2 = new Integer("123");
		System.out.println(in2.toString());  //123。
		
//		Integer in3= new Integer("123abc");
//		System.out.println(in3.toString());  //出错。Integer类型,如果想用String型的形参,则里面需要是一个纯粹的数如“123”才能转
		
		Float f1=new Float(12.3f);
		Float f2=new Float(12.3);
		System.out.println(f1);    //12.3。
		//当我们输出一个对象的引用时,实际上调用的是当前对象的toString()方法。而包装类中重写了Object类中的toString()方法,所以输出“实体内容”。
		System.out.println(f1.toString());   //12.3
		System.out.println("*************");
		//Boolean型比较特别
		Boolean b1=new Boolean(true);  
		System.out.println(b1);   //true 
		Boolean b2=new Boolean("true"); 
		System.out.println(b2); //true
		Boolean b3=new Boolean("true123"); 
		System.out.println(b3); //false
		Boolean b4=new Boolean("TrUe");
		System.out.println(b4); //true。Boolean型较特殊进行过优化,忽略大小写
		
		Order order =new Order();
		System.out.println(order.isMale); //false。基本数据类型--布尔型默认初始化值。
		System.out.println(order.isFemale); //null。此处为类的默认初始化值
	}
}
class Order{
	boolean isMale;
	Boolean isFemale;
}

②包装类转化为基本数据类型

package com.atguigu.java;

import org.junit.Test;

public class WrapperTest {
	//包装类-->基本数据类型(由于类的对象无法像基本数据类型一样进行加减乘除运算,所以此转换就有必要性):调用包装类的xxxvalue()
		@Test
		public void test2(){
			Integer in1=new Integer(12);  //包装类对象in1
			int i1 = in1.intValue();  //Integer就调用intValue()方法
			//此时i1即为int类型
			System.out.println(i1+1); //13
			
			Float f1=new Float(12.3);
			float f2 = f1.floatValue();
			System.out.println(f2+1); //13.3
			
		}
}

在这里插入图片描述
jdk5.0加入的一个新特性:自动装箱与自动拆箱

package com.atguigu.java;
import org.junit.Test;

public class WrapperTest {
	@Test
	public void test(){
		int num1=10;
		//基本数据类型(int)转换为包装类对象(Integer)
		//Integer间接继承于Object,这样就可以以多态 的方式往里放(包装类对象加减乘除不切实际)
		method(num1); //10。但此时把num1放进去,编译运行不报错。这就是新特性:“自动装箱和自动拆箱”的作用
	}
	
	public void method(Object obj){
		System.out.println(obj);
	}
}

自动装箱与自动拆箱的使用:

package com.atguigu.java;
import org.junit.Test;
/*jdk5.0新特性:自动装箱与自动拆箱*/
public class WrapperTest {
	@Test
	public void test(){	
		//自动装箱:基本数据类型-->包装类
		int num2=10;
		Integer in1 =num2; //自动装箱。int型变量赋给一个类,可以不用调用包装类的构造器。
		 
		boolean b1=true;
		Boolean b2=b1;  //自动装箱
		
		//自动拆箱:包装类-->基本数据类型
		System.out.println(in1.toString());  //10。in1是一个包装类对象,而包装类重写了toString()方法---显示内容
		//把in1转换为基本数据类型
		int num3=in1; //包装类对象赋给基本数据类型
		System.out.println(num3+1); //11	
	}
}

③基本数据类型、包装类<---->String之间的转换:

package com.atguigu.java;
import org.junit.Test;
public class WrapperTest {
	@Test
	public void test1(){	
		//基本数据类型和包装类--->String类型
		int num1=10;
		//String str1=num1;//报错:基本数据类型和String之间没有自动类型提升
		//方式一:连接运算
		String str1=num1+"";  //可行
		//方式二:调用String重载的valueOf(Xxx xxx),基本数据类型和包装类都可以用valueOf()方法
		float f1=12.3f;  //基本数据类型
		String str2 = String.valueOf(f1);  //返回String类型"12.3"
		System.out.println(str2); //"12.3"
		
		Double d1=new Double(12.4);  //调用包装类的构造器,此处d1为包装类对象
		String str3 = String.valueOf(d1);	 //自动拆箱
		System.out.println(str3);  //"12.4"	
	}
	
	@Test
	public void test2(){
		//String类型--->基本数据类型、包装类  :调用包装类的parseXxx(String s)
		String str1="123";  //str1若为"123a"会出错
		int num2 = Integer.parseInt(str1);  //返回int型
		System.out.println(num2+1); //124
		
		String str2="true";  //str2若为"true1"结果为false
		boolean b1 = Boolean.parseBoolean(str2);
		System.out.println(b1);  //true
	}
}


在这里插入图片描述在这里插入图片描述

包装类使用相关面试题:

在这里插入图片描述

package com.atguigu.java;

import org.junit.Test;

public class InterviewTest {
	@Test
	public void test1(){
		Object o1 = true ? new Integer(1) : new Double(2.0);//特别注意三元运算符。此处涉及自动类型提升。要求三元运算符中“:”两边的数据能统一为一个类型,否则编译不会通过
		System.out.println(o1);//1.0

	}
	@Test
	public void test2(){
		Object o2;
		if (true)
			o2 = new Integer(1);
		else
			o2 = new Double(2.0);
		System.out.println(o2);//1
		
	}
}

在这里插入图片描述



在这里插入图片描述

package com.atguigu.java;

import org.junit.Test;

public class InterviewTest {
	@Test
	public void test3() {
		Integer i = new Integer(1);
		Integer j = new Integer(1);
		System.out.println(i == j); //false。==比较地址值
		/*知识点:Integer内部定义了IntegerCach结构,IntegerCach中定义了Integer[],保存了从-128~127内的整数,
		 如果我们使用自动装箱的方式,给Integer赋值的范围在-128~127内时,可以直接使用数组中的元素,不用再new了。
		 目的:提高效率*/
		Integer m = 1;//自动装箱
		Integer n = 1;
		System.out.println(m == n);// true。二者地址值相同,都是数组中1的位置
		Integer x = 128;   //相当于new了一个Integer对象
		Integer y = 128;   //相当于new了一个Integer对象
		System.out.println(x == y);// false
		}
}

在这里插入图片描述
③通过这道题体会为什么引入包装类
在这里插入图片描述

package com.atguigu.java;
import java.util.Scanner;
import java.util.Vector;
public class ScoreTest {
	public static void main(String[] args) {
		//1,实例化Scanner,用于从键盘获取学生成绩
		Scanner scan =new Scanner(System.in); //ctrl+shift+o导包
		//2,创建Vector对象
		Vector v=new Vector(); 
		//3,通过for(;;)或while(true)方式,给Vector中添加数据;输入负数时,跳出循环。
		int maxScore=0;
		for(;;){
			System.out.println("请输入学生成绩(输入负数时结束):");
			int score=scan.nextInt(); 
			if(score<0){  //输入负数时,跳出循环。
				break;
			}
			if(score>100){
				System.out.println("输入数据非法,请重新输入");
				continue;
			}
			//走到这一步说明数据合法(0-100),添加数据到Vector中	
//			//jdk5.0之前
//			Integer inScore = new Integer(score);
//			v.addElement(inScore);  //多态 
			//jdk5.0之后
			v.addElement(score);  //自动装箱
			//4,获取学生成绩的最大值(写循环里面,每次从键盘获取一个学生成绩时,就跟现有的最高分比较一下)
			if(maxScore<score){
				maxScore=score; //重新赋一下值
			}
		}
		//5,遍历Vector,得到每个学生的成绩,并与最大成绩比较,得到每个学生的等级。
		char level=0;
		for(int i=0;i<v.size();i++){
			Object obj=v.elementAt(i);  //此时获取的是对象
			//jdk5.0之前
//			Integer inScore=(Integer)obj; //强转
//			int score=inScore.intValue(); //转化成基本数据类型。因为Integer仍然不能比较
			//jdk5.0之后
			int score=(int)obj; //直接这样写是可以的
			if(maxScore-score<=10){
				level='A';
			}else if(maxScore-score<=20){
				level='B';
			}else if(maxScore-score<=30){
				level='C';
			}else {
				level='D';
			}
			System.out.println("student-"+i+" score is "+score+",level is "+ level);
		}
		

	}
}

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

过期动态

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值