Object类
类Object是类层次结构的根类,每个类都使用Objiect类作为超类(父类),所有对象(包括数组)都实现这个类的方法.
public int hashCode()返回该对象的哈希值.
hashCode()--->通过哈希算法(哈希表:hashtable)--->地址值(不是实际意义上的地址值!)
public final Class getClass()返回此Object的运行时类.
Class类方法:
1.public String getName()以String形式返回此Class对象所表示的实体(类,接口,数组类,基本 类型或void)名称
2.public String toString();返回该对象的字符串表示(建议所有子对象都重写此方法)
Interger类中有一个方法:
public static String toHaxString(int i):将一个int类型的数据转化成一个十六进制的字符串表示.
如果直接输出对象名称,想要显示当前对象变量名的值,必须重写Object类中的toString()方法.
3.public boolean equals(Object obj)指示其他某个对象是否与此对象"相等".
使用工具自动生产equals()方法:
javascript:Array对象,Number对象,String对象,velueOf():===>s1.equals(s2);比较内容是否相同.
4.protected void finalize() throws Throwable:当垃圾回收器确定不存在该对象更多引用时,有对象的垃圾回收器调用此方法,不过什么时候调用垃圾回收器,不确定.
System类中的一个 方法:
public void gc():运行垃圾回收器,这个垃圾回收器最终调用的就是finalize()方法.
5.protected Object clone() :创建并返回此对象的一个副本.
throws CloneNotSupportedException
注意事项:Object类中的clone方法执行特定的复制操作,如果此对象不能实现接口cloneable,则会抛出CloneNotSupportedException.
相关代码:
public class ObjectDemo {
public static void main(String[] args) throws CloneNotSupportedException {
Student s1=new Student();
System.out.println(s1.hashCode());
Student s2=new Student();
System.out.println(s2.hashCode());
System.out.println("hello".hashCode());
Class c1=s1.getClass();//返回Object的运行时类
System.out.println("c1:"+c1);
String name=c1.getName();//全路径名称
System.out.println("name:"+name);
System.out.println("------------------");
//创建一个学生对象
Student s3=new Student("立华奏",20);
//直接对象名称,显示成员变量的值
System.out.println("s3:"+s3);
System.out.println("toString:"+s3.toString());
//toString源码,直接输出对象名称
System.out.println(s3.getClass().getName()+"@"+Integer.toHexString(s1.hashCode()));
System.out.println("------------------");
System.out.println(s1==s2);//比较地址值
Student s4=new Student("立华奏",20);
System.out.println(s3==s4);//比较地址值
Student s5=s4;
System.out.println(s5==s4);
System.out.println(s3.equals(s4));//由于重写了Object类中的equals方法,所以比较对象内容是否相同.
System.out.println("------------------");
//复制s4这个对象
Object obj=s4.clone();//调用clone方法
//向下转型
Student s6=(Student) obj;
System.out.println(s6.getName()+"----"+s6.getAge());
}
}
public class Student extends Object{
private String name;
private int age;
public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}//自动生成.alt+shift+s->s
//重写equals方法
public boolean equals(Object obj){
if(this==obj)
return true;
if(obj==null)
return false;
if(getClass()!=obj.getClass())
return false;
Student other=(Student) obj;
if(age!=other.age)
return false;
if(name==null){
if(other.name!=null)
return false;
}else if(!name.equals(other.name))
return false;
return true;
}
//重写Object类中clone()
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
结果为:611615767
1569461427
99162322
c1:class westos.Student
name:westos.Student
------------------
s3:Student [name=立华奏, age=20]
toString:Student [name=立华奏, age=20]
westos.Student@24748417
------------------
false
false
true
true
------------------
立华奏----20
面试题:
==和equals方法区别:
==:比较的是两个对象地址值是否相等.
equals()方法默认的是两个对象的地址值比较,如果重写了Object类中的equals()方法,则比较内容是否相同.