1.Object概述: 类Object是类层次结构的根类。每个类都使用Object作为超类。所有对象(包括数组)都实现这个类的方法。

2.构造方法详细信息:

    Object只有一个无参构造方法,因为object中没有属性

     public Object()

3.常用成员方法:

    protected Object clone()
    boolean equals(Object obj)
    protected void finalize()
    Class<?> getClass()
    int hashCode()
    String toString()


public final Class getClass():
  从final看出子类不能被重写, 任何一个对象它的 getClass() 行为是一致。
  返回值是 Object 的运行时类型。返回值类型是Class: 类类型

    Class概述:Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注解是一种接口。

    Class类中有一个public String getName():返回该对象的运行时类的全限定名(包名.类名)。可以在得到getClass的方法返回值Class类的时候通过getName获取当前正在运行的类名。

例如:

 package com.cskaoyan.object;
public class ObjectDemo_02 {
public static void main(String[] args){
Object obj=new Object();
Class cl1=obj.getClass();
String name1=cl1.getName();
System.out.println("name1 = " + name1);//name1 = java.lang.Object
System.out.println("------------------------------------------" );
Object obj2=new Student();
Class cl2=obj2.getClass();
String name2=cl2.getName();
System.out.println("name2 = " + name2);//name2 = com.cskaoyan.object.Student }
}

public int hashCode():

  返回该对象的哈希码值。
  默认实现:这一般是通过将该对象的  内部地址 转换  成一个整数来实现的

hashcode()的常规协定:
1) 一致性. 如果一个对象进行比较的信息没有发生修改,那么在一次程序运行期间,它们的hash值要一致。
2) 相等性. 如果两个对象通过 equals 比较是相等的,那么它们的 hashcode 也要相等。
3) 哈希碰撞概率低. 如果两个对象不相等,那么它们的 hashcode 最好不相等,这个可以提高哈希 表的性能。


哈希码值相关知识:

哈希方程:哈希函数可以把任意长度的输入数据映射成一个固定长度的输出结果,返回值就为哈希码值

*MD4是麻省理工学院教授Ronald Rivest于1990年设计的一种信息摘要算法。它是一种用来测试信息完整性的密码散列函数的实行。其摘要长度为128位。这个算法影响了后来的算法如MD5SHA家族RIPEMD等。

*MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。

*SHA家族:安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。

一些常用的哈希算法:


public String toString(): 建议所有子类都重写此方法。
    返回该对象的字符串表示。结果应是一个简明但易于读懂的信息表达式。
    默认实现:return getClass().getName() + "@" + Integer.toHexString(hashCode());

例如:

 public class ObjectDemo_04 {
public static void main(String[] args) {
Object obj=new Object();
String s=obj.toString();
System.out.println("s = " + s);//s = java.lang.Object@1540e19d
System.out.println(obj);//java.lang.Object@1540e19d
}
}

注意:直接打印对象,会默认调用toString()方法。


public boolean equals(Object obj):
    指示其他某个对象是否与此对象"相等"。
    默认实现: return (this == obj); 判断两个对象的地址值是否相等 (是否是同一个对象)

分两种情况判断是否需要重写equals()方法:

实体类:
  一个对象对应一个实体。没有必要重写 Object 中的 equals();
值类:
  例如:String, Point(成员变量为为横坐标和纵坐标),因为在现实生活中这种类型的类,当值都相同就可以看作同一个对象,所以需要重写 equals 方法。

值类重写方法需要将关键域进行比较:
  例如:Rectangle(长方形类):
        关键域:length, width
        衍生域:area, perimeter
        无关域:color
        根据关键域进行比较

Point类重写equals()方法例如:

   @Override
//注意,因为是重写Object类的equals方法,所以参数列表不能改变,还应该是Object object
public boolean equals(Object object){
if(object instanceof Point){
Point point=(Point) object;
return x==point.x&&y==point.y;
}
}
}

equals方法常规协定:
equals 方法在非空对象引用上实现相等关系:
  自反性:对于任何非空引用值 x,x.equals(x) 都应返回true。
  对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回true时,x.equals(y)才应返回  true。
  传递性:对于任何非空引 用值 x、y 和 z,如果x.equals(y)返回 true,并且y.equals(z)返回   true,那么 x.equals(z) 应返回 true。
  一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
  非空性:对于任何非空引用值 x,x.equals(null) 都应返回 false。

注意事项:当此方法被重写时,通常有必要重写hashCode方法,并协定相等对象,都要有相同的哈希码。

用比较的元素作为根据来写hashCode方法。

