【JAVASE】带你了解instanceof和equals的魅力

再无B~U~G 2024-08-27 08:05:04 阅读 68

✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉

🍎个人主页:再无B~U~G-CSDN博客

1.instanceof

instanceof 是 Java 的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型

解释一下:

 这里说明下

类的实例包含本身的实例,以及所有直接或间接子类的实例

instanceof左边显式声明的类型与右边操作元必须是同种类或存在继承关系,也就是说需要位于同一个继承树,否则会编译错误

instanceof   关键词官方介绍:https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.20.2

来个案例看看:

给三个类 ~ 代码:

<code>public interface A {

}

public class B implements A{

}

public class C extends B{

}

代码测试案例:

public class InstanceofTest3 {

public static void main(String[] args) {

A a = null;

boolean result;

result = a instanceof A;

System.out.println(result); // 结果:false null用instanceof跟任何类型比较时都是false

a = new B();

b = new B();

result = a instanceof A;

System.out.println(result); // 结果:true a是接口A的实例对象引用指向子类类B,类B实现了接口A,所以属于同一个继承树分支

result = a instanceof B;

System.out.println(result); // 结果:true a是接口A的实例对象引用指向子类类B,类B实现了接口A,所以属于同一个继承树分支

result = b instanceof A;

System.out.println(result);// 结果:true b是类B的实例对象,类B实现了接口A,所以属于同一个继承树分支

result = b instanceof B;

System.out.println(result);// 结果:true b是类B的实例对象,类B实现了接口A,所以属于同一个继承树分支

B b2 = new C();

result = b2 instanceof A;

System.out.println(result); // 结果:true b2是父类B引用指向子类C,类B实现了接口A,所以属于同一个继承树分支

result = b2 instanceof B;

System.out.println(result); // 结果:true b2是父类B引用指向子类C,所以属于同一个继承树分支

result = b2 instanceof C;

System.out.println(result); // 结果:true b2是父类B引用指向子类C,所以属于同一个继承树分支

}

}

instanceof的应用

instanceof一般用于对象类型强制转换

比如说:

public class C extends B {

private void print(Object a) {

System.out.println(a+" instanceof");

}

public void convert(String b) {

if (b instanceof Object) {//如果b和Object有关系则执行if里面的语句,相反不执行

this.print(b);

}

}

}

2.equals

是一个方法,并非运算符

只适用于引用数据类型

 Object类中equals( )的定义:

public boolean equals(object obj) {

return (this == obj); //this是指类的当前实例

}

类中定义的equals()和==的作用是相同的:比较两个对象的地址值是否相同。即两个引用是否指向同一个对象实体

 但是

Java中重写的equals()

这里我们看一下java的一些自带的包装类怎么重写equals()的:

public boolean equals(Object anObject) {

if (this == anObject) {

return true;

}

if (anObject instanceof String) {

String anotherString = (String)anObject;

int n = value.length;

if (n == anotherString.value.length) {

char v1[] = value;

char v2[] = anotherString.value;

int i = 0;

while (n-- != 0) {

if (v1[i] != v2[i])

return false;

i++;

}

return true;

}

}

return false;

}

我们可以非常清晰的看到String的equals()方法是进行内容比较,而不是单纯的引用比较

注意:

==既可以比基本类型也可以比较引用类型。对于基本类型就是比较值,对于引用类型就是比较内存地址equals的话,它是属于java.lang.Object类里面的方法,如果该方法没有被重写过默认也是==;我们可以看到String等类的equals方法是被重写过的,而且String类在日常开发中用的比较多,久而久之,形成了equals是比较值的错误观点。具体要看自定义类里有没有重写Object的equals方法来判断。通常情况下,重写equals方法,会比较类中的相应属性是否都相等 

好啦,今天就到这里了,感谢观看。 



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。