Java面向对象——Object类、toString方法、equals方法
4.4Object类
4.4.1Object类的定义
- Object是JDK提供的一个根基类(基类),是所有类的直接父类或者是间接父类。java的类如果没有显式的编写继承关系,那么它们的父类都是Object,Object里面定义的功能时所有类都应该具备。
4.4.2Object中的方法
i.常见的方法
- 获取到一个对象对应的Class对象(反射章节)
public final native Class<?> getClass();
- 计算当前对象的hash值(一个对象的唯一值)【集合】
public native int hashCode();
- 克隆方法,创建对象的一种方式。【克隆模式】
protected native Object clone() throws CloneNotSupportedException;
- 唤醒、唤醒所有、等待。线程通信。【多线程】
public final native void notify();
public final native void notifyAll();
public final native void wait(long timeout) throws InterruptedException;
public final void wait(long timeout,int nanos) throws InterruptedException;
public final void wait() throws InterruptedException;
- GC(垃圾回收器)在回收堆内存时,自动调用的方法。【GC】
protected void finalize() throws Throwable{}
ii.重要方法
toString():打印对象内容
Object中toString方法规则:
public String toString(){
return getClass().getName()+"@"+Integer.toHexString(hashCode());
}
4.4.3toString方法
代码演示`:
public class TestObject{
public static void ain(String[] args){
TestObject to=new TestObject();
String str=to.toString();
//输出调用toString之后的返回结果
System.out.println(str);
//输出了对象to
System.out.println(to);
}
}
输出结果:
com.mage.oop.object.TestObject@15db9742
com.mage.oop.object.TestObject@15db9742
- 当直接打印一个对象时,默认情况下就调用的是当前对象的toString方法。如果当前对象没有toString方法,直接执行的是父类的(Object)的toString。
- 一般情况下将Object中的toString打印的内容可以看做是:包名.类名@地址值;
代码演示:
public class Computer{
String type;
double price;
public Computer(){
}
public String toString(){
return "Computer[type:"+this.type+"price:"+this.price+"]";
}
}
public class TestComputer{
public static void main(String[] args){
//1:创建Computer对象
Computer c=new Computer();
c.type="外星人";
c.price=13800;
//2:打印输出c对象
System.out.println(c);
}
}
//输出结果:Computer[type:外星人price:13800.0]
- 对于对象而言,很多时候我们都是想通过toString()方法查看该对象中存在哪些信息,而不单单值是简单的看看内存地址。所以此时需要在当前类中重写toString()方法,才能看到类中toString方法中东西
4.4.4equals方法
i.equals方法的作用
- 在Java中,equals方法比较的两个对象是否相等
ii.equals方法的格式:
public boolean equals(object obj){
return(this==obj);
}
iii.equals方法用法
代码演示:
public class Computer{
String type;
double price;
public Computer(){
}
}
public class TestComputerEquals{
public static void main(String[] args){
//1:创建两个computer对象
Computer c1=new Computer();
Computer c2=new Computer();
System.out.println(c1);
System.out.println(c2);
boolean flag=c2.equals(c1);//(this==obj);
System.out.println(flag);
}
}
代码结果:
com.pxcoder.myproject4.Computer@15db9742
com.pxcoder.myproject4.Computer@6d06d69c
false
特别注意:==在比较基本数据类型时比较的是值,而equals方法比较引用类型时比较的是地址值。
- 如果一个类中没有重写equals方法,那么使用Object内部定义的equals方法,在Object中的通过equals方法比较相等。
- 一个对象只要时new出来的,那么就会重写分配堆内存空间,也就意味着这个对象的地址和其它对象是不同的。
- 有时对象需要比较内部的属性,从而判定是否两个对象是一致的。比如对于一个User用户对象,如果它的用户名和密码是相同的时候,那么我们觉得这两个账户信息是相同的。此时就一定要在当前类中重写equals方法。否则将执行Object的equals方法。
- 代码演示:
public class Computer{
String type;
double price;
public Computer(){
}
@Override
public boolean equals(Object obj){
//将object强制转为子类类型
Computer other=(Computer)obj;
return this.price==other.price;
}
}
public class TestComputerEquals{
public static void main(String[] args){
//1:创建两个computer对象
Computer c1=new Computer();
c1.price=10000;
c1.type="联想";
Computer c2=new Computer();
c2.price=10000;
c2.type="联想";
System.out.println(c1.equals(c2));
}
}
//输出结果是:true
- 重写否的equals方法比较的不再是两个对象的内存地址,而是根据自己的需求来决定
题目一:比较两个电脑如果品牌和价钱一致才认为是相等的
public class Demo3 {
String nickName;
int price;
public Demo3_3(){
}
public boolean equals(Object obj) {
//将object强制转为子类类型
Demo3 d=(Demo3)obj;
if(this.nickName.equals(d.nickName)&&this.price==d.price) {
return true;
}
return false;
}
}
public class TestDemo3 {
public static void main(String[] args) {
Demo3_3 a=new Demo3_3();
a.price=1000;
a.nickName="联想";
Demo3_3 b=new Demo3_3();
b.price=1000;
b.nickName="联想";
System.out.println(a.equals(b));
}
}
题目二:比较电脑和字符串
public class Computer{
String type;
double price;
public Computer(){
}
@Override
public boolean equals(Object obj){
//if判定如果为true证明不是computer则直接返回false如果结果是false证明是computer进行后续代码执行
if(!(obj instanceof Computer)){
return false;
}
Computer other=(Computer)obj;
if(this.type.equals(other.type)&&this.price==other.price){
return true;
}
return false;
}
}
public class TestComputerEquals{
public static void main(String[] args){
//1:创建两个computer对象
Computer c1=new Computer();
c1.type="联想";
String str="联想";
System.out.println(c1.equals(str));
}
}
//输出结果:false
instanceof关键字
是用来比较左边对象是否属于右边类型的实际,如果属于则返回true如果不属于返回false。- Object是所有类的父类,当Object作为形式参数时,所有的子类都可以传入。
- java.lang.NullPointerException空指针异常:在对象.方法/属性时如果对象是null值,则一定会空指针。
- java.lang.ClassCastException类型转换异常:在进行引用类型转换时可能由于类型不一致导致转换过程中出现问题。
题目三:测试其他
//3:比较两个电脑
Computer c3=new Computer();
System.out.println(c1.equals(c3));
//4:比较两个电脑
Computer c4=null;
System.out.println(c1.equals(c4));
String str1=null;
- equals方法的注意事项:
- equals方法在使用时一定要注意调用者一定要保证不是null值,否则出现空指针异常。
- null可以给任意的引用类型赋值,但是null都不属于任意的引用类型。
- null通过instanceof判定从属时一定为false。