JAVA封装类,数据类型转换

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/rxl2017/article/details/84072431

封装类
上篇文章我主要介绍了JAVA的基础数据类型,那么,JAVA作为面向对象的语言,自然也可以以JAVA基础数据类型为对象进行封装了,简单的说就是把基础数据类型作为核心为它们添加各种方法以便我们进行使用。

1.首先,八种基本数据类型分别是:int、short、float、double、long、boolean、byte、char;

它们的封装类分别是:Integer、Short、Float、Double、Long、Boolean、Byte、Character。

数据类型 包 装 类 字节长度 默 认 值
int Integer 4 0
short Short 2 0
long Long 8 0l或0L
byte Byte 1 0
float Float 4 0.0F或0.0f
double Double 8 0.0
char Character 2 u0000
boolean Boolean 1 false

我们都知道,在JAVA中,基本数据类型是存储于空间较小的线性结构的栈中,而对象存储要分成两个部分,对象的引用存储于栈,而对象本身则存储于堆中,其空间结构图如下图所示在这里插入图片描述
那么我们使用封装类进行比较或者计算的时候需要把值再导回基础数据类型么?
当然是不用了,Java在jdk1.5之后推出的一个新特性:自动拆装箱。 意思很简单,你需要什么它就自动为你转换成什么,如下面的代码:

package base_data;

public class Packaging_data {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Integer a = 123;
		Integer b = 123;
		int c = 123;
		System.out.println((a == b));// true

		System.out.println((a == c));// true

		int i = a + b;
		int j = a + c;

		System.out.println("i=" + i + "j=" + j);// i=246j=246
		Integer d = 129;
		Integer e = 129;
		int f = 129;
		System.out.println((d == e));// false
		System.out.println((d == f));// true
	}

}

其中我们发现,倒数第二个结果为FALSE,这是为什么呢?这还得从我们自动装箱和拆箱的原理说起,当JAVA进行自动装箱和拆箱时,其实是隐式的调用了ValueOf方法,拿Integer封装类举例,Integer有一个静态方法valueOf(int i),当自动装箱触发时,编译器会自动补充调用该方法的代码。而通过查看Integer类的源码可知,在static静态代码块中,系统把-128-127之间的整数自动装箱成Integer实例,并且缓存在一个名为cache的数组中。当你把一个-128-127之间的整数自动装箱成Integer实例时,实际上是直接指向对应的数组元素,因此-128-127之间的相同的整数自动装箱成Integer实例时,永远都是引用cache数组中的同一个元素,所以它们全部相等。所以下面的代码返回true。但是如果当valueOf(int i) 中的i不在-128-127的范围之内即便是两个值相同的i,自动装箱成Integer实例以后,==比较的结果将会是false。因为如果i不在缓存值范围内,则会new出新的对象,这时即使i的值相等,也会new出两个对象,==比较自然是false。所以呢,如果是比较两个包装类之间的值的话,最好使用equals()方法,这样就不会出错。
有些面试题会考到这些,比如上面的代码,问你哪些为TRUE哪些为FALSE,又或者像这样:"String s = new String(“abc”)创建了几个对象?"答案是两个,其原理与上面介绍Integer的原理相差不多。让我们来看看下面的代码

	String a = new String("abc");
		String b = "abc";
		String c = "abc";
		System.out.println((a==b));//false
		
		System.out.println((c==b));//true

首先我们要明白两个概念,引用变量和对象,对象一般通过new在堆中创建,s只是一个引用变量。
所有的字符串都是String对象,由于字符串文字的大量使用,java中为了节省时间,在编译阶段,会把字符串文字放在文字池中,文字池的一个好处就是可以把相同的字符串合并,占用一个空间,我们可以用==判断一下两个引用变量是否指向了一个地址即一个对象

数据类型转换

数据类型转换是我们在开发中经常遇到的问题,比如网页回传一个字符串,里面装着数字例如“91”,你可能需要对数值进行处理,计算或者比较,然后回传给网页或者数据库,可以看看下面这个例子

package base_data;

public class DataType_convert {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String s = "91";

		short a = Short.parseShort(s); // 包装类自带的方法,能将字符串转化本类的数据类型

		a += 5;// 等同于 a = a + 5;但是整数在JAVA中实际表现为int类型,所以 a = a + 5实际等同于 a = a +
				// (int)5,
				// 根据JAVA隐式转换的规则,short类型数据小于int类型,则会在运算中将short
				// a将数值提取出来,作为int类型进行计算
				// 所以如果是 a = a + 5 在编译器看来就是 (short)a = (int)a + (int)
				// 5;,所以预编译时会报错,而 a += 5 则相当于 (short)a = (short)((int)a + (int)
				// 5)
				// 运行通过,如果要用另一种形式则需要 a = (short)(a + 5)才不会报错

		System.out.println(a);// 96

		float b = 3.4f; // 和上面的类似,JAVA中小数默认为双精度类型也就是double类型,如果要表现为单精度需要在小数后面加f,如果进行运算,其运算规则也与上面大致相同

		b += 3.5;

		System.out.println(b);// 6.9

		int i = (int) a;

		s = String.valueOf(i);// String包装类自带的将其他数据类型转换为字符串的方法,支持转换
		// valueOf(int i)
		// valueOf(boalean b)
		// valueOf(char c) ,valueOf(char[] c)
		// valueOf(float f)
		// valueOf(double d)
		// valueOf(long l)
		// valueOf(Object o)

		System.out.println(s);//96
	}

}

`

猜你喜欢

转载自blog.csdn.net/rxl2017/article/details/84072431