Java面向 对象--Object类和包装类的使用
本篇博客介绍Java面向对象中Object类和包装类的用法。
目录:
☍ Object类
▴ Object类概述
☃ Object类是所有Java类的根父类,即除Object类外所有类默认继承Object类
☃ 如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类
public class Person{
...
}
==
public class Person extends Object{
...
}
public void method(Object obj){可以接收任何类作为参数}
▴ Object类部分常用结构(方法)
No. | 方法名称 | 类型 | 描述 |
---|---|---|---|
1 | public Object() | 构造 | 构造器 |
2 | public boolean equals(Object obj) | 普通 | 对象比较 |
3 | public int hashCode() | 普通 | 获取Hash码 |
4 | public String toString() | 普通 | 对象打印时使用 |
▴ =、==与equals方法
☃ ‘=’:赋值运算符,给属性显式赋值
☃ ‘==’:比较运算符
☄ 基本类型比较值:只要两个变量的值相等(基本数据类型不一定相等),即为true
☄ 引用类型比较引用(是否指向同一个对象(地址值相同)):只有指向同一个对象时,才返回true
☄ 用“==”进行比较时,符号两边的数据类型必须兼容(可自动转换的基本数据类型除外),否则编译出错
☃ equals() :所有类都继承了Object,也就获得了equals()方法(可以重写)
☄ 只能比较引用类型,未重写时其作用与“==”相同, 比较是否指向同一个对象(地址在是否相同)
☄ Object中equals()方法的源码
public boolean equals(Object obj) {
return (this == obj);
}
☄ 格式:obj1.equals(obj2)
特例:
➥ 当用equals()方法进行比较时,对类File 、String、Date及包装类(Wrapper Class)来说 ,是比较类型及内容而不考虑引用的是否是同一个对象(在这些类中重写了equals()方法)
重写equals()方法的原则:
☃ 对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”
☃ 自反性:x.equals(x)必须返回是“true”
☃ 传递性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”
☃ 任何情况下,x.equals(null),永远返回是“false”
☃ x.equals(和x不同类型的对象)永远返回是“false”
✦ 实际开发中除特殊需求外手动重写equals方法,一般都是快捷生成(类中右键-->Soure-->Generate hashCode() and equals()...选中属性后就可自动生重写hashCode()和equals()方法,类似快捷生成setter和getter方法)
▴ ==与equals的区别
☃ == 既可以比较基本类型也可以比较引用类型。对于基本类型就是比较值,对于引用类型就是比较内存地址
☃ equals是属于java.lang.Object类中的方法,没有重写equals方法时用法相当于使用==比较引用类型,而equals也可以重写为比对象内容的方法如String,Date、File和包装类,但不要误认为equals就是比较值的方法
☃ 通常情况下,重写equals方法,会比较类中的相应属性是否都相等
▴ toString()方法
☃ toString()方法在Object类中定义,返回类名和它的引用地址
☃ 在进行String与其它类型数据的连接操作时,自动调用toString()方法
Date time = new Date();
System.out.println("time:" + time);
==
System.out.println("time:" + time.toString());
☃ 可以根据需要在用户自定义类型中重写toString()方法,如String类中重写了toStirng()方法,返回字符串的值
☃ 基本类型数据转换为String类型时,调用了对应包装类的toString()方法
☃ 可以快捷重写toString()方法,Soure-->Generate toString()...,同equals自动重写类似
int a = 10;
System.out.println("a=" + a);
☍ 包装类(Wrapper)
▴ 包装类的概述
☃ 针对八种基本数据类型定义相应的引用类型—包装类(封装类)
☃ 有了类的特点,就可以调用类中的方法,Java才是真正的面向对象
基本数据类型 | 方法名称 | 父类 |
---|---|---|
byte | Byte | Number |
short | Short | Number |
int | Integer | Number |
long | Long | Number |
float | Float | Number |
double | Double | Number |
boolean | Boolean | |
char | Character |
▴ 基本数据类型包装成包装类的实例--装箱
☃ 通过包装类的构造器实现
int i = 10;
Integer num = new Integer(i);
☃ 还可以通过字符串参数构造包装类对象
Float fNum = new Float("3.14");
Long lNum = new Long("hi"); //NumberFormatException异常
▴ 获得包装类对象中包装的基本类型变量--拆箱
☃ 调用包装类的.xxxValue()方法
Boolean bObj = new Boolean(false);
boolean b = bObj = bObj.booleanValue();
☃ JDK1.5之后,支持自动装箱,自动拆箱。但类型必须匹配。
//自动装箱
Integer integer = 1314;
System.out.println(integer.toString());
//自动拆箱
Integer num = new Integer(520);
int i = num; //520
Double dNum = new Double("5.20");
double d = dNum; //5.20
▴ 基本数据类型与字符串的转换
- 字符串转换为基本数据类型
☃ 通过包装类的构造器实现
int i = new Integer("520");
☃ 通过包装类的parseXxx(String s)静态方法
Double d = Double.parseDouble("13.14");
- 基本数据类型转换为字符串
☃ 调用字符串重载的valueOf()方法
String dStr = String.valueOf(5.20);
☃ 通过‘+""’拼接(基本数据类型+字符串结果是字符串)
String intStr = 520 + "";
- 包装类转换为字符串
☃ 包装类对象的toString()方法
Integer num = new Integer(1314);
String iStr = num.toString();
☃ 包装类toString(与包装类对应的形参)的方法
String iStr = Integer.toString(1314); //包装类是Integer,参数必须是int
字符串转换为包装类转
☃ 通过包装类构造器(字符串必须是数字或Boolean包装类时可以为true/false)
String str = "1314";
Integer i = new Integer(str);
▴ 总结:基本数据类型、包装类与String间的转换关系
▴ 包装类面试题
✎1.写出输出结果,判断结果是否相同
Object obj1 = true ? new Integer(1) : new Double(2.0);
System.out.println(obj1);
Object obj2;
if(true)
o2 = new Integer(1);
else
o2 = new Double(2.0);
♟:第一个的输出结果为1.0,第二个的输出结果为1
✣:三目运算符会将数据自动转型为一样的,int自动转型为double了
✎2.写出输出结果
public void method1() {
Integer i = new Integer(1);
Integer j = new Integer(1);
System.out.println(i == j);
Integer m = 1;
Integer n = 1;
System.out.println(m == n);
Integer x = 128;
Integer y = 128;
System.out.println(x == y);
}
♟:第一个的输出结果为false,第二个输出结果为true,第三个输出结果为false
✣:第一个为false的原因是new造的对象地址不同,Integer内部定义了IntegerCache缓存结构,在这个方法中定义了Integer[]数组,保存了-127到127范围的整数,如果使用自动装箱的方式,给Integer赋值的范围在-127~127,就会直接使用数组中的元素,就不会新new包装类对象,因此指向的都是Integer[]数组中元素的地址,所以第二个输出为true,第三个输出为false
本博客与CSDN博客༺ཌ༈君☠纤༈ད༻同步发布