toString()方法

原始实现:

 public String toString()
{
return getClass().getName() + "@" + Integer.toHexString(hashCode()); //类名+@+对象的hash值的十六进制
}

hashCode()和equals()方法

方法:

  • public boolean equals(Object obj);
  • public int hashCode();

默认规则:

  • 如果两个引用变量引用的是不同对象,则hash值不同,equals返回false。
  • 如果两个引用变量引用的是同一个对象,则hash值相同,equals返回true。

建议:

  • 要么同时实现equals和hashCode方法,要么都不要实现。
  • 在eclipse中可以自动实现,【source】->【generate hashcode() and equals()】。

如果一个类不实现equals和hashCode方法,会有坏处:

  对于类似 HashSet 的hash数据结构(比如HashSet<Person> set = new HashSet<Person>(),其中 Person 是自己实现的类),在HashSet中加入new Person("A")、new Person("B")。
如果想要查找是否存在一个名叫"A"的人,则需要:

set.contains(new Person("A"));                   //返回false

我们希望他返回true,因为确实存在一个名叫A的人,但是实际返回的是 false。因为contains(Person p) 的运行规则是:

  1. 执行 p.hashCode()找到正确的桶。
  2. 对于那个桶中的每个元素b,执行p.equals(b),如果有一个返回true,则contains方法返回true,否则返回false。

因为查找的对象和在HashSet中的对象的hash值不同,因此根本找不到对应的桶。

clone()方法和Cloneable接口

方法:

  • protected native Object clone() throws CloneNotSupportedException;

从上面的方法中可以看出:

  • 该方法并没有方法体,而是声明为native,表示这是本地方法。
  • protected: 这个方法只有在同一个包或者子类中才能够调用。
  • 函数返回的是Object,因此每次调用clone后需要强制类型转换。

因此下面的代码并不能编译通过:

String s1 = "hello";
String s2 = (String)s1.clone(); // Compile Error

不能编译通过的原因:

  • String类定义在java.lang包中。
  • String类没有实现cloneable接口。
  • 此代码所在包和String类在不同的包中。

注意点:

  • 虽然Cloneable接口只是一个标识接口,但是只有实现了Cloneable接口,才表示这个类是可复制的。
  • 如果定义了一个类A,此类没有重写clone方法,则 类A的对象a调用clone方法时,编译错误。
  • 如果定义了一个类A,此类直接重写clone方法, 而不实现Cloneable接口,则类A的对象a调用clone方法时,会抛出:CloneNotSupportedException。
  • 默认clone方法实现的是浅层复制,而不是深层复制。
  • 在重写clone方法时,建议先执行super.clone()方法。

深层复制和浅层复制

浅层复制: 被复制的对象的所有成员属性都有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅层复制仅仅复制所考虑的对象,而不复制它所引用的对象。

文字的表述不是很清晰,下面用图示来解释:

如果想实现深层复制也可以通过串行化来实现(将对象写入字节流,再从字节流读出)。

下面的代码演示了深层复制和浅层复制的实现:

 public class Object05
{
public static void main(String[] args) throws Exception{
A a1 = new A(10);
B b1 = new B(a1);
B b2 = (B)b1.clone();
b1.a.age = 20;
System.out.println(b2.a.age); //输出:10,改变b1并不会改变b2 A a2 = new A(10);
C c1 = new C(a2);
C c2 = (C)c1.clone();
c1.a.age = 30;
System.out.println(c2.a.age); //输出30,改变c1会改变c2 }
}
class B implements Cloneable
{
A a;
public B(A a)
{
this.a = a;
}
public Object clone()throws CloneNotSupportedException //深层复制
{
B b = (B)super.clone();
b.a = (A)this.a.clone();
return b;
}
}
class C implements Cloneable
{
A a;
public C(A a)
{
this.a = a;
}
public Object clone()throws CloneNotSupportedException //浅层复制
{
return super.clone();
}
}
class A implements Cloneable
{
int age;
public A(int age)
{
this.age = age;
}
public Object clone()throws CloneNotSupportedException
{
return super.clone();
}
}

finalize()方法

此方法是由垃圾回收器调用的,当垃圾回收器决定回收对象a时,则会调用a的finalize方法。

getClass()方法

此方法主要用于反射,下面的例子简单的介绍了这个方法的应用:

 import java.lang.reflect.Field;
public class Object06
{
public static void main(String[] args) {
Class c = new Person().getClass();
System.out.println("类名:"+c.getName());
Field[] fs = c.getDeclaredFields();
System.out.print("字段名:");
for(Field f:fs)
{
System.out.print(f.getName()+",");
}
}
}
class Person
{
private String name;
private int age;
}

Java知识点:Object类的更多相关文章

