写出java.lang.Object类的六个常用方法
java是面向对象的语言,而Object类是java中所有类的顶级父类(根类)。
每个类都使用Object类作为超类,所有对象(包括数组)都实现这个类的方法,即使一个类没有用extends明确指出继承于某个类,那么它都默认继承Object类。
Object类中提供了很多方法,这里只取其中比较常用的方法做下简述。
1)public String toString() >>> 获取对象信息的方法
这个方法在打印对象时被调用,将对象的信息变为字符串返回,默认输出对象地址。
举个例子:
/**
* 定义一个类 并重写toString()方法
*/
public class Person {
private String name;
private int age;
private char gender; @Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", gender=" + gender +
'}';
} public Person() {
} public Person(String name, int age, char gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
/**
* 测试类
*/
public class Test {
public static void main(String[] args) {
Person p1 = new Person("张三",22,'男');
Person p2 = new Person("李思",23,'女');
System.out.println(p1.toString());
System.out.println(p2.toString());
}
}
运行结果:与重写的toString()结果结构一致。

2)public boolean equals(Object obj) >>> 对象相等判断方法
该方法用于比较对象是否相等,而且此方法必须被重写。
举个例子:
/**
* 定义一个类 并重写equals方法
*/
public class Person {
private String name;
private int age;
private char gender;
public Person() {
}
public Person(String name, int age, char gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
/**
*重写equals方法
*/
public boolean equals(Person p) {
return super.equals(p);
}
}
/**
* 测试类
*/
public class Test {
public static void main(String[] args) {
Person p1 = new Person("张三",22,'男');
Person p2 = new Person("张三",23,'男');
Person p3 = new Person("张三",22,'男');
Integer a = 10;
Integer b = 10;
boolean flag1 = p1.equals(p2);
boolean flag2 = p1.equals(p3);
boolean flag3 = p1.getName().equals(p2.getName());
boolean flag4 = a.equals(b);
System.out.println(flag1);
System.out.println(flag2);
System.out.println(flag3);
System.out.println(flag4);
}
}
运行结果:equals比较的是地址,即使p1和p3的各个属性一样,但是通过创建对象两者在堆中的地址值是不一样的,因此结果为false。
需要注意的是基本数据类型是没有equals方法的。上述事例中Integer换成int会报错,p1.getGender().equals(p2.getGender())也是不对的。

3)public native int hashCode() >>> 对象签名
该方法用来返回其所在对象的物理地址(哈希码值),常会和equals方法同时重写,确保两个相等的对象拥有相等的.hashCode。
/**
* 重写hashCode方法
*/
@Override
public int hashCode() {
return super.hashCode();
}
/**
* 测试类
*/
public class Test {
public static void main(String[] args) {
Person p1 = new Person("张三",22,'男');
Person p2 = new Person("张三",22,'男');
int i1 = p1.getName().hashCode();
int i2 = p2.getName().hashCode();
int i3 = p1.hashCode();
int i4 = p2.hashCode();
System.out.println(i1);
System.out.println(i2);
System.out.println(i3);
System.out.println(i4);
}
}
运行结果:

由此可见通过new的对象即使属性赋值一致,对象的hashCode也是不一样的。
4)public final native Class<?> getClass() >>> 返回此Object的运行时类
注意:此方法不可重写,要调用的话一般和getName()联合使用,如getClass().getName()
该方法在反射中有大用!
5)线程中常用的方法(此处合在一起说明)
public final void wait() >>> 多线程中等待功能
public final native void notify() >>> 多线程中唤醒功能
public final native void notifyAll() >>> 多线程中唤醒所有等待线程的功能
其中wait()方法还有另外两个带不同功能的方法:
public final native void wait(long timeout) >>> 要等待的最长时间,单位毫秒
public final void wait(long timeout, int nanos) >>> nanos额外时间,单位纳秒
6)protected native Object clone() >>> protected修饰的方法,功能是完成对象的浅复制(创建并返回此对象的一个副本----“副本”的准确含义可能依赖于对象的类)
只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException。
Java中除了8种基本类型传参数是值传递,其他的类对象传参数都是引用传递,我们有时候不希望在方法里将参数改变,这时就需要在类中复写clone方法(实现深复制)。
7)protected void finalize() >>> 垃圾回收(释放资源的方法)
该方法即使被调用也不知道什么时候执行,所以一般很少主动使用。
finalize()方法的用途:
无论对象是如何创建的,垃圾回收器都会负责释放对象占据的所有内存。这就将对finalize()的需求限制到一种特殊情况,即通过某种创建对象的方式以外的方式为对象分配了存储空间。这种情况一般发生在使用“本地方法”的情况下,本地方法是一种在Java中调用非Java代码的方式。
*>>Java的一大特点就是垃圾回收机制。关于垃圾回收需要注意以下几点:
1)对象可能不被垃圾回收。
只要程序没有濒临存储空间用完的那一刻,对象占用的空间就总也得不到释放。
2)垃圾回收并不等于“析构”。
3)垃圾回收只与内存有关。
使用垃圾回收的唯一原因就是为了回收程序不再使用的内存。
综上所述,Object类常用的六种方法是toString()、equals()、hashCode()、wait()、notify()、notifyAll()。
写出java.lang.Object类的六个常用方法的更多相关文章
- java.lang.Object类与equals()及toString()的使用
1.Object类是所有Java类的根父类 2.如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类 3.Object类中的功能(属性.方法)就具有通用 ...
- JDK1.8源码(一)——java.lang.Object类
本系列博客将对JDK1.8版本的相关类从源码层次进行介绍,JDK8的下载地址. 首先介绍JDK中所有类的基类——java.lang.Object. Object 类属于 java.lang 包,此包下 ...
- java.lang.Object类
Object类是java所有对象的基类,包含着java最核心和最基础的类,在编译时会自动导入.具体的类结构图: 1.构造器 public Object(); 大部分情况下,Java中通过形如 new ...
- 深入研究java.lang.Object类
前言:Java的类库日益庞大.所包括的类和接口也不计其数.但当中有一些非常重要的类和接口,是Java类库中的核心部分.常见的有String.Object.Class.Collection.ClassL ...
- java.lang.Object类(JDK1.7)
1.Object的类方法 package java.lang; public class Object { private static native void registerNatives(); ...
- JAVA源码之JDK(一)——java.lang.Object
想要深入学习JAVA,还需追本溯源,从源码学起.这是我目前的想法.如今JAVA各种开源框架涌出,很多JAVA程序员都只停留在如何熟练使用的层次.身为其中一员的我深感惭愧,所以要加快学习的脚步,开始研究 ...
- Java之Object类和常用的API
Object类和常用的API 学习过程中的笔记,涉及到Objetc中的equals方法和toString方法,日期类Date,日历类Calendar,日期格式化类SimpleDateFormat以及基 ...
- Java 之 Object 类
一.Object 概述 java.lang.Object 类是 Java 语言中的根类,即所有类的父类. 在对象实例化的时候,最终找的父类就是 Object. 如果一个类没有特别指定父类,那么默认则 ...
- java数组、java.lang.String、java.util.Arrays、java.lang.Object的toString()方法和equals()方法详解
public class Test { public static void main(String[] args) { int[] a = {1, 2, 4, 6}; int[] b = a; in ...
随机推荐
- python入门导读
很多培训机构宣称py是人工智能必备的编程语言,打着速成的旗号来引诱学者学习python.事实却并不是这样的,万丈高台平地起,不论你想从事怎样的编程工作,都是从最基本的编程技巧开始的:Python并不适 ...
- vue 安装scss
1.安装插件 npm install node-sass --save-devnpm install sass-loader --save-dev 在App页面测试是否可用,在style 上添加< ...
- 我不熟悉的vector
构造函数 使用迭代器构造vector的一种方式: //将v[begin(), end())区间中的元素拷贝给本身 vector(v.begin(),v.end()); 在这个构造函数中,传入普通数组也 ...
- phpfor函数和foreach函数
PHP for 循环 PHP While 循环 PHP 函数 PHP for 循环执行代码块指定的次数. PHP for 循环 如果您已经提前确定脚本运行的次数,可以使用 for 循环. 语法 for ...
- 关键字transient是干啥的
百度百科的解释: Java语言的关键字,变量修饰符,如果用transient声明一个实例变量,当对象存储时,它的值不需要维持.换句话来说就是,用transient关键字标记的成员变量不参与序列化过程. ...
- 分布式-信息方式-ActiveMQ构建应用
ActivemQ构建应用Broker:相当于一个 ActiveMQ服务器实例命令行启动参数示例如下:1 ...
- 当 LAST_INSERT_ID() 带有参数时# 清空重来
[root@yejr.me]> truncate table t; # 插入1条新记录[root@yejr.me]> insert into t select 0,rand()*1024; ...
- java多线程的应用场景
通俗的解释一下多线程先: 多线程用于堆积处理,就像一个大土堆,一个推土机很慢,那么10个推土机一起来处理,当然速度就快了,不过由于位置的限制,如果20个推土机,那么推土机之间会产生相互的避让,相互摩擦 ...
- legend3---4、lavarel中session使用注意
legend3---4.lavarel中session使用注意 一.总结 一句话总结: session('key',$value)不是存值,是设置默认值,session(['key'=>$val ...
- sql server中 设置与查看锁的超时时间(ZT) @@LOCK_TIMEOUT
在数据库的应用系统中,死锁是不可避免的.通过设置死锁的处理优先级方法,可以在数据库引擎中自动检测到死锁,对发生的死锁会话进行干预,从而达到解除死锁的目点,但在这种情况下,会话只能被动的等待数据库引 ...