重新开始学Java——包装类

Java 是一种面向对象语言,Java 中的类把方法与数据连接在一起, 并构成了自包含式的处理单元;但是 Java 语言中却不能把基本数据类型作为对象来处理。某些场合下可能需要把基本数据类型的数据作为对象来使用,Java 必须提供一种机制, 可以把基本类型的数据转换成对象的形式。

包装类就是各种基本数据类型对应的一个 Java 类;任意一种基本类型的数据都可以转换成该类型对应的包装类类型的一个对象。

那么包装类有哪些呢?如下图:

特别要注意的就是int与char类型对应的包装类,其余的包装类都有对应的规律。

但是包装类的继承体系是有区别的。如下图所示 :

这个时候可以清楚的看到:Boolean与Character是直接继承java.lang.Object,而其他的类是继承java.lang.Number类的。

包装类的构造方法 :

8 中基本数据类型对应的包装类都没有不带参数的构造。都有接受其所对应的基本类型数据做参数的构造;除了 Character 类外,都有一个可以接受字符串做参数的构造,对于 Byte、Short、Integer、Long、Float、Double 来说,该字符串是可以解析成相应的基本类型的字符串,否则将抛出 NumberFormatException;对于Boolean 来说,字符串如果是 true(不区分大小写),则对象值为 true,否则一律为false。Float 类还有一个接收 double 类型数据做参数的构造。

	public class TestWapperClass01 {
		public static void main(String[] args) {
			// 要注意 前边的变量中存放的是地址,后边的存放的是对象
			Character c = new Character('H');// 如果括号里用双引号就是错误的
			Boolean b1 = new Boolean("hello");
			System.out.println(b1);
			Boolean b2 = new Boolean("tRUe");
			System.out.println(b2);
			Byte b = new Byte("123");// 如果参数中 传入 非数字 就会有java.lang.NumberFormatException
			System.out.println(b);
			System.out.println(b+1);// 124 ,证明b中存放的是 数字
			Short s = new Short("12345");
			System.out.println(s);
			Integer i = new Integer("9768");
			System.out.println(i);
			// 对于 Long 类型 传入构造的实参不能加 L 或 l
			Long o = new Long("1234567890");// 注意 加上 L 会出错
			System.out.println(o);
			Double d = new Double("5.890");
			System.out.println(d);
			Double dt = new Double("5.890d");
			System.out.println(d);
			Float f1 = new Float("3.14F");
			System.out.println(f1);
		}
	}

在JDK11 的情况下,可以看到这些构造都已经过时了,这里的问题放在后边描述。

包装类中常用方法: toString():一个是不带参数的实例方法( 非静态的 ),他是继承自 Object 并重写后的方法,返回该类型的对象的字符串形式。例如:

	Integer i = new Integer(“ 9876”);
	String s = i.toString();//返回引用类型变量 i 所引用的对象的字符串形式

一个是带有该类型对应基本数据类型作参数的静态的 toString 方法,这个方法可以将相应的基本数据类型的数值转换成字符串。也就是,数值转为字符串。例如:

String s = Double.toString(3.14);//3.14 是数值,结果转成了字符串类型

那么有没有一个可以快速将数值转成字符串的方式呢?

	String s = 1 + "" ;
	注意:这种形式并没有错,而这个1表示基本数据类型,后边只需要加上"" ,那么就会自动变成字符串了。

valueOf 方法: 八种都有一个带有他所对应的基本数据类型作参数的 valueOf 方法,该方法的作用是 将相应的基本数据类型的数值包装成包装类类型的对象。例如:

char ch = ‘好’;
Character c = new Character(ch);// 调用带有 char 类型参数的构造
Character c = Character.valueOf(ch);//将基本数据类型的数值转为相应的包装类类型的对象 ,在一定范围内会利用缓存,因此将来建议使用 valueOf,而不是构造方法

 除了 Character 类之外,都有一个接受 String 做参数的静态的 valueOf 方法。这个方法的作用:解析字符串为相应的基本数据类型的值后,包装成包装类类型的对象。例如:

Integer i = Integer.valueOf(“123”);

对于 Integer 和 Long 两个类,都有一个接收 String 参数和 int 参数的、静态的valueOf 方法。它可以将给定的字符串,按照指定的基数解析为整数并包装成包装类类型的对象。例如

public class TestWrapperClass03 {
	public static void main(String[] args) {
		String s = "10010";
		Integer i = Integer.valueOf(s);
		System.out.println(i.toString());
		System.out.println(i);
		// valueOf( 字符串 , 基数);基数可以是 【2,36】36是26个英文字母加上10个数字
		Integer x = Integer.valueOf(s, 2);
		System.out.println(x);
	}
}

parseXxx 方法: Character 类没有 parseChar 这样的方法;浮点数 Double 和 Float 都有对应的 parse 方法:例如

double d = Double.parseDouble(“123.5”);//字符串转成相应的基本数据类型的数值,对于浮点数可以写 D、d 或者是 F、f

所有的整数类型都有两个 parse 方法:

parseXxx(String s);//将给定字符串按照十进制进行解析,得到相应的基本数据类型的数值
parseXxx( String s,int radix);按照给定的进制解析字符串,得到相应的基本数据类型的数值
int i= Integer.parseInt(“10010”,2);//如果是 Long 类型,后边加上 L,会有异常。

Number 的子类从父类中继承的方法

byteValue() 返回当前对象所表示的 byte 类型的值
doubleValue() 返回当前对象所表示的 double 类型的值
floatValue() 返回当前对象所表示的 float 类型的值
intValue() 返回当前对象所表示的 int 类型的值
longValue() 返回当前对象所表示的 long 类型的值
shortValue() 返回当前对象所表示的 short 类型的值

例子:

/**
* 抽象类 Number
* 是 BigDecimal、BigInteger、Byte、
* Double、Float、Integer、Long 和 Short 类的父类
*/
public class TestWrapperClass4 {
	public static void main(String[] args) {
		double pi = 1231233.14159356345839;
		System.out.println(pi);// 输出pi变量存储的值
		Double d = Double.valueOf(pi);
		System.out.println(d);// 输出 引用变量d 所引用的对象的toString的返回值
		byte b = d.byteValue();// 会超出范围 byte类型范围 -128 127
		System.out.println(b);
		short s = d.shortValue();
		System.out.println(s);
		int i = d.intValue();
		System.out.println(i);
		System.out.println("二进制形式:"+Integer.toBinaryString(i));
		System.out.println("八进制形式:"+Integer.toOctalString(i));
		System.out.println("十六进制形式:"+Integer.toHexString(i));
		 System.out.println("指定进制(20):"+Integer.toString(i, 20));
		float f = d.floatValue();
		System.out.println(f);
	}
}

特点:所有的包装类都被 final 修饰的, 不允许有子类;包装类是不可变类:一个包装类的对象创建后, 其所包含的基本类型的数据就不能再改变。基本类型和包装类型混合运算:JDK 1.5 以前, 不允许 基本类型的数据跟包装类型的数据混合运算。

自动装箱与自动拆箱: 从JDK1.5开始,允许基本数据类型自动向其包装类型自动转换,那么这个就叫自动装箱;而自动拆箱恰好相反,是基本数据类型对应的包装类自动向基本数据类型进行转换。

转载于:https://my.oschina.net/lujiapeng/blog/2255794

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值