MyEyes

Logging my life

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

自己学习,不喜勿喷~

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,而且你应该明白这样做带来的可能问题和复杂性。

 

 

 

 

posted on 2012-01-13 13:08  MyEyes  阅读(207)  评论(0编辑  收藏  举报