  1. Java面向对象 Object类 内部类

     Java面向对象 Object类    内部类 知识概要:                 一:Object类                 二:内部类 匿名内部类的写法 1.Object O ...

  2. Java之Object类和常用的API

    Object类和常用的API 学习过程中的笔记,涉及到Objetc中的equals方法和toString方法,日期类Date,日历类Calendar,日期格式化类SimpleDateFormat以及基 ...

  3. Java中Object类hashCode的底层实现

    Java中Object类hashCode的底层实现 openjdk\jdk\src\share\native\java\lang\Object.c 42 static JNINativeMethod ...

  4. Java 之 Object 类

    一.Object 概述  java.lang.Object 类是 Java 语言中的根类,即所有类的父类. 在对象实例化的时候,最终找的父类就是 Object. 如果一个类没有特别指定父类,那么默认则 ...

  5. Java之Object类用法总结

    Object类概述: 1.Object类是所有Java类的根父类. 2.如果在类的声明中未使用extends关键字指明其父类, 则默认父类为java.lang.Object类. Object类主要结构 ...

  6. java.lang.Object类与equals()及toString()的使用

    1.Object类是所有Java类的根父类 2.如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类 3.Object类中的功能(属性.方法)就具有通用 ...

  7. java之Object类介绍

    1.Object类是所有java类的基类 如果在类的声明中未使用extends关键字指明其基类,则默认基类为Object类,ex: public class Person{ ~~~~~ } 等价于 p ...

  8. 【Java基础之Object类(一)】Java中Object类中的所有方法(toString、equals、hashCode、clone、finalize、wait和notify等)详解(转载)

    java中的hashcode.equals和toString方法都是基类Object的方法. 首先说说toString方法,简单的总结了下API说明就是:返回该对象的字符串表示,信息应该是简明但易于读 ...

  9. JDK1.8源码(一)——java.lang.Object类

    本系列博客将对JDK1.8版本的相关类从源码层次进行介绍,JDK8的下载地址. 首先介绍JDK中所有类的基类——java.lang.Object. Object 类属于 java.lang 包,此包下 ...

  10. 浅析Java的Object类

    前言:   最近在回顾Java基础,在此过程中,查看源码是少不了的   这里以JDK8以基准,记录一些自己查看源码的观感 Object类,翻阅源码,看看这个类的所在位置,是在 java.lang 包下 ...

随机推荐

  1. 2877: [Noi2012]魔幻棋盘 - BZOJ

    DescriptionInput 第一行为两个正整数N,M,表示棋盘的大小. 第二行为两个正整数X,Y,表示棋盘守护者的位置. 第三行仅有一个正整数T,表示棋盘守护者将进行次操作. 接下来N行,每行有 ...

  2. ios 框架学习笔记

    ios主要的系统层次: 一.Cocoa Touch 层:创建应用程序主要使用的框架. 1.关键技术: AirDrop:实现应用间通信. Text Kit:处理文本和排版. UIKit Dynamics ...

  3. jsp的<%@ include file="jsp/common.jsp" %>报错误Duplicate local variable basePath

    将公共引入的文件放到common.jsp中,其他页面引入该jsp即可使用 <%@ page language="java" import="java.util.*& ...

  4. 首次push本地代码到github上出现的问题及解决方案

    刚创建的github版本库,在push代码时出错: $ git push -u origin masterTo git@github.com:******/Demo.git ! [rejected] ...

  5. httpsClient

    Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且 ...

  6. hdu 3336 Count the string(思维可水过,KMP)

    题目 以下不是KMP算法—— 以下是kiki告诉我的方法,好厉害的思维—— 就是巧用标记,先标记第一个出现的所有位置,然后一遍遍从标记的位置往下找. #include<stdio.h> # ...

  7. Ubuntu环境下nutch2.2.1集成HBase0.94.25

    nutch2.2.1集成HBase0.94.25 (详见:http://duguyiren3476.iteye.com/blog/2085973 ) 1. 修改nutch的hbase配置 //将自己的 ...

  8. Floodlight中的临时流表

    运行Floodlight,在Mininet中新建一个拓扑之后,并未添加相关的流表项,但是主机之间却可以相互通信.执行pingall操作,任意两个主机之间都能通.相当于没有任何路由表的路由器,它是怎么让 ...

  9. MQTT客户端与服务代理的案列

    服务端,采用 Mosquitto 来转发分发消息. 客户端自己写. 服务端 启动 mosquitto (底下的命令是我自己放到环境变量里面的,通过alias 运行mosquitto) Ishallbe ...

  10. NOIP 2015提高组复赛

    神奇的幻方 题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第 ...