自己学习,不喜勿喷~
1.使用多态优于instanceof,当遇到从父类向子类转型时,可以使用instanceof,例如:
Vector类可以容纳以 java.lang.Object(或其派生类)为类别的任何元素,但是从Vector中取得的元素都是以java.lang.Object类型返回的。因此从Vector中取得的元素都需要向下转型为该对象原本属于的类。
2. 一旦不再需要对象的引用,则将它设置为null
一旦程序不再引用某个对象,GC就会回收这个对象所拥有的内存。我们可以手动的设置该引用为null,方便GC回收。
为了尽量降低内存用量,与程序同寿的对象必须尽可能体积小。此外,大块头对象应该[速生速灭]。
3.引用类型和基本类型
int a = 5; //基本类型
Integer j = new Integer(10); //引用类型
首先,这两个变量都存储在局部变量表,他们的操作都在java操作数堆栈中进行,但基本类型i和引用类型j虽然在堆栈中都占据32bits的空间,但引用类型记录的不是对象的本身,而是对象的引用(所有java对象都是通过引用访问的--所谓的引用就是某种指针,该指针指向heap中的某个空间,heap中才是对象真实的存储场所)
4. == 和equals()的区别
==判断的是两个基本类型是否完全相同,或者说两个对象引用是否指向了同一个对象。而equals仅仅判断的是对象的实值内容是否相等。
5. 使用equals()需要注意
i - 若要比较对象是否相等,其class需要实现一个正确的equals()方法。
ii - 在调用class的equals()方法时,需要首先确保class已经提供了equals方法
iii - 如果没有提供equals方法,需要确保java.lang.Object中的equals方法是否可以胜任
iiii - 如果都没有,必须自己提供一个可以用来比较两个对象的equals方法
6. 如果需要自己实现equals方法,需要注意
i - 首先判断两个对象是否指向同一个对象。 if (this == obj) return true;
ii - 优先使用getClass() : 如果两个类属于不同的class或者type,则两个对象肯定不相等。
getClass()获得的是某个对象运行期的类 -- 即已经向下转型过 [个人见解]
class Roll {
public boolean equals(Object obj){
if (this == obj) { //判断是否为同一个对象
return true;
}
if (obj != null && getClass() == obj.getClass()){ // 首先判断非空,再比较getClass(),避免空指针
//比较相关重要属性
}
return false;
}
}
iii - 调用super.equals()来唤醒父类的相关行为
为一个类实现了equals方法,必须检查该类的父类(如果该类有父类的话)是否有equals方法,如果有,在该类的equals方法中,需首先调用父类的equals方法 super.equals(),确保父类继承下来的属性的一致性
iiii - equals函数中使用instanceof()
instanceof的意思是 is-a,例如car is a 交通工具,反之不成立,需要注意位置
总体来说有如下规则:
如果某个class 的两个对象即使占据不同的内存空间,也可被视为[逻辑上相等]的话,那么你得为这个class 提供一个equals()。
请检查是否等于this
比较这个class 中的相关属性(值域,fields),以判断两个对象是否相等
如果有java.lang.Object 以外的任何base class 实现了equals(), 那么就应该调用super.equals()。
在equals()函数中面对getClass()和instanceof 进行取舍时,你要仔细斟酌以下问题:
如果只允许同一个class 所产生的对象被视为相等,则通常使用getClass()
只有在不得不[对子类对象与父类对象进行比较]的场合中,才使用instanceof,而且你应该明白这样做带来的可能问题和复杂性。