常见类Object的学习笔记

1.Object类概述

(1) Object是类层次结构的根类,所有的类都直接或者间接的继承自Object类。

(2) Object类的构造方法有一个,并且是无参构造public Object()

        子类构造方法默认访问父类的构造是无参构造

 2.Object类要掌握的方法

(1) toString():返回对象的字符串表示,默认是由类的全路径+@+哈希值的十六进制表示。

 1  package cn.itcast_02;
 2 
 3 public class Student {
 4 private String name;
 5 private int age;
 6 public Student() {
 7     super();
 8     // TODO Auto-generated constructor stub
 9 }
10 public Student(String name, int age) {
11     super();
12     this.name = name;
13     this.age = age;
14 }
15 public String getName() {
16     return name;
17 }
18 public void setName(String name) {
19     this.name = name;
20 }
21 public int getAge() {
22     return age;
23 }
24 public void setAge(int age) {
25     this.age = age;
26 }
27 @Override
28 public String toString() {
29     return "Student [name=" + name + ", age=" + age + "]";
30 }
31 
32 
33 /*
34 @Override
35 public String toString() {
36     return "姓名:"+name+",年龄:"+age;
37 }
38 */
39 }

 

 1  package cn.itcast_02;
 2 
 3 /*
 4  * public String toString():返回该对象的字符串表示。
 5  * 
 6  * Integer类下的一个静态方法:
 7  *    public static String toHexString(int i):把一个整数转成一个十六进制表示的字符串
 8  *    
 9  * 怎么重写该方法呢?
10  *  把该类的所有成员变量值组成返回即可。
11  *  重写的最终版方案就是自动生成toString()方法。
12  *  
13  *  注意:直接输出一个对象的名称,其实就是调用该对象的toString()方法。
14  */
15 public class StudentDemo {
16     public static void main(String[] args) {
17         Student s = new Student();
18         System.out.println(s.hashCode());// 366712642
19         System.out.println(s.getClass().getName());// cn.itcast_02.Student
20         System.out.println("----------------------");
21         System.out.println(s.toString());// Student [name=null, age=0]
22         System.out.println("----------------------");
23         // toString()方法的值等价于它
24         // getClass().getName()+'@'+Integer.toHexString(hashCode())
25         // this.getClass().getName()+'@'+Integer.toHexString(hashCode())
26 
27         System.out.println(s.getClass().getName() + '@' + Integer.toHexString(s.hashCode()));// cn.itcast_02.Student@15db9742
28         System.out.println(s.toString());// Student [name=null, age=0]
29 
30         // 直接输出对象的名称
31         System.out.println(s);// Student [name=null, age=0]
32     }
33 }

 

(2) equals():比较两个对象是否相同。默认情况下,比较的是地址值是否相同。

 1  package cn.itcast_03;
 2 
 3 public class Student {
 4     private String name;
 5     private int age;
 6 
 7     public Student() {
 8         super();
 9         // TODO Auto-generated constructor stub
10     }
11 
12     public Student(String name, int age) {
13         super();
14         this.name = name;
15         this.age = age;
16     }
17 
18     public String getName() {
19         return name;
20     }
21 
22     public void setName(String name) {
23         this.name = name;
24     }
25 
26     public int getAge() {
27         return age;
28     }
29 
30     public void setAge(int age) {
31         this.age = age;
32     }
33 
34 
35     @Override
36     public boolean equals(Object obj) {
37         if (this == obj)
38             return true;
39         if (obj == null)
40             return false;
41         if (getClass() != obj.getClass())
42             return false;
43         Student other = (Student) obj;
44         if (age != other.age)
45             return false;
46         if (name == null) {
47             if (other.name != null)
48                 return false;
49         } else if (!name.equals(other.name))
50             return false;
51         return true;
52     }
53 
54     //@Override
55 //    public boolean equals(Object obj) {
56 //        // return true;
57 //        // 这里改进,根据这里比较的成员变量来决定返回true还是false
58 //        // 这里其实比较的就是name和age
59 //        // 但是,name是String类型,而String的引用类型的,所以,在这里不能直接用==比较,应该用equals()比较
60 //        // String的equals()方法是重写自Object类的,比较的是字符串的内容是否相同
61 //        // this -- s1
62 //        // obj -- s2
63 //        // 我们要使用的是学生类的特有成员变量,所以要向下转型
64 //        Student s = (Student) obj;// s--obj--s2;
65 //        if (this.name.equals(s.name) && this.age == s.age) {
66 //            return true;
67 //        } else {
68 //            return false;
69 //        }
70 //    }
71     
72 //    @Override
73 //    public boolean equals(Object obj) {
74 //        //为了提高效率
75 //        if(this==obj) {
76 //            return true;
77 //        }
78 //        //为了提供程序的健壮性
79 //        //我先判断一下,obj是不是学生的一个对象,如果是,再做向下转型,如果不是,直接返回false
80 //        //这个时候,我们要判断的对象是否是某个类 的对象?
81 //        //记住一个格式:对象名 instanceof 类名
82 //        //表示:判断该对象名是否是该类名一个对象
83 //        if(!(obj instanceof Student)) {
84 //            return false;
85 //        }
86 //        //如果是就继续
87 //        Student s=(Student)obj;
88 //        return this.name.equals(s.name)&&this.age==s.age;
89 //    }
90     
91     
92 }

 

 

 1 package cn.itcast_03;
 2 
 3 /*
 4  * 看源码:
 5  * public boolean equals(Object obj){
 6  *  //this - s1
 7  *  //obj - s2
 8  *  return (this==obj)
 9  *  } 
10  */
11 public class StudentDemo {
12     public static void main(String[] args) {
13         Student s1 = new Student("林青霞", 27);
14         Student s2 = new Student("林青霞", 27);
15         System.out.println(s1 == s2);// false
16         Student s3 = s1;
17         System.out.println(s1 == s3);// true
18         System.out.println("-----------------------");
19 
20         System.out.println(s1.equals(s2));// obj=s2;
21         System.out.println(s1.equals(s1));// true
22         System.out.println(s1.equals(s3));// true
23         Student s4 = new Student("风清扬", 30);
24         System.out.println(s1.equals(s4));//false
25         
26         Demo d=new Demo();
27         System.out.println(s1.equals(d));//ClassCastException
28 
29     }
30 }
31 
32 class Demo{}

 

 

