java基础.0——Object类
从这篇文章起就正式开始java学习之旅了。java中,万物皆对象,所以第一篇先学习java的Object类,循序渐进。
一、getClass()
1 public final native Class<?> getClass();
返回此Object的运行时类类型。如: class xyz.weechang.java.base.JavaObject。
二、hashCode()
1 public native int hashCode();
返回该对象的哈希值。如:123961122
该方法用于哈希查找,可以减少在查找中使用equals的次数,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。如HashSet、HashMap。
如果不重写hashcode(),在HashSet中添加两个equals的对象,会将两个对象都加入进去。
三、equals()
1 public boolean equals(Object obj) { 2 return (this == obj); 3 }
Object中的equals方法是直接判断this和obj是否是同一对象,所谓同一对象就是指内存中同一块存储单元,如果this和obj指向的是同一块内存对象,则返回true,如果this和obj指向的不是同一块内存,则返回false。
如果是同一块内存,则object中的equals方法返回true,如果是不同的内存,则返回false
如果希望不同内存但相同内容的两个对象equals时返回true,则我们需要重写父类的equal方法
JAVA中一部分类已经重写了object中的equals方法(这样就是比较内容是否相等了),如基本的包装类型 Integer、Long、Boolean等,还有String
四、clone()
1 protected native Object clone() throws CloneNotSupportedException;
保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。
JAVA里除了8种基本类型传参数是值传递,其他的类对象传参数都是引用传递,我们有时候不希望在方法里讲参数改变,这是就需要在类中复写clone方法(实现深复制)。
4.1clone与copy的区别
在通常操作中,我们常采用的赋值方式为 User u1 = new User(); User u2 = u1;此时,User u2 = u1这种赋值方式就称为copy。此时的赋值只是简单地将u1所指向的内存地址赋值给了u2,所以此时u1、u2引用的是同一块内存空间。所以对u1或者u2任意对象的操作如u1.setId(2);都会带来另一对象的值的改变,此时可以发现u2.getId() 返回值也为2。若我们不希望带来这样的改变,就需要用到clone.User u2 = u1.clone();等价于User u2 = new User(); u2.setId(u1.getId());
copy:只是简单地将内存地址进行引用,实则两者是同一对象,任一对象值的改变,会带来另一对象值的改变。
clone: 两者是不同内存地址的对象,两者值只有在初始clone时一致,一个对象值的改变,不会带来另一对象值的改变。
4.2Shallow Clone与Deep Clone
Object在对某个对象实施仅仅是简单地执行域对域的copy,这就是Shallow Clone。若User中存在一属性为 Date birthDay,此时u1与U2的引诱关系图如下:
此时,除了基本数据类型是值的clone外,非基本数据类型都只是引用的clone。所以此时clone对象与原对象存在一部分相同的引用。此时任一对象的非基本类型的值改变,会导致另一对象的值的改变。若要解决此问题就需要Deep Clone。
针对User 对象可以对clone方法进行改造,如下:
1 @Override 2 protected Object clone() throws CloneNotSupportedException { 3 User cloned = (User) super.clone(); 4 cloned.birthDay = (Date) birthDay.clone(); 5 return cloned; 6 }
五、toString()
public String toString() {return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
返回值为 字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。如 :xyz.weechang.java.base.obj.User@762efe5d
六、notify()
1 public final native void notify();
该方法唤醒在该对象上等待的某个线程
七、notifyAll()
public final native void notifyAll();
该方法唤醒在该对象上等待的所有线程。
八、wait()
1 public final void wait() throws InterruptedException { 2 wait(0); 3 }
public final native void wait(long timeout) throws InterruptedException;
/** *@param timeout 等待该线程终止的时间最长为timeout毫秒。 *@param nanos 等待时间为 timeout毫秒+nanos纳秒 */ public final void wait(long timeout, int nanos) throws InterruptedException {if (timeout < 0) {throw new IllegalArgumentException("timeout value is negative");}if (nanos < 0 || nanos > 999999) {throw new IllegalArgumentException("nanosecond timeout value out of range");}if (nanos > 0) {timeout++;}wait(timeout);}
wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,
如果在规定时间内没有获得锁就返回。
九、finalize()
protected void finalize() throws Throwable { }
该方法用于释放资源。因为无法确定该方法什么时候被调用,很少使用。
Java允许在类中定义一个名为finalize()的方法。它的工作原理是:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法。并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。
关于垃圾回收,有三点需要记住:
1、对象可能不被垃圾回收。只要程序没有濒临存储空间用完的那一刻,对象占用的空间就总也得不到释放。
2、垃圾回收并不等于“析构”。
3、垃圾回收只与内存有关。使用垃圾回收的唯一原因是为了回收程序不再使用的内存。
finalize()的用途:
无论对象是如何创建的,垃圾回收器都会负责释放对象占据的所有内存。这就将对finalize()的需求限制到一种特殊情况,即通过某种创建对象方式以外的方式为对象分配了存储空间。
不过这种情况一般发生在使用“本地方法”的情况下,本地方法是一种在Java中调用非Java代码的方式。
转载于:https://www.cnblogs.com/weechang/p/9145972.html
java基础.0——Object类相关推荐
- java基础之Object类和异常
Object类和异常 1. Object类是所有类的父类(超类, 基类,上帝类); 里面有两个常用的方法: 1> public String toString();// 默认输出对象的地址值的字 ...
- java基础之Object类_繁星漫天_新浪博客
在JDK中提供了一个Object类,它是所有类的父类,即每个类都直接或间接继承该类. 例如: class Cat { public void shout(){ System.out.println( ...
- Java基础:String类
相关阅读 Java基础:String类 Java字符串格式化 Java基础:正则表达式 1. 概述 字符串是由多个字符组成的一串数据(字符序列),字符串可以看成是字符数组. 在实际开发中,字符串的操作 ...
- 【狂神说笔记—— Java基础07-常用类】
Java基础07-常用类 Object类 大家都知道Object是所有类的父类,任何类都默认继承Object. 理论上Object类是所有类的父类,即直接或间接的继承java.lang.Object类 ...
- Java基础复习-常用类
Java基础复习-常用类 本文仅对学习过程中所缺java知识点的查缺补漏复习 String 代表字符串.Java程序中的所有字符串字面值(如"abc")都作为此类的实例实现. St ...
- Java基础 ----常用时间类
Java基础 ----常用时间类 java.util.Date java.util.Calendar java.text.SimpleDateFormat new Date().getTime() & ...
- 一文带你深入理解【Java基础】· 枚举类
写在前面 Hello大家好, 我是[麟-小白],一位软件工程专业的学生,喜好计算机知识.希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正!谢谢大家!!! ...
- 多重继承_Python 和 Java 基础对比 10 —— 类的封装、继承和多态
@Python大星 一.Python 类的封装.继承和多态 封装 继承 Python 支持多父类的继承机制,所以需要注意圆括号中基类的顺序,若是基类中有相同的方法名,并且在子类使用时未指定,Pytho ...
- java object 详解_Java基础之Object类详解
类Object是类层次结构的根类.每个类都直接或者间接地继承Object类.所有对象(包括数组)都实现这个类的方法.Object类中的构造方法只有一个,并且是无参构造方法,这说明每个类中默认的无参构造 ...
最新文章
- 齐鲁工业大学计算机读研,齐鲁工业大学考研难吗
- npm使用入门(package.json)
- socket设置超时时间 SO_RCVTIMEO和SO_SNDTIMEO
- 【微信小程序企业级开发教程】如何搭建服务器(tomcat)后台
- LeetCode Largest Number(排序)
- java 取日期_java取的日期的操作
- [Swift]LeetCode463. 岛屿的周长 | Island Perimeter
- php转译html,使用php转义输出HTML到JavaScript
- Gmail Labs各功能全球开放
- hybris Models
- ruby写的BT种子解析器
- 区块链在切实改变世界的35个让人惊艳的实例数据库
- C++ ODB学习(阿里云服务器测试)
- 1.1 PMBOK指南的目的 -- 项目管理知识体系指南(PMBOK指南)(第五版)
- 使用GDI/GDI+绘制到D3D9缓冲区的方法
- thinkPHP+jQuery实现站内信功能-讲给菜鸟同学
- 微信小程序真机调试连接不到后台服务器,解决微信小程序wepy真机预览跟本地表现不一样,数据变化了视图没变化...
- Learned-Mixin +H(LMH)
- 计算机怎样发现路由器上u盘,路由器USB插口的4个功能,你也许一个都不知道!...
- 安卓开发-Activity的显示意图和隐式意图+实例+Activity界面间数据的传递实例
热门文章
- java hello work_Java入门教程系列 – 第一个程序 “hello, world”
- wordpress android,WordPress for Android 2.0 试用记
- 1080解析 芒果tv_国内主流视频平台解析下载观看
- FPGA的设计艺术(18)如何使用Verilog中的数组对存储器进行建模?
- 高速串行总线系列(5)总线的各种基础问题
- 记录使用Spartan-6 FPGA进行一次3-8译码器实验
- 基于TableStore的数据采集分析系统介绍
- struts2学习:配置篇值请求处理元素
- js,jquery 根据对象某一属性进行排序
- Mac虚拟机安装windows教程--Parallels 5