使用idea生成的equals方法有一个缺陷,子类和父类进行比较的时候,返回值为false违反了里氏替换原则(凡是能够使用父类的地方都可以它的子类替换)。


protected void finalize() throws Throwable
概述:当垃圾回收器回收这个对象时,会自动调用此方法。子类重写 finalize 方法,以释放资源。
默认实现:什么都没做,空实现。

finalize:
1. 可以自己调用, 该对象没有被回收。
2. 当垃圾回收器回收这个对象时,会自动调用此方法。
3. 释放资源最好不要放在 finalize() 里面。为什么?

  原因是:垃圾回收线程是一个优先级低的线程,当一个对象变成垃圾后,并不会马上被回 收,因此资源得不到立刻释放。

    怎么释放资源呢?
      try ... catch ... finally(异常处理)语句释放资源


protected Object clone() throws CloneNotSupportedException
  概述:创建并返回此对象的一个"副本".

这个方法是protected修饰的,只有类在同一个包中才能使用,而Object在lang包下,所以我们想要调用这个方法就必须去重写这个方法。

但是如果重写得方法不实现Cloneable 接口则会报出异常:CloneNotSupportedException。

  Cloneable(空接口, 标记接口):
    此类实现了 Cloneable 接口,以指示 Object.clone() 方法可以合法地对该类实例进行按字段复制。
    如果在没有实现 Cloneable 接口的实例上调用 Object 的 clone 方法,则会导致抛出CloneNotSupportedException异常。
    一个接口没有定义任何内容,叫做空接口,在Java中往往起标记作用。

浅拷贝和深拷贝:

  浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝。

  深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。

深拷贝和浅拷贝的应用场景:  

    1.对于基本数据类型我们不需要考虑浅拷贝和深拷贝,使用等号便可复制值。

    2.对于复合数据类型使用等号属于浅拷贝,仅复制该字段值,如数组则复制地址,这个时候需要考虑是否使用需要深拷贝。

 

Java的默认实现是浅拷贝和深拷贝?
    浅拷贝

举例:

 public class ObjectDemo7 {
public static void main(String[] args) throws CloneNotSupportedException {
// Object obj = new Object();
// obj.clone();
Student s1 = new Student("Henson_z", 18);
Student s2 = s1.clone();
// System.out.println(s1.equals(s2));
// System.out.println(s2);
// System.out.println(s1 == s2);
System.out.println(s1.getName().equals(s2.getName())); // true
System.out.println(s1.getName() == s2.getName()); // false
}
}

因为name 是String类型的是引用变量,从 System.out.println(s1.getName() == s2.getName()); // false中可以看出s1和s2的name是指向同一个变量的,所以java中的拷贝为浅拷贝

在java中怎么实现深拷贝?

  对引用数据类型,创建一个新的对象,并复制其内容。

举例:(单层关系的深拷贝)

//在Student重写clone()方法时,name属于String类型的成员变量,如果直接调用super.clone()(即Object类的clone方法)方法进行复制,只进行了浅拷贝
//所以对于name成员变量要创建一个新的对象,并复制内容
protected Student clone() throws CloneNotSupportedException {
Student s = (Student) super.clone();
s.name = new String(name);
return s;
}

举例:(多层关系的深拷贝)

 package com.cskaoyan.object;
/*
对 FirstLevel 实现深拷贝。
分析:
1. 实现 cloneable 接口
2. 重写 clone 方法。
*/
public class FirstLevel implements Cloneable{
int a;
SecondLevel secondLevel; @Override
protected FirstLevel clone() throws CloneNotSupportedException {
// return super.clone();
FirstLevel fl = (FirstLevel) super.clone();
// 对 SecondLevel 进行深拷贝不是 FirstLevel 的职责。
/*SecondLevel sl = new SecondLevel();
sl.b = fl.secondLevel.b;
sl.s = new String(fl.secondLevel.s);*/
SecondLevel clone = secondLevel.clone();
fl.secondLevel = clone;
return fl;
}
}
 package com.cskaoyan.object;

 public class SecondLevel implements Cloneable{
int b;
String s; @Override
protected SecondLevel clone() throws CloneNotSupportedException {
SecondLevel sl = (SecondLevel) super.clone();
sl.s = new String(s);
return sl;
}
}

