Object 作为超类
Object是类层次结构的根类,所有的类都直接或者间接的继承自Object类。
Object类的构造方法有一个,并且是无参构造,
这其实就是理解当时我们说过,子类构造方法默认访问父类的构造是无参构造
hashCode()和getClass()方法(了解)
-
Object:类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。
-
每个类都直接或者间接的继承自Object类。
-
Object类的方法:
-
public int hashCode():返回该对象的哈希码值。
-
注意:哈希值是根据哈希算法计算出来的一个值,这个值和地址值有关,但是不是实际地址值。
-
你可以理解为地址值。
-
public final Class getClass():返回此 Object 的运行时类
-
Class类的方法:
-
public String getName():以 String 的形式返回此 Class 对象所表示的实体
<span style="color: #008000;">*/
<span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> StudentTest {
<span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void<span style="color: #000000;"> main(String[] args) {
Student s1 = <span style="color: #0000ff;">new<span style="color: #000000;"> Student();
System.out.println(s1.hashCode()); <span style="color: #008000;">//<span style="color: #008000;"> 11299397
Student s2 = <span style="color: #0000ff;">new<span style="color: #000000;"> Student();
System.out.println(s2.hashCode());<span style="color: #008000;">//<span style="color: #008000;"> 24446859
Student s3 =<span style="color: #000000;"> s1;
System.out.println(s3.hashCode()); <span style="color: #008000;">//<span style="color: #008000;"> 11299397
System.out.println("-----------"<span style="color: #000000;">);Student s </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Student(); Class c </span>=<span style="color: #000000;"> s.getClass(); System.out.println(c);</span><span style="color: #008000;">//</span><span style="color: #008000;">class cn.itcast_01.Student</span> String str =<span style="color: #000000;"> c.getName(); System.out.println(str); </span><span style="color: #008000;">//</span><span style="color: #008000;"> cn.itcast_01.Student </span><span style="color: #008000;">//</span><span style="color: #008000;">链式编程</span> String str2 =<span style="color: #000000;"> s.getClass().getName(); System.out.println(str2);
}
}
toString()方法
-
public String toString():返回该对象的字符串表示。
-
Integer类下的一个静态方法:
-
public static String toHexString(int i):把一个整数转成一个十六进制表示的字符串
-
这个信息的组成我们讲解完毕了,但是这个信息是没有任何意义的。所以,建议所有子类都重写该方法。
-
怎么重写呢?
-
把该类的所有成员变量值组成返回即可。
-
注意:
-
<span style="color: #ff0000;">直接输出一个对象的名称,其实就是调用该对象的toString()方法。
<span style="color: #008000;">*/
<span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> StudentDemo {
<span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void<span style="color: #000000;"> main(String[] args) {
<span style="color: #ff0000;">Student s <span style="color: #ff0000;">= new<span style="color: #000000;"><span style="color: #ff0000;"> Student();
System.out.println(s.hashCode());
System.out.println(s.getClass());
System.out.println(s.getClass().getName());
System.out.println("--------------------"<span style="color: #000000;">);
System.out.println(s.toString());<span style="color: #008000;">//<span style="color: #008000;"> cn.itcast_02.Student@42552c
System.out.println("--------------------"<span style="color: #000000;">);
<span style="color: #008000;">//<span style="color: #008000;"> toString()方法的值等价于它
<span style="color: #008000;">//<span style="color: #008000;"> getClass().getName() + '@' + Integer.toHexString(hashCode())
<span style="color: #008000;">//<span style="color: #008000;"> this.getClass().getName()+'@'+Integer.toHexString(this.hashCode())</span><span style="color: #008000;">//</span><span style="color: #008000;"> cn.itcast_02.Student@42552c </span><span style="color: #008000;">//</span><span style="color: #008000;"> cn.itcast_02.Student@42552c</span>
<span style="color: #000000;">
System.out.println(s.getClass().getName() + '@'
+<span style="color: #000000;"> Integer.toHexString(s.hashCode()));System.out.println(s.toString());</span><span style="color: #008000;">//</span><span style="color: #008000;">Student [name=null,age=0] </span><span style="color: #008000;">//</span><span style="color: #008000;"> 直接<a href="/tag/shuchu/" target="_blank" class="keywords">输出</a>对象的<a href="/tag/mingcheng/" target="_blank" class="keywords">名称</a></span>
<span style="color: #000000;"> System.out.println(s);<span style="color: #ff0000;">//Student [name=null,age=0],直接输出对象名称就是调用重写后的toString()方法
重写toString()方法
<span style="color: #0000ff;">private<span style="color: #000000;"> String name;
<span style="color: #0000ff;">private <span style="color: #0000ff;">int<span style="color: #000000;"> age;
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Student() {
</span><span style="color: #0000ff;">super</span><span style="color: #000000;">();
}
</span><span style="color: #0000ff;">public</span> Student(String name,<span style="color: #0000ff;">int</span><span style="color: #000000;"> age) {
</span><span style="color: #0000ff;">super</span><span style="color: #000000;">();
</span><span style="color: #0000ff;">this</span>.name =<span style="color: #000000;"> name;
</span><span style="color: #0000ff;">this</span>.age =<span style="color: #000000;"> age;
}
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String getName() {
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> name;
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setName(String name) {
</span><span style="color: #0000ff;">this</span>.name =<span style="color: #000000;"> name;
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getAge() {
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> age;
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> setAge(<span style="color: #0000ff;">int</span><span style="color: #000000;"> age) {
</span><span style="color: #0000ff;">this</span>.age =<span style="color: #000000;"> age;
}
<span style="color: #ff0000;"> @Override
<span style="color: #ff0000;">public String toString() {
return "Student [name=" + name + ",age=" + age + "]"<span style="color: #000000;"><span style="color: #ff0000;">;
}
}
快捷方法,右击source-->toString()
equals()方法
快捷方法,右击source-->equals()
-
public boolean equals(Object obj):指示其他某个对象是否与此对象“相等”。
-
怎么重写呢?
-
一般都是用来比较对象的成员变量值是否相同。
-
重写的代码优化:提高效率,提高程序的健壮性。
-
最终版:
-
看源码:
-
public boolean equals(Object obj) {
-
//this - s1
-
//obj - s2
-
return (this == obj);
-
}
-
==:
-
基本类型:比较的就是值是否相同
-
引用类型:比较的就是地址值是否相同
-
equals:
-
引用类型:默认情况下,比较的是地址值。
-
不过,我们可以根据情况自己重写该方法。一般重写都是自动生成,比较对象的成员变量值是否相同
<span style="color: #008000;">*/
<span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> StudentDemo {
<span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void<span style="color: #000000;"> main(String[] args) {
Student s1 = <span style="color: #0000ff;">new Student("林青霞",27<span style="color: #000000;">);
Student s2 = <span style="color: #0000ff;">new Student("林青霞",27<span style="color: #000000;">);
System.out.println(s1 == s2); <span style="color: #008000;">//<span style="color: #008000;"> false
Student s3 =<span style="color: #000000;"> s1;
System.out.println(s1 == s3);<span style="color: #008000;">//<span style="color: #008000;"> true
System.out.println("---------------"<span style="color: #000000;">);System.out.println(s1.equals(s2)); </span><span style="color: #008000;">//</span><span style="color: #008000;"> obj = s2; </span><span style="color: #008000;">//</span><span style="color: #008000;">false</span> System.out.println(s1.equals(s1)); <span style="color: #008000;">//</span><span style="color: #008000;"> true</span> System.out.println(s1.equals(s3)); <span style="color: #008000;">//</span><span style="color: #008000;"> true</span> Student s4 = <span style="color: #0000ff;">new</span> Student("风清扬",30<span style="color: #000000;">); System.out.println(s1.equals(s4)); </span><span style="color: #008000;">//</span><span style="color: #008000;">false</span>
<span style="color: #000000;">
Demo d = <span style="color: #0000ff;">new<span style="color: #000000;"> Demo();
System.out.println(s1.equals(d));}
}
<span style="color: #0000ff;">class Demo {}
finalize()和clone()方法,了解
-
protected void finalize():当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。用于垃圾回收,但是什么时候回收不确定。
-
protected Object clone():创建并返回此对象的一个副本。
-
A:重写该方法
-
<span style="color: #ff0000;"> Cloneable:此类实现了 Cloneable 接口,以指示 Object.clone() 方法可以合法地对该类实例进行按字段复制。
-
这个接口是标记接口,告诉我们实现该接口的类就可以实现对象的复制了。
-
让被克隆的类实现该接口,才可以克隆
<span style="color: #008000;">*/
<span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> StudentDemo {
<span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void main(String[] args) <span style="color: #0000ff;">throws<span style="color: #000000;"> CloneNotSupportedException {
<span style="color: #008000;">//<span style="color: #008000;">创建学生对象
Student s = <span style="color: #0000ff;">new<span style="color: #000000;"> Student();
s.setName("林青霞"<span style="color: #000000;">);
s.setAge(27<span style="color: #000000;">);<span style="color: #ff0000;">//克隆学生对象
Object obj = s.clone();
Student s2 =<span style="color: #000000;"><span style="color: #ff0000;"> (Student)obj;
System.out.println("---------"<span style="color: #000000;">);System.out.println(s.getName()+"---"+<span style="color: #000000;">s.getAge());
System.out.println(s2.getName()+"---"+<span style="color: #000000;">s2.getAge());<span style="color: #008000;">//<span style="color: #008000;">以前的做法
Student s3 =<span style="color: #000000;"> s;
System.out.println(s3.getName()+"---"+<span style="color: #000000;">s3.getAge());
System.out.println("---------"<span style="color: #000000;">);<span style="color: #ff0000;">//其实是有区别的,克隆出来的,和原来的没关系;两个引用,改动其中一个,另一个也会变
s3.setName("刘意"<span style="color: #000000;">);
s3.setAge(30<span style="color: #000000;">);
System.out.println(s.getName()+"---"+<span style="color: #000000;">s.getAge());
System.out.println(s2.getName()+"---"+<span style="color: #000000;">s2.getAge());
System.out.println(s3.getName()+"---"+<span style="color: #000000;">s3.getAge());
}
}
protected Object clone():创建并返回此对象的一个副本。
* A:重写该方法
Cloneable:此类实现了 Cloneable 接口,以指示 Object.clone() 方法可以合法地对该类实例进行按字段复制。
* 这个接口是标记接口,告诉我们实现该接口的类就可以实现对象的复制了。
* 让被克隆的类实现该接口,才可以克隆
<span style="color: #0000ff;">private<span style="color: #000000;"> String name;
<span style="color: #0000ff;">private <span style="color: #0000ff;">int<span style="color: #000000;"> age;
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Student() {
</span><span style="color: #0000ff;">super</span><span style="color: #000000;">();
}
</span><span style="color: #0000ff;">public</span> Student(String name,<span style="color: #0000ff;">int</span><span style="color: #000000;"> age) {
</span><span style="color: #0000ff;">super</span><span style="color: #000000;">();
</span><span style="color: #0000ff;">this</span>.name =<span style="color: #000000;"> name;
</span><span style="color: #0000ff;">this</span>.age =<span style="color: #000000;"> age;
}
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String getName() {
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> name;
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setName(String name) {
</span><span style="color: #0000ff;">this</span>.name =<span style="color: #000000;"> name;
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getAge() {
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> age;
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> setAge(<span style="color: #0000ff;">int</span><span style="color: #000000;"> age) {
</span><span style="color: #0000ff;">this</span>.age =<span style="color: #000000;"> age;
}
<span style="color: #ff0000;">@Override
</span></span><span style="color: #ff0000;">protected Object clone() throws CloneNotSupportedException {
return super</span><span style="color: #000000;"><span style="color: #ff0000;">.clone();
}</span>
}