8.面向对象――Object类
8.1 Object类的由来
在Java中,所有类都直接或间接继承Object类,即使没有在代码中加入extends Object,类还是默认继承Object类的,所以说,Object类是Java中的根类(上帝).Object类也是不断向上抽取而来的,具有所有类的共性内容.
8.1.1 Object类中常用到的方法
1,boolean equals(Object obj)方法
功能:比较两个对象,是否相等.
参数:Object类型,也就是说能接收所有的对象,实际上这里就是多态的体现,接收到的所有对象都向上转型为Object类型,所以,就不能再使用子类的特有内容,如果需要使用子类的特有内容,就需要向下转型.
此方法的内部实现细节,
由此可以看出,equals方法进行对象的比较,实际就是比较对象的引用地址是否相同.
public boolean equals(Object obj) {
return (this == obj);}
class A
{
}
public class Demo
{
public static void main(String[]args){
A a1=new A();
A a2=new A();
System.out.println(a1.equals(a2));//打印结果:false;
System.out.println(a1==a2);//打印结果:false;
}
}
注意:因为对象的比较不仅仅是比较对象的地址,比如比较对象的其他属性.所以,此方法一般都会被覆写.由其他对象来定义其特有的比较方式.
//如:Person对象,需要比较对象的姓名和年龄,如果姓名和年龄相同,就是同一个对象.
class Person extends Object//这里默认就是继承Object类的,不写的话,也是一样的.
{
private int age;
private String name;
Person(int age,String name){//定义Person类的构造函数.
this.age=age;
this.name=name;
}
public boolean equals(Object obj){//这里覆写了Object类中的
if(obj instanceof Person){//通过instanceof关键字进行程序健壮性判断.
Person p=(Person)obj;//这里使用了多态的向下转型,因为在下面代码中需要使用到子类的特有功能.所以要把Object类型向下转型为Person类型.
if(this.age==p.age&&this.name.equals(p.name))//通过if判断两个对象的年龄和姓名是否都相同。
return true;//如果if条件为真,就返回true
return false;//否则,返回false
}
throw new ClassNotMatch("类型错误!");//当健壮性判断为false时,就抛自定义的异常。
}
}
class ClassNotMatch extends RuntimeException//自定义异常
{
ClassNotMatch(){}//定义无参的构造函数.
ClassNotMatch(String message){super(message);}//定义有参构造函数,调用父类的构造函数.
}
public class Demo
{
public static void main(String[]args){
Person p1=new Person(22,"小明");//创建对象
Person p2=new Person(22,"小明");//创建对象
System.out.println(p1.equals(p2));//打印结果:true,因为p1和p2姓名,年龄相同,所以对象相等.
System.out.println(p1.equals(new Demo()));//这里因为,接收的参数不是Person类型,所以抛出异常.
}
}
从上面的代码中,Person类覆写Object类的equals方法,内部定义了对象进行年龄和姓名的特有比较方式.
2,int hashCode()方法
功能:返回对象的哈希值.
参数:无.
哈希值, 是通过将该对象的内部地址通过哈希算法转换成一个整数来实现的.通过其内部实现细节,可以看出是由本地系统来完的.
如:
public class Demo
{
public static void main(String []args){
System.out.println(new Demo().hashCode());//打印结果:14576877
}
}
总结:由此可知,内存中对象的哈希值是唯一的,同一个对象的哈希值是相同的.也就是说当对象A==对象B时,那么他们调用hashCode()方法的值也是相等的.
如:
public class Demo
{
public static void main(String []args){
Demo d1=new Demo();
Demo d2=d1;
System.out.println(d1==d2);//打印结果:true
System.out.println(d1.hashCode());//打印结果:14576877
System.out.println(d2.hashCode());//打印结果:14576877
}
}
注意:此方法一般也会被子类覆写,由子类定义其特有的功能内容.
//如:Person对象,调用的hashCode()方法时,就返回对象的年龄.
class Person //extends Object 隐式语句
{
private int age;
private String name;
Person(int age,String name){//定义Person类的构造函数.
this.age=age;
this.name=name;
}
public int hashCode(){//覆写Object类的hashCode()方法,建立Person类的特有功能内容.
return this.age;
}
}
public class Demo
{
public static void main(String[]args){
Person p1=new Person(22,"小明");//创建对象
Person p2=new Person(21,"李四");//创建对象
System.out.println(p1.hashCode());//打印结果:22
System.out.println(p2.hashCode());//打印结果:21
}
}
3,Class<?> getClass()方法
功能:返回对象所属类的子节码文件对象.
参数:无
什么是类的子节码文件对象?
Java用来描述对象的是类,那么用来描述类的类就是Class类.Class类中描述了子节码文件中的name、field、constructor、method等。通过对象调用getClass()方法,就能获取到对象所属的子节码文件的对象,也就是Class对象,通过Class类的对象,就能够获取子节码文件中的内容.这里在反射中会用到.
如:
class Person //extends Object 隐式语句
{
private int age;
private String name;
Person(int age,String name){//定义Person类的构造函数.
this.age=age;
this.name=name;
}
public int hashCode(){
return this.age;
}
}
public class Demo
{
public static void main(String[]args){
Person p1=new Person(22,"小明");//创建对象
Class cla=p1.getClass(); //对象调用getClass()方法,获取Class对象
System.out.println(cla.getName());//Class对象,调用getName()方法,获取对象所属类的名称,打印结果:Person
}
}
4.String toString()方法
功能:返回对象的字符串表示形式.
参数:无
对象在调用此方法时,会按照toString()方法内部定义形式将对象以字符串的形式打印出来.
如:getClass().getName() + '@' + Integer.toHexString(hashCode())
class Person //extends Object 隐式语句 { private int age; private String name; } public class Demo { public static void main(String[]args){ Person p=new Person(); System.out.println(p.toString());//打印结果:Person@c17164 System.out.println(p);//这里即使不调用toString()方法,默认也会调用.打印结果:Person@c17164 } }
此方法一般也会被覆写,定义对象特有的字符串形式.
Object类中的其他方法,如:notify(),notifyAll(),wait()等,在多线程中会用到。
总结:以上几个Object类的方法:equals(Object obj),hashCode(),toString()方法,一般都会被子类覆写,建立子类的特有内容.
---------------------- ASP.Net+Android+IOS开发、 .Net培训、期待与您交流! ----------------------