linkin大话面向对象--包装类

时间:2023-10-16 14:12:20

Java提倡的万物皆对象,但是数据类型的划分出现了基本数据类型和引用数据类型,那么我们怎么能把基本数据类型称为对象呢?

基本数据类型

包装类

byte

Byte

short

Short

int

Integer

long

Long

char

Character

float

Float

double

Double

boolean

Boolean

除了Integer和Character定义的名称和对应的基本类型差异大,其他六种都是将首字母大写就可以了。

Integer,Byte,Float,Double,Short,Long都是Number类的子类。Character和Boolean都是Object直接子类。8个类都是final修饰的(不可被继承)。



基本数据类型 → 包装类:通过对应包装类的构造方法实现。除了Character外,其他包装类都可以传入一个字符串参数构建包装类对象。

包装类 → 基本数据类型:包装类的实例方法xxxValue();    // xxx表示包装类对应的基本数据类型。例如:

Integer i = new Integer(3);
int i2 = i.intValue();
  • jdk1.5开始出现的特性:

自动装箱:可把一个基本类型变量直接赋给对应的包装类对象或则Object对象

自动拆箱:允许把 包装类对象直接赋给对应的基本数据类型。例如:

Integer i = 3;//装箱
int i2 = i;//拆箱

String → 基本类型,除了Character外所有的包装类提供parseXxx(String s)静态方法,用于把一个特定的字符串转换成基本类型变量;

基本类型 → String,String 类有静态方法valueOf(),用于将基本类型的变量转换成String类型。其实这种不怎么常用的,至少我从来不这么写,将基本类型变量和""进行连接运算,系统会自动将基本类型变量转换成字符串。例如:

String str = "LinkinPark";
int i = Integer.parseInt(str);//String --> 基本类型
String s1 = String.valueOf(i);//基本类型 --> String
String s2 = i+"";



包装类使用的还是挺多的,在写javabean的时候,实体里面的属性定义最好都定义成包装类,因为这样子可以明确的区分是这些属性作为基本数据类型的默认值和null值。要是使用基本数据类型,在做实体的模糊查找的时候经常遇见问题的。举个例子:我现在要对Person类的int类型的sex属性做模糊查找,其中0表示男,1表示女,查询时这个属性可能有,可能没有,要是基本类型的话,没有的话也是默认值0,表示男的话也是0,那么这样子问题就出现了。但是要是使用包装类来定义属性的话,就不会出现这个问题,没有就是null,有的话就是其他的属性。。。

  • 最后来了解一下应用在包装类上面的一个设计模式:享元模式

享元模式是一直简单的设计模式,是指对于很多个小的对象,它们有很多的相同点,就可以把它们看做是同一个对象,对于那些不同的地方可以做为方法的参数进行导入,对于相同的地方可以作为它的内部属性,这样就大大减少了对象的数量。如Integer类型的对象就使用了享元模式设计。说白了,个人就是单例差不多的,对象存在的话就用,不存在的话就new一个出来,然后放在缓存池中,方便以后来抓。看下面代码:

package linkin;

/**
*
* @version 1L
* @author LinkinPark
* @since 2014-12-15
* @motto 梦似烟花心似水,同学少年不言情
* @desc ^包装类中的享元模式(其实字符串池也是这个意思)
* 这里需要注意的是:这个享元模式只是用来拆包和装包的是才会共享一个数据,要是我们自己new一个对象的出来的话,地址肯定是不同的。
*/
public class Linkin
{
/*
*
*/
public static void main(String[] args)
{
Integer a1 = 12;
Integer a2 = 12;
System.out.println(a1 == a2);//true Integer a11 = Integer.valueOf(12);
Integer a22 = Integer.valueOf(12);
System.out.println(a11 == a22);//true Integer a111 = new Integer(12);
Integer a222 = new Integer(12);
System.out.println(a111 == a222);//false //下面数字太大,超过了Integer的范围
Integer a3 = 129;
Integer a4 = 129;
System.out.println(a3 == a4);//false String str1 = "LinkinPark...";
String str2 = "LinkinPark...";
System.out.println(str1 == str2);//true
}
}