一. 包装类
1. 把基本数据类型变量包装成包装类实例是通过对应包装类的构造器来实现的
//通过构造器把bl基本类型变量包装成包装类对象
boolean bl = true;
Boolean blObj = new Boolean(bl);
//通过构造器把it基本类型变量包装成包装类对象
int it = 5;
Interget inObj = new Interget(it);
// 把一个字符串转换成float对象
Float fl = new Float("4.56");
// 把一个字符串转换成Boolean对象
Boolean bObj = new Boolean("false");
2. 如果希望获得包装类对象中包装的基本类型变量,则可以使用包装类提供的 xxxValue()方法
//取出Boolean对象里的boolean变量
boolean bb = bObj.booleanValue();
//取出Integer对象里的int变量
int i = itObj.intValue();
//取出Float对象里的float变量
float f = fl.floatValue();
上面两个程序可以看出,基本类型变量和包装类对象之间的转换如下图:
3.自动装箱和自动拆箱
所谓自动装箱,就是可以 把一个基本类型变量直接赋给对应的包装类变量。
自动拆箱,允许直接 把包装类对象直接赋给一个对应的基本类型变量。
// 直接把一个基本类型变量赋给Integer对象
Integer inObj = 5;
// 直接把一个boolean类型变量赋给一个Object类型的变量
Object boolObj = true;
// 直接把一个Integer对象赋给int类型的变量
int it = inObj;
if (boolObj instanceof Boolean)
{
// 先把Object对象强制类型转换为Boolean类型,再赋给boolean变量
boolean b = (Boolean)boolObj;
System.out.println(b);
}
4. 包装类实现基本类型变量和字符串之间的转换
图:
a. 把字符串类型的值转换为基本类型有两种方式:
利用包装类提供的 parseXxx(String s)静态方法。
利用包装类提供的 Xxx(String s)构造器。
// 把一个特定字符串转换成int变量
String intStr = "123";
int it1 = Integer.parseInt(intStr);
int it2 = new Integer(intStr);
System.out.println(it2);
// 把一个特定字符串转换成float变量
String floatStr = "4.56";
float ft1 = Float.parseFloat(floatStr);
float ft2 = new Float(floatStr);
System.out.println(ft2);
b. String类提供了多 个重载valueOf()方法,用于将基本类型变量转换成字符串
// 把一个float变量转换成String变量
String ftStr = String.valueOf(2.345f);
System.out.println(ftStr);
// 把一个double变量转换成String变量
String dbStr = String.valueOf(3.344);
System.out.println(dbStr);
// 把一个boolean变量转换成String变量
String boolStr = String.valueOf(true);
System.out.println(boolStr.toUpperCase());
c. 还有一种更简单的方法:将基本类型变量和""进行连接运算,系统会自动把基本类型变量转换成字符串
//intStr的值为"5"
String intStr = 5 + "";
二. == 和equals 比较运算符
1. == 运算符
当使用==判断两个变量是否相等时,如果是基本类型变量,就按变量的值来判断。
但对于两个引用类型的变量,则它们必须指向同一个对象才会返回true。
int it = 65;
float fl = 65.0f;
System.out.println("65和65.0f是否相等?" + (it == fl));// 将输出true
char ch = 'A';
System.out.println("65和'A'是否相等?" + (it == ch));// 将输出true
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println("str1和str2是否相等?" + (str1 == str2));// 将输出false
System.out.println("str1是否equals str2?" + (str1.equals(str2)));// 将输出true
// 由于java.lang.String与EqualTest类没有继承关系,
// 所以下面语句导致编译错误
// System.out.println("hello" == new EqualTest());
上例中,str1和str2都是引用类型变量,它们分别指向两个String对象,因此str1和str2两个变量不相等。
上例中,String已经重写了Object的equals()方法,只判断两个字符串序列相同,所以输出true。
2. equals
equals方法是Object类提供的一个实例方法,它允许 用户提供自定义的相等规则。
// 定义一个Person类
class Person
{
// 重写equals()方法,提供自定义的相等标准
public boolean equals(Object obj)
{
// 不加判断,总是返回true,即Person对象与任何对象都相等
return true;
}
}
// 定义一个Dog空类
class Dog{}
public class OverrideEqualsError
{
public static void main(String[] args)
{
Person p = new Person();
System.out.println("Person对象是否equals Dog对象?" + p.equals(new Dog()));
System.out.println("Person对象是否equals String对象?" + p.equals(new String("Hello")));
}
}
总结一下:
==:要求两个引用变量指向同一个对象才会返回 true。
equals:方法则允许用户提供自定义的相等规则。
Object 类提供的equals方法判断两个对象相等的标准与==完全相同,因此开发者通常需要重写equals方法。