面向对象——Object类

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

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类中描述了子节码文件中的namefieldconstructormethod等。通过对象调用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培训、期待与您交流! ----------------------
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值