浅谈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 程序员或是一个人的项目,也不妨一 ...
随机推荐
- JSX 简介
JSX 简介 考虑如下变量声明: const element = <h1>Hello, world!</h1>; 这个有趣的标签语法既不是字符串也不是HTML. 它被称为JSX ...
- JVM和ClassLoader
JVM和ClassLoader 2019-11-08 目录 1 JVM架构整体架构 1.1 类加载器子系统 1.1.1 加载 1.1.2 链接 1.1.3 初始化 1.2 运行时数据区(Runtime ...
- UDF——定制窗口
获取实例句柄的代码来自:https://blog.csdn.net/xie1xiao1jun/article/details/22180815 在Fluent当中我们可以使用scheme来为Fluen ...
- java列队使用案例
java队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作. 具有先进先出的特性 LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Que ...
- SpringCache
官方文档:https://docs.spring.io/spring/docs/4.3.13.RELEASE/spring-framework-reference/htmlsingle/#cache ...
- 最长公共子序列长度(dp)
/// 求两个字符串的最大公共子序列长度,最长公共子序列则并不要求连续,但要求前后顺序(dp) #include <bits/stdc++.h> using namespace std; ...
- 【C++】C++中的类模板
基础的类模板 模板类的继承 内部声明定义普通模板函数和友元模板函数 内部声明友元模板函数+外部定义友元模板函数 声明和定义分别在不同的文件(模板函数.模板友元) C++中有一个重要特性,那就是模板类型 ...
- linux centos编译安装php7.3
php7.2的编译安装参考:https://www.cnblogs.com/rxbook/p/9106513.html 已有的之前编译的旧版本php: mv /usr/local/php /usr/l ...
- (原)理解码率控制模式(x264,x265,vpx)
理解码率控制模式(x264,x265,vpx) 原文链接:https://slhck.info/video/2017/03/01/rate-control.html 翻译:lihaiping1603@ ...
- 由crt和key文件生成keystore文件
该图转自知乎 海棠依旧 1.先生成p12文件,生成的时候需要指定密码 openssl pkcs12 -export -in your_crt.crt -inkey your_key.key -out ...