【Java基础知识总结】继承(二)Object类与自动装箱自动拆箱

(一)object类

Object 类是Java中所有类的父类,所有类都是由Object类派生而来,但在定义类是并不需要特意写出。如果没有明确地指出超类,Object 就被认为是这个类的超类,可以使用 Object 类型的变量引用任何类型的对象。

1.equals方法

Object 类中的 equals 方法用于检测一个对象是否等于另外一个对象。在 Object 类中,这个方法将判断两个对象是否具有相同的引用。如果两个对象具有相同的引用, 它们一定是相等的。
而在实际情况中,我们通常判定的是两个对象中的相对应的变量是否相同,这就需要自己覆写equals方法。

一般情况下,覆写equals方法时,有四个步骤:
1.如果引用相等,返回真
2.如果引用为空,返回假
3.如果不是同一种类型,返回假
4.最后返回每个变量的比较值,使用==比较基本数据类型,使用equals比较引用数据类型

public class Employee
public boolean equals(Object otherObject) {
	if (this == otherObject) 
	return true; 
	if (otherObject == null)
	return false; 
	if (getClassO != otherObject.getClass())
	return false; 
	Employee other = (Employee) otherObject; 
	return name.equals(other.name) && salary = other.salary:

2.hashCode方法

散列码( hash code ) 是由对象导出的一个整型值。散列码是没有规律的,如果 x 和 y 是两个不同的对象,x.hashCode( ) 与 y.hashCode( ) 基本上不会相同,这是由于 hashCode方法定义在 Object 类中, 因此每个对象都有一个默认的散列码,其值为对象的存储地址。如果重新定义 equals方法,就必须重新定义 hashCode 方法, 以便用户可以将对象插人到散列表中。

equals 与 hashCode 的定义必须一致:如果 x.equals(y) 返回 true, 那么 x.hashCode( ) 就必须与 y.hashCode( ) 具有相同的值

3.tostring方法

在 Object 中还有一个重要的方法, 就是 toString方法, 它用于返回表示对象值的字符串。绝大多数(但不是全部)的 toString方法都遵循这样的格式:类的名字,随后是一对方括号括起来的域值。当然,设计子类的程序员也应该定义自己的 toString 方法,并将子类域的描述添加进去。

public String toStringO
{
return getClass().getName() + "[name:" + name + ",salary:" + salary ;
}

(二)自动装箱与自动拆箱

有时, 需要将 int 这样的基本类型转换为对象。 所有的基本类型都有一个与之对应的类。通常, 这些类称为包装器 ( wrapper )。对象包装器类是不可变的,即一旦构造了包装器,就不允许更改包装在其中的值。同时, 对象包装器类还是 final , 因此不能定义它们的子类。

假设想定义一个整型数组列表。而尖括号中的类型参数不允许是基本类型,也就是说,不允许写成 ArrayList。这里就用到了 Integer 对象包装器类。我们可以声明一个 Integer对象的数组列表。
ArrayList<Integer> list = new ArrayList<>();

由于每个值分别包装在对象中, 所以 ArrayList 的效率远远低于 int[ ] 数 组。

当然,有一个很有用的特性从而更加便于添加 int 类型的元素到 ArrayLisKlntege>中。即list.add(3)将自动的转变为list.add(Integer.valueOf(3))这种变换就被称为“自动装箱

相反地, 当将一个 Integer 对象赋给一个 int 值时, 将会进行自动拆箱。也就是说,编译器将下列语句:int n = list.get(i);翻译成int n = list.get(i).intValue();

而甚至在算术表达式中也能够自动装箱和拆箱,例如,可以将自增操作符应用于一个包装器引用:Integer n = 3; n++;编译器将自动地插人一条对象拆箱的指令, 然后进行自增计算, 最后再将结果装箱。

要注意的是,包装类虽然是可以使用==运算符,但比较的还是两个引用是否在一个内存单元。所以两个包装类对象比较需要调用equals方法。

发布了62 篇原创文章 · 获赞 28 · 访问量 6071

猜你喜欢

转载自blog.csdn.net/Moo_Lavender/article/details/102806361
今日推荐