Object是JDK类库的根类,所有类都直接或间接继承了Object,下面简要介绍Object类中常用的的几个方法:String toString():将对象转化成字符串形式,boolean equal():判断两个对象是否相等,protected Object clone():负责对象克隆,int hashCode():获取对象哈希值,protected void finalize():垃圾回收器调用...
toString()
要点
1、源代码长什么样?
public String toString(){
return this.getClass().getName() + "@" + Integer.toHexString (hashcode());
}
源代码上toString()方法的默认实现是:返回对象的字符串表示形式:
类名@对象的内存地址转换为十六进制的形式
2、建议所有的子类都重写toString()方法,返回你想要的字符串
3、System.out.println(引用)输出引用时会自动调用该引用的toString()方法
4、String类中默认覆写toString()方法,返回String类对象的内容。
5、idea可以直接生成toString()方法(覆写过)
equals()
要点
1、equals方法的源代码
public boolean equals(Object obj){
return (this==obj);
}
源代码上equals()方法的默认实现是:
比较两对象的内存地址是否相等("=="比较的是内存地址)
2、一般equals()方法会被覆写,用来比较两对象的内容是否相等。
3、基本数据类型用"=="来比较是否相等,引用数据类型用equal()方法来比较是否相等,"=="比较的是内存地址是否相等。
4、String类默认覆写equals()方法,比较String类对象的内容是否相同,判断字符串是否相等最好不要用"==",要调用字符串对象的equals方法。
5、equals()方法的覆写要彻底。
当覆写A类的equals()方法要调用B类的equals()方法,那么B类的equals()方法也要被覆写。
建议所有类的equals()方法都覆写。
6、idea可以直接生成equal()方法(覆写过)
实例
class MyTime{//extends Object{
int year;
int month;
int day;
public MyTime(){}
public MyTime(int year,int month,int day){
this.year=year;
this.month=month;
this.day=day;
}
//默认的equals方法
/*
public boolean equals(Object obj){
return (this==obj);
}
*/
//覆写equals()方法
public boolean equals(Object obj){
//如果this和obj保存的内存地址相同则它两指向的堆内存的对象肯定是一个,直接返回true
if(this==obj){return true;}
//如果obj是空或obj不是MyTime类的,返回false。
if(obj==null || !(obj instanceof MyTime)){return false;}
//程序执行到此说明obj不是null是MyTime类型
//obj向下转型为MyTime类
MyTime t = (MyTime)obj;
//返回this和obj的内容是否相同
return this.year == t.year && this.month == t.month && this.day =t.day ;
}
finalize()
要点
1、在Object类中的源代码:
protected void finalize() throws Throwable{ }
GC:负责调用finalize()方法。
2、finalize()方法不需要程序员手动调用,JVM的垃圾回收器负责调用这个方法。
finalize()只需要重写,重写完将来自动会有程序来调用。
3、finalize() 方法的执行时机:
当一个java对象即将被垃圾回收器回收的时候,垃圾回收器负责调用
4、finalize()方法实际上是SUN公司为java程序员准备的一个时机,垃圾销毁时机。
如果希望在对象销毁时机执行一段代码的话,这段代码要写到finalize()方法当中。
5、静态代码块的作用是什么?
static {...}
静态代码块在类加载时刻执行,并且只执行一次。
这是一个SUN准备的类加载时机。
6、java中的垃圾回收器不是轻易启动的,拉圾太少,或者时间没到,种种条件下,有可能启动,也有可能不启动。
实例
public class Test{
public static void main (String[] args){
/*
//创建对象
Person p=new Person();
//怎么把Person对象变成垃圾?
p=null;
*/
//多造点垃圾
/*
for(int i=0;i< 100000000;i++){
Person p = new Person();
p = null;
}
*/
for(int i=0;i<1000;i++){
Person p = new Person();
p=null;
//有一段代码可以建议垃圾回收器启动。
System.gc();//建议启动垃圾回收器。(只是建议,可能不启动,也可能启动。启动的概率较大
}
}
}
//项目开发中有这样的业务需求:所有对象在JVM中被释放的时候,请记录一下释放时间!!!
//记录对象被释放的时间点,这个负责记录的代码写到哪里?写到finalize()方法中
class Person{
//重写finalize()方法
//Person类型的对象被垃圾回收器回收的时候,垃圾回收器负责调用:p.finalize();
protected void finalize()throws Throwable{
//this代表当前对象
System.out.println (this +"即将被销毁!");
}
}
hashCode()
要点
1、在Object中的hashCode方法源码是怎样的?
public native int hashcode();
这个方法不是抽象方法,带有native关键字,底层调用c++程序。
2、hashCode()方法返回的是哈希码:
实际上就是一个java对象的内存地址,经过哈希算法,得出的一个值。
不多讲,以后再说,查文档看详细用法。