3.Object类要了解的方法

(1) hashCode():返回对象的哈希值。不是实际地址值,可以理解为地址值。

public int hashCode()

1) 返回该对象的哈希码值。默认情况下,该方法会根据对象的地址来计算。

2) 不同对象的,hashCode()一般来说不会相同。但是,同一个对象的hashCode()值肯定相同。

3) 注意:哈希值是根据哈希算法计算出来的一个值,这个值和地址值有关,但是不是实际地址值。

(2) getClass()返回对象的字节码文件对象,反射中会详细讲解。

 1  package cn.itcast_01;
 2 
 3 /*
 4  * public int hashCode():返回该对象的哈希码值。
 5  *     注意:哈希值是根据哈希算法计算出来的一个值,这个值和地址值有关,但是不是实际地址值。
 6  *     
 7  *     public final Class getClass():返回此Object的运行时类
 8  *         Class类的方法:
 9  *            public String getName():以String的形式返回此Class对象所表示的实体
10  */
11 public class StudnetTest {
12     public static void main(String[] args) {
13         Student s1 = new Student();
14         System.out.println(s1.hashCode());// 366712642366712642
15 
16         Student s2 = new Student();
17         System.out.println(s2.hashCode());// 1829164700
18 
19         Student s3 = new Student();
20         System.out.println(s3.hashCode());// 2018699554
21         System.out.println("-------------------------");
22 
23         Student s = new Student();
24         Class c = s.getClass();
25         String str = c.getName();
26         System.out.println(str);// cn.itcast_01.Student
27 
28         // 链式编程
29         String str2 = s.getClass().getName();
30         System.out.println(str2);// cn.itcast_01.Student
31 
32     }
33 
34 }

 

 

(3) finalize()用于垃圾回收,在不确定的时间。

Protected void finalize():当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。用于垃圾回收,但是什么时候不确定。

 

(4) clone()可以实现对象的克隆。

Protected Object clone():创建并返回此对象的一个副本。

此类实现了Cloneable接口,以指示Object.clone()方法可以合法地对该类实例进行按字段复制。这个接口是标记接口,告诉我们实现该接口的类就可以实现对象的复制了。

 1 package cn.itcast_04;
 2 
 3 public class Student implements Cloneable{
 4     private String name;
 5     private int age;
 6 
 7     public Student() {
 8         super();
 9         // TODO Auto-generated constructor stub
10     }
11 
12     public Student(String name, int age) {
13         super();
14         this.name = name;
15         this.age = age;
16     }
17 
18     public String getName() {
19         return name;
20     }
21 
22     public void setName(String name) {
23         this.name = name;
24     }
25 
26     public int getAge() {
27         return age;
28     }
29 
30     public void setAge(int age) {
31         this.age = age;
32     }
33 
34 
35     @Override
36     public boolean equals(Object obj) {
37         if (this == obj)
38             return true;
39         if (obj == null)
40             return false;
41         if (getClass() != obj.getClass())
42             return false;
43         Student other = (Student) obj;
44         if (age != other.age)
45             return false;
46         if (name == null) {
47             if (other.name != null)
48                 return false;
49         } else if (!name.equals(other.name))
50             return false;
51         return true;
52     }
53 
54     @Override
55     protected Object clone() throws CloneNotSupportedException {
56         return super.clone();
57     }    
58     
59 }

 

 

 1 package cn.itcast_04;
 2 
 3 public class StudentDemo {
 4     public static void main(String[] args) throws CloneNotSupportedException {
 5         //创建学生对象
 6         Student s=new Student();
 7         s.setName("林青霞");
 8         s.setAge(27);
 9         //克隆学生对象
10         Object obj=s.clone();
11         Student s2=(Student)obj;
12         System.out.println("-------------------");
13         
14         System.out.println(s.getName()+"---"+s.getAge());
15         System.out.println(s2.getName()+"---"+s2.getAge());
16         
17         //以前的做法
18         Student s3=s;
19         System.out.println(s3.getName()+"---"+s3.getAge());
20         System.out.println("-------------------");
21         
22         //其实是有区别的
23         s3.setName("刘意");
24         s3.setAge(30);
25         System.out.println(s.getName()+"---"+s.getAge());
26         System.out.println(s2.getName()+"---"+s2.getAge());
27         System.out.println(s3.getName()+"---"+s3.getAge());
28     }
29 }

 

 

4.两个注意问题:

(1) 直接输出一个对象名称,其实默认调用了该对象的toString()方法。

(2) 面试题:==和equals()的区别?

1) ==

基本类型:比较的是值是否相同

引用类型:比较的是地址值是否相同

2) equals()

只能比较引用类型。默认情况下,比较的是地址值是否相同。

但是,我们可以根据自己的需要重写该方法。

 

posted @ 2020-03-29 19:23  reeddeming  阅读(134)  评论(0编辑  收藏  举报
Live2D