Java常用类object详解的更多相关文章

  1. Java常用类StringBuffer详解

    内容多为最近学习的自我总结,可能有些地方写的不严谨,甚至会有错误的地方,仅供参考,如发现错误敬请指出,谢谢! 灰色字体为补充扩展内容,多为帮助自己理解. StringBuffer概述: 线程安全的可变 ...

  2. Java基础之Java常用类--Object类,字符串相关类,包装类,日期相关类,数字相关类

    Java是一种面向对象的语言,也就是将万事万物可以描述为对象,特点如下: 1.面向对象是常见的一种思考习惯,符合人们的思考习惯.2.面向对象的出现,将复杂的事情简单化.3.面向对象的出现,将之前过程中 ...

  3. java常用类 --- Object

    Object类 Object类是所有Java类的父类,其位于java.lang包中.任何Java对象,如果没有显示定义父类则它默认Object类作为父类. 方法如下: 其中与线程相关的有5个方法: n ...

  4. Java常用类-Object类

    一.java.lang.Object类 1.Object类是所有Java类的根父类 2.如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类 3.Obj ...

  5. Java 嵌套类基础详解

    目录 1. 什么是嵌套类? 2. 为什么要使用嵌套类? 3. 嵌套类的类型 4. 静态嵌套类 5. 非静态嵌套类 5.1 成员内部类 5.2 局部内部类 5.3 匿名内部类 6. 嵌套接口 1. 什么 ...

  6. Java的类的详解

    首先呢,我承认上一次我理解的有误. 1.构造方法的作用:是初始化一个对象,而不是成员变量,它和get和set方法都有给成员变量赋值的功能. 2.下来说一下JVM调用main方法的过程: a.静态变量赋 ...

  7. Java工具类DateFormatUtils详解

    日期和时间格式化实用程序和常量public static String format(Calendar calendar, String pattern) 说明:将日历格式化为特定的模式:参数:cal ...

  8. Properties类使用详解

    Java Properties类使用详解   概述 Properties 继承于 Hashtable.表示一个持久的属性集,属性列表以key-value的形式存在,key和value都是字符串. Pr ...

  9. 在java poi导入Excel通用工具类示例详解

    转: 在java poi导入Excel通用工具类示例详解 更新时间:2017年09月10日 14:21:36   作者:daochuwenziyao   我要评论   这篇文章主要给大家介绍了关于在j ...

随机推荐

  1. 百度云人脸识别API人脸对比

    from urllib import request import base64 import requests import re import json import urllib import ...

  2. Java后端面经总结:拿下蚂蚁金服美团头条 offer 秘诀

    笔者在面过 猿辅导,去哪儿,旷视, 陌陌,头条, 阿里, 快手, 美团, 腾讯之后,除了收获一大堆面试问题,还思考到如何成为面试官眼中的”爱技术,爱思考,靠谱,有潜力候选人的”一些”套路”. 面试问题 ...

  3. 201871010126 王亚涛 《面向对象程序设计(Java)》第七周实验总结

    ---恢复内容开始--- 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com ...

  4. Junit框架使用(4)--JUnit常用断言及注解

    从别人博客中抄过来一点东西 原文地址:http://blog.csdn.net/wangpeng047/article/details/9628449 断言是编写测试用例的核心实现方式,即期望值是多少 ...

  5. 3.GO-项目结构、包访问权限、闭包和值传递引用传递

    3.1.goland中项目结构 (1)在goland中创建标准Go项目 (2)goland配置 创建项目Learn-Go file-settings-go-GOPATH-添加 在项目目录下创建src目 ...

  6. ASP.NET CoreMVC 中的控制器

    Controller in ASP.NET Core MVC 在本节中,我们将讨论 Controller 是什么以及它在 ASP.NET Core MVC 中的作用. Fiddler 需要大家提前装一 ...

  7. linux数据库中使用MD5加密

    MD5加密算法源码下载:https://pan.baidu.com/s/1nwyN0xV 下载完成了之后解压,得到两个文件 环境搭建: 1.把md5.h文件拷贝到/usr/include/目录下 su ...

  8. Linux性能优化实战学习笔记:第十七讲

    一.缓存命中率 1.引子 1.我们想利用缓存来提升程序的运行效率,应该怎么评估这个效果呢? 用衡量缓存好坏的指标 2.有没有哪个指标可以衡量缓存使用的好坏呢? 缓存命中率 3.什么是缓存命中率? 所谓 ...

  9. java web开发入门十(idea创建maven SSM项目)基于intellig idea

    一.搭建项目骨架 二.配置pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xm ...

  10. IOS手机 html5页面 数字变成蓝色链接的原因

    IOS手机 html5页面 数字变成蓝色链接的原因 这个是ios手机自动识别 写如下代码 即可<pre> <meta name="format-detection" ...