【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方法,会比较类中的相应属性是否都相等
好啦,今天就到这里了,感谢观看。
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。