浅谈Java Object
在Java中,所有的类都继承自Object类,因此万物皆对象?也没错!
那有人会问,我的子类继承的是父类不是Object,怎么说?
如果一个类没用显示的继承某一个类,那么他就会隐式的继承 Object。
接下来说重点:我在进这家公司面试的时候问道,“Object类包含了哪些方法?”,犹记得当时一脸懵逼的样子,倒不是说这道题多难,而是那时候弟弟刚大四,虽然是老师直接推荐过去的,但紧张呀。而且还有一些扩展问题,今天就统一总结一下。
protected Object clone() throws CloneNotSupportedException创建并返回对象的副本(拷贝)《阿里巴巴Java开发手册》建议:慎用
Object的clone()方法来拷贝对象,因为Object的clone()方法默认是浅拷贝,即拷贝对象在内存中的地址的引用。如果需要深拷贝,需要重写clone()方法。即:
x.clone() != x;
x.clone().getClass() == x.getcalss();
x.clone.equals(x); // true
如果对象的类不支持
Cloneable接口,重写clone()方法则会报此异常。Object类本身并不实现接口Cloneable,因此在类别为Object的对象上调用clone()方法将导致运行时抛出异常.public String toString()返回此对象的字符串表示形式。
《阿里巴巴 Java 开发手册》强制规定:POJO类必须重写toString方法;比如:public class QueryParamInfo {
private Long startTime;
private Long endTime;
private String operator;
private Integer currentPage;
private Integer size; @Override
public String toString() {
return "QueryParamInfo{" +
"startTime=" + startTime +
", endTime=" + endTime +
", operator='" + operator + '\'' +
", currentPage=" + currentPage +
", size=" + size +
'}';
}
}
这些代码都是插件或者编辑器可以快捷生成的,不用害怕,要养成习惯。那好处是什么呢?很简单,方便在抛出异常时调用
POJO的toString()打印其属性值,便于排查问题。POJO(Plain Ordinary Java Object)指简单的 Java 对象,也就是普通的 JavaBeans,包含一些成员变量及其 getter / setter ,没有业务逻辑。有时叫做 VO (value - object),有时叫做 DAO (Data Transform Object)。
public final Class<?> getClass()返回Object运行时类。
在运行时可以获取对象对应类的信息,详见反射.A a = new A();
Class b = a.getClass();
System.out.pringtln(b.getName()); // 输出A
public int hashCode()返回对象的哈希值。
hashCode()是一个native方法,返回值是整形。该方法将对象在内存中的地址作为哈希码返回,可以保证不同对象的返回值不同。
hashCode通常在哈希表中起作用,比如hashMap.native方法顾名思义就是本地方法,不同平台上的方法不同,有JVM调用实现。比如Thread中的start()方法其实就是调用native的start0().自己可以在IDE上点进代码看一下。protected void finalize() throws Throwable当垃圾回收机制确定该对象不再被调用时,垃圾回收器会调用此方法.
此方法在JDK9中标注deprecated,所以不多说。public boolean equals(Object obj)判断两个对象是否相等==: 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)。equals()也是判断两个对象是否相等,它有两种使用情况:- 类没有覆盖
equals()方法。则通过equals()比较该类的两个对象时,等价于通过“==”比较这两个对象。 - 类覆盖了
equals()方法。一般,我们都覆盖equals()方法来比较两个对象的内容是否相等;若它们的内容相等,则返回true(即,认为这两个对象相等)。
- 类没有覆盖
举例:
public class test1 {
public static void main(String[] args) {
String a = new String("ab"); // a 为一个引用
String b = new String("ab"); // b为另一个引用,对象的内容一样
String aa = "ab"; // 放在常量池中
String bb = "ab"; // 从常量池中查找
if (aa == bb) // true
System.out.println("aa==bb");
if (a == b) // false,非同一对象
System.out.println("a==b");
if (a.equals(b)) // true
System.out.println("aEQb");
if (42 == 42.0) { // true
System.out.println("true");
}
}
}
String中的equals方法是被重写过的,因为object的equals方法是比较的对象的内存地址,而String的equals方法比较的是对象的值。- 当创建
String类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个String对象。
《阿里巴巴 Java 开发手册》上强调:由于
Object的equals方法容易抛出空指针异常,所以应该使用常量或者确定不为null的对象来调用equals。String a = null;
"test".equals(a); //false
a.equals("test"); // 抛出异常 // 推荐用法
Objects.equals(a,"test"); //false
// 具体原因和使用看java.util.Objects#equals的源码
wait()、notify()、notifyAll()
这三个放在一起说是因为,大家都熟悉而且使用场景一致。就是在多线程加同步锁时等待、通知唤醒方法。没错他们不是Thread中的方法是Object的。
总结:
虽然终极父类是Object,但那8个基本类型不在其列。
本篇文章主要就是让大家对Object的印象更加深刻一点,并拓展了一些知识和自己的理解。如有不当之处,望批评指正。对大家有帮助的话点个赞,Wink~~
浅谈Java Object的更多相关文章
- 浅谈Java中的equals和==(转)
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...
- 浅谈Java中的equals和==
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: String str1 = new String("hello"); String str2 = ...
- 浅谈JAVA集合框架
浅谈JAVA集合框架 Java提供了数种持有对象的方式,包括语言内置的Array,还有就是utilities中提供的容器类(container classes),又称群集类(collection cl ...
- 浅谈Java中的深拷贝和浅拷贝(转载)
浅谈Java中的深拷贝和浅拷贝(转载) 原文链接: http://blog.csdn.net/tounaobun/article/details/8491392 假如说你想复制一个简单变量.很简单: ...
- 浅谈Java中的深拷贝和浅拷贝
转载: 浅谈Java中的深拷贝和浅拷贝 假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(bool ...
- 【转】浅谈Java中的hashcode方法(这个demo可以多看看)
浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native i ...
- 浅谈Java的集合框架
浅谈Java的集合框架 一. 初识集合 重所周知,Java有四大集合框架群,Set.List.Queue和Map.四种集合的关注点不同,Set 关注事物的唯一性,List 关注事物的索引列表,Q ...
- 浅谈java类集框架和数据结构(2)
继续上一篇浅谈java类集框架和数据结构(1)的内容 上一篇博文简介了java类集框架几大常见集合框架,这一篇博文主要分析一些接口特性以及性能优化. 一:List接口 List是最常见的数据结构了,主 ...
- 浅谈 Java 主流开源类库解析 XML
在大型项目编码推进中,涉及到 XML 解析问题时,大多数程序员都不太会选用底层的解析方式直接编码. 主要存在编码复杂性.难扩展.难复用....,但如果你是 super 程序员或是一个人的项目,也不妨一 ...
随机推荐
- bzoj3745: [Coci2015]Norma 分治,单调队列
链接 bzoj 思路 首先\(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\sum\limits_{k=i}^{j}max(a_k)\)可以用单调队列求解.参见 ...
- P3327 [SDOI2015]约数个数和 莫比乌斯反演
P3327 [SDOI2015]约数个数和 莫比乌斯反演 链接 luogu 思路 第一个式子我也不会,luogu有个证明,自己感悟吧. \[d(ij)=\sum\limits_{x|i}\sum\li ...
- ftp使用
1.pom文件中添加依赖 <!-- ftp使用 --><dependency> <groupId>commons-net</groupId> <a ...
- 帝国cms替换iwms幻灯图片问题
在管理标签模板中增加一个新模板 页面模板内容为:[!--empirenews.listtemp--]<!--list.var1-->[!--empirenews.listtemp--] 列 ...
- 这个中秋,我用 Java 画了一个月饼!
栈长代表微信公众号 "Java技术栈" 祝所有粉丝中秋佳节快乐! 为了用一种特殊的方式表达我的心意,去年中秋节,我写了这篇文章: 为了写中秋这篇文章,我学了 20 种编程语言! 没 ...
- docker-Harbor仓库映像
部署环境: centos-7.2 docker-engine-1.12.5 docker-compose-1.9.0 harbor-0.5.0 1.下载所需的软件包(以下需要-翻-墙-下载的地方你们自 ...
- 高并发&高可用系统的常见应对策略 秒杀等-(阿里)
对于一个需要处理高并发的系统而言,可以从多个层面去解决这个问题. 1.数据库系统:数据库系统可以采取集群策略以保证某台数据库服务器的宕机不会影响整个系统,并且通过负载均衡策略来降低每一台数据库服务器的 ...
- 咏南跨平台中间件REST API
主旨 1)为了中间件支持跨操作系统部署,客户端支持跨操作系统.跨设备.跨开发语言,特制订本REST API规约. 2)所有接口均支持HTTP GET\POST调用. 3)调用示例为DELPHI代码,其 ...
- Element + Vue I18n动态import加载国际化语言包翻译文件
需求 项目为多页应用,包含产品a.b.c.d.e,每个产品都有自己的翻译文件.一次加载所有翻译文件是极度不合理的.于是考虑动态加载. 实现 参考官方文档:延迟加载翻译 项目结构 │ ├── dist ...
- kafka外部访问设置
一.broker参数 broker.id:kafka集群的唯一标识. log.dirs:kafka存储消息日志的目录,多个用逗号隔开,需要保证指定的目录有充足的磁盘空间. zookeeper.conn ...