java面试题网

普通会员

483

帖子

9

回复

187

积分

楼主
发表于 2019-08-26 15:24:39 | 查看: 5106| 回复: 1

java object类的方法

java object类的方法

Object类是所有类的根父类, Java中的类要么直接继承Object要么间接继承Object

Java中的继承是可传递的, 所以Object类的方法所有的类都能继承到

Object类的方法:

protected Object

clone() 对象的克隆.

boolean

equals(Object obj) 判断对象的内容是否一样.

protected void

finalize() 当垃圾回收器回收这个对象时,会调用该方法

Class

getClass() 返回对象的运行时类.

int

hashCode() 返回对象的哈希码.

void

notify() 唤醒等待中的线程

void

notifyAll()

String

toString() 把对象转换为字符串.

void

wait() 线程等待

1)clone()

对象克隆, 是在堆中再创建一个完全一样的对象

2)finalize()

当一个对象没有变量引用它时, 垃圾回收器就会把这个对象释放, 回收该对象时会调用对象的finalize()方法, 垃圾回收器在什么时候回收这个对象不确定, finalize()方法的执行时间不确定, 该方法一般不用

3)wait()/notify()

线程等待/唤醒线程

4)getClass()

返回对象的运行时类对象

把所有小狗可以抽象为Dog类, 把所有小猫抽象为Cat类,把所有人抽象为Person类, 把Dog/Cat/Person/String/System等所有的类进一步抽象为Class类. Class类描述的是所有类的相同的特征

getClass()方法返回当前对象对应的Class对象

当前可以简单的把getClass()方法理解为返回对象的类, 或者理解为返回对象对应的类的字节码文件, 可以利用这个方法判断两个对象的类是否是同一个类

Person p1 = new Person();

Person p2 = new Person();

if( p1.getClass() == p2.getClass() ){

p1和p2是同一个类型的对象

}

5)toString()

作用是把对象转换为字符串

当使用Sytem.out.println(obj)打印对象时,会调用obj对象的toString()方法

toString()默认显示完整类名@十六进制数, 如果想要打印obj对象的各个字段值, 需要重写toString()

使用Sytem.out.println(obj)打印对象时,如果显示的内容不是完整类名@哈希码十六进制形式时, obj的类或者父类肯定重写过toString()方法

package com.wityx.chapter01.demo03;

import java.util.ArrayList;

/**
 * 测试toString()方法
 * @author Administrator
 *
 */
public class Test01 {

	public static void main(String[] args) {
		//创建Person对象
		Person lisi = new Person("lisi", 18, "男");
		//在屏幕上打印lisi
		System.out.println( lisi );
		/*
		 * 输出结果:
		 * 		com.wityx.chapter01.demo03.Person@15db9742
		 * 			完整类名 @ 十六进制数	
		 * 分析:
		 * 		1) 在使用System.out.println()打印一个对象时, 在println()方法体中,先把对象转换为字符串再打印
		 * 			调用了String类的valueOf()方法
		 * 		2)在String类的valueOf()方法中,调用了对象的toString()方法
		 * 			toString()方法是从Object类继承来的
		 * 		3)在Object类中, toString()方法返回以下内容:
		 * 			getClass().getName() + "@" + Integer.toHexString(hashCode())
		 * 			运行时类的完整类名 + "@" + 哈希码的十六进制
		 * 结论:
		 * 		当使用System.out.println()打印一个对象时, 会调用对象的toString()方法
		 * 需求:
		 * 		当使用System.out.println()打印一个对象时, 显示该对象的各个字段值(各个成员变量值)
		 */
		//上面一行,相当于下面这一行,
		System.out.println( lisi.toString() );
		//toString()是从Object继承来的,默认显示完整类名 , 想要显示各个字段值 ,需要在子类中重写toString()
		//当子类从父类继承的方法,满足不了子类需求时,需要重写该方法
		
		String s1 = "feifei";
		System.out.println( s1 ); 	//feifei, 显示不是完整类名,String类应该重写了toString()方法
		Integer num = new Integer(456);
		System.out.println( num ); 	//456
		ArrayList list = new ArrayList<>();
		System.out.println( list ); //[], ArrayList的爷爷类AbstractCollection重写了toString()
		
		
	}

}

package com.wityx.chapter01.demo03;

public class Person {
	String name;
	int age;
	String gender; 			//性别  
	
	public Person() {
	}
	public Person( String name, int age, String gender){
		this.age = age;
		this.name = name;
		this.gender = gender;
	}
	
	//重写toString()方法
	@Override						//注解,验证重写是否正确
	public String toString() {
		return "name:" + name + ",age:" + age + ",gender:" + gender;
	}
}

6)equals()

使用关系运算符 == 判断两个引用是否指向堆中的同一个对象

使用equals()方法判断两个对象的内容是否一样,即各个字段值是否相等

如果两个类需要使用equals()判断两个对象是否一样时,需要重写equals()方法

就像之前判断两个字符串是否一样时,需要调用equals()方法, String类已经重写过equals()方法了

package com.wityx.chapter01.demo03;

public class Book {
	String name;
	String author;
	String press;
	double price;
	
	public Book( String name, String author, String press, double price) {
		this.author = author;
		this.name = name;
		this.press = press;
		this.price = price;
	}
	
	//重写equals()方法
	@Override
	public boolean equals(Object obj) {
		// 依次判断两个对象的内容, 如果一个不相同的就返回false, 如果都相同就返回true
		//1)两个变量引用同一个对象, 返回true
		if ( this == obj ) {
			return true;
		}
		//2)参数为null, 返回false
		if ( obj == null ) {
			return false;
		}
		//3) 如果参数对象和当前对象不是同一个类型,返回false
		if ( this.getClass() != obj.getClass() ) {
			return false;
		}
		//4) 当前对象与参数对象类型一样, 如果有一个字段的值不相等,就返回false
		//先把obj对象转换为Book类型
		Book other = (Book) obj;
		//判断书名, 如果书名不一样就返回false
		if ( this.name == null ) {
			if ( other.name != null ) {
				return false; 			//当前书名为null,参数对象书名不为null返回false
			}			
		}else if ( !this.name.equals(other.name) ) {   //当前书名不为null, 与参数对象的书名不一样 返回false
			return false;
		}
		//判断作者, 如果作者不一样就返回false
		if ( this.author == null ){
			if (other.author != null) {
				return false;
			}
		}else if ( !this.author.equals(other.author)) {
			return false;
		}
		//判断出版社
		if (this.press == null ) {
			if (other.press != null) {
				return false;
			}
		}else if ( !this.press.equals(other.press)) {
			return false;
		}
		//判断价格,price字段是一个小数, 在计算机 中小数采用近似值保存,不准确, 不能直接 使用== 判断
		//可以比较两个小数的差值, 根据差值是否小于指定的阈值,来判断两个小数是否相等
		if ( this.price - other.price > 0.01 || other.price - this.price > 0.01 ) {
			return false; 		//两本书的差值大于 0.01元就认为不相等
		}
				
		return true;
	}
	
}

package com.wityx.chapter01.demo03;
/**
 * 测试equals()方法
 * @author Administrator
 *
 */
public class Test02 {

	public static void main(String[] args) {
		Book myBook1 = new Book("java入门", "勇哥", "动力节点", 66.6);
		Book myBook2 = new Book("java入门", "勇哥", "动力节点", 66.6);
		
		System.out.println( myBook1 == myBook2 ); 		//false
		/*
		 * 关系运算符==, 判断两个变量的值是否相等  ,
		 * myBook1变量存储堆中的一个对象的引用, myBook2变量存储另外一个对象的引用
		 */
		
		//需求: 判断堆中两个对象的内容是否一样,可以调用equals()方法,该方法是从Object类继承的, Object类中equals()根据==判断是否相等
		System.out.println( myBook1.equals(myBook2) ); 
		
		Book myBook3 = myBook1;			//两个变量引用堆中同一个对象
		System.out.println( myBook1.equals(myBook3));  		//true
		
		Book mybook4 = null;
		System.out.println( myBook1.equals(mybook4));    	//false
		
		Person  lisi = new Person();
		System.out.println( myBook1.equals(lisi));  		//false
		
		Book myBook5 = new Book("java入门", "勇哥", "动力节点", 66.6);
		System.out.println( myBook1.equals(myBook5));  		//true
		
		
	}

}

7)hashCode()

根据哈希约定, 如果两个对象equals()相等, 这两个对象的哈希码也应该相等

在重写equals()方法时,必须同时重写hashCode()


文章来自www.wityx.com,转载请注明出处!原文地址http://www.wityx.com/post/1143_1_1.html


java面试题交流群:327440556

普通会员

115

帖子

83

回复

169

积分
沙发
发表于 2019-09-24 18:01:35

Object类的方法?

(1)equals:判断是否相等。

(2)hashCode:求hash值,若两个对象hash值相等,不一定equals;若equals,则两个对象hash值一定相等。

(3)toString:获得对象的字符串表达形式,一般要重写。

(4)getClass:反射方法,获得对象所属的类。

(5)wait:只能在synchronized同步的代码段中使用,若不带时间参数,则使得正在执行的线程放弃锁进入等待状态(等待池)。

(6)notify:只能在synchronized同步的代码段中使用,从等待池中取出一个线程放入锁标志池。

(7)notifyAll:只能在synchronized同步的代码段中使用,将等待池中取出所有线程放入锁标志池。

您需要登录后才可以回帖 登录 | 立即注册

java面试题网www.wuliaokankan.cnjava建站系统提供技术支持V2.1 网站地图 © 2016-2018