11-02 Java Object类使用详解

前端之家收集整理的这篇文章主要介绍了11-02 Java Object类使用详解前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

 Object 作为超类

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

Object类的构造方法有一个,并且是无参构造,
这其实就是理解当时我们说过,子类构造方法默认访问父类的构造是无参构造

hashCode()和getClass()方法了解

<span style="color: #008000;">/*<span style="color: #008000;">

  • 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;"&gt;new</span><span style="color: #000000;"&gt; Student();
     Class c </span>=<span style="color: #000000;"&gt; s.getClass();
     System.out.println(c);</span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;class cn.itcast_01.Student</span>
     String str =<span style="color: #000000;"&gt; c.getName();
     System.out.println(str); </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; cn.itcast_01.Student
    
     </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;链式编程</span>
     String str2  =<span style="color: #000000;"&gt; s.getClass().getName();
     System.out.println(str2);

    }

}

toString()方法

<span style="color: #008000;">/*<span style="color: #008000;">

  • public String toString():返回该对象的字符串表示。

  • Integer类下的一个静态方法

  • public static String toHexString(int i):把一个整数转成一个十六进制表示的字符串

  • 这个信息的组成我们讲解完毕了,但是这个信息是没有任何意义的。所以,建议所有子类都重写该方法

  • 怎么重写呢?

  • 把该类的所有成员变量值组成返回即可。

  • 重写的最终版方案就是自动生成toString()方法

  • 注意:

  • <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;"&gt;//</span><span style="color: #008000;"&gt; cn.itcast_02.Student@42552c
     </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 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;"&gt;//</span><span style="color: #008000;"&gt;Student [name=null,age=0]
    
     </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 直接<a href="https://www.jb51.cc/tag/shuchu/" target="_blank" class="keywords">输出</a>对象的<a href="https://www.jb51.cc/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;">public <span style="color: #0000ff;">class<span style="color: #000000;"> Student {
<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;"&gt;public</span><span style="color: #000000;"&gt; Student() {
    </span><span style="color: #0000ff;"&gt;super</span><span style="color: #000000;"&gt;();
}

</span><span style="color: #0000ff;"&gt;public</span> Student(String name,<span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; age) {
    </span><span style="color: #0000ff;"&gt;super</span><span style="color: #000000;"&gt;();
    </span><span style="color: #0000ff;"&gt;this</span>.name =<span style="color: #000000;"&gt; name;
    </span><span style="color: #0000ff;"&gt;this</span>.age =<span style="color: #000000;"&gt; age;
}

</span><span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; String getName() {
    </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; name;
}

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; setName(String name) {
    </span><span style="color: #0000ff;"&gt;this</span>.name =<span style="color: #000000;"&gt; name;
}

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; getAge() {
    </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; age;
}

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span> setAge(<span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; age) {
    </span><span style="color: #0000ff;"&gt;this</span>.age =<span style="color: #000000;"&gt; 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()

<span style="color: #008000;">/*<span style="color: #008000;">

  • 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;"&gt;//</span><span style="color: #008000;"&gt; obj = s2; </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;false</span>
     System.out.println(s1.equals(s1)); <span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; true</span>
     System.out.println(s1.equals(s3)); <span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; true</span>
     Student s4 = <span style="color: #0000ff;"&gt;new</span> Student("风清扬",30<span style="color: #000000;"&gt;);
     System.out.println(s1.equals(s4)); </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;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()方法,了解

<span style="color: #008000;">/*<span style="color: #008000;">

  • 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;">public <span style="color: #0000ff;">class Student <span style="color: #ff0000;">implements<span style="color: #000000;"><span style="color: #ff0000;"> Cloneable {
<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;"&gt;public</span><span style="color: #000000;"&gt; Student() {
    </span><span style="color: #0000ff;"&gt;super</span><span style="color: #000000;"&gt;();
}

</span><span style="color: #0000ff;"&gt;public</span> Student(String name,<span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; age) {
    </span><span style="color: #0000ff;"&gt;super</span><span style="color: #000000;"&gt;();
    </span><span style="color: #0000ff;"&gt;this</span>.name =<span style="color: #000000;"&gt; name;
    </span><span style="color: #0000ff;"&gt;this</span>.age =<span style="color: #000000;"&gt; age;
}

</span><span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; String getName() {
    </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; name;
}

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; setName(String name) {
    </span><span style="color: #0000ff;"&gt;this</span>.name =<span style="color: #000000;"&gt; name;
}

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; getAge() {
    </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; age;
}

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span> setAge(<span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; age) {
    </span><span style="color: #0000ff;"&gt;this</span>.age =<span style="color: #000000;"&gt; age;
}

<span style="color: #ff0000;"&gt;@Override
</span></span><span style="color: #ff0000;"&gt;protected Object clone() throws CloneNotSupportedException {
    return super</span><span style="color: #000000;"&gt;<span style="color: #ff0000;"&gt;.clone();
}</span>

}

 

原文链接:https://www.f2er.com/java/403337.html

猜你在找的Java相关文章