一、“instanceof” 和 “==” 的区别
instanceof : 用于判断对象的类型。 格式:对象 intanceof 类型(类类型 接口类型) 。instanceof操作符用于判断一个引用类型所引用的对象是否是一个类的实例 ;对于引用类型变量,Java 编译器只根据变量被先声明的类去编译。 instanceof 左边操作元被显式声明的类型与右边操作元必须是同种类或者有继承关系,即位于继承树的同一个继承分支上,否则编译出错。
“==”运算符:用来判断2个变量是否相等。
示例代码:- abstract class Animal
- {
- abstract void eat();
- }
- class Cat extends Animal
- {
- public void eat()
- {
- System.out.println("吃鱼");
- }
- public void catchMouse()
- {
- System.out.println("抓老鼠");
- }
- }
- class Dog extends Animal
- {
- public void eat()
- {
- System.out.println("吃骨头");
- }
- public void kanJia()
- {
- System.out.println("看家");
- }
- }
- class DuoTaiDemo1
- {
- public static void main(String[] args)
- {
- function(new Dog());
- function(new Cat());
- }
- public static void function(Animal a) //Animal a = new Cat();
- {
- a.eat();
- if(a instanceof Cat) //这里是if语句的条件判断,与变量判断if(x==y)同理,判断a所引用的对象是否是类Cat的实例
- {
- Cat c = (Cat)a;
- c.catchMouse();
- }
- else if(a instanceof Dog)
- {
- Dog c = (Dog)a;
- c.kanJia();
- }
- }
- }
复制代码 二、“==”和“equals()” 的区别
(一)对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同。 “==”比较两个变量本身的值,即两个对象在内存中的首地址。 “equals()”比较字符串中所包含的内容是否相同。 比如: - String s1,s2,s3 = "abc", s4 ="abc" ;
- s1 = new String("abc");
- s2 = new String("abc");
复制代码那么: s1==s2 是 false //两个变量的内存地址不一样,也就是说它们指向的对象不 一样,故不相等。
s1.equals(s2) 是 true //两个变量的所包含的内容是abc,故相等。 注意(1): 如果: StringBuffer s1 = new StringBuffer("a");
StringBuffer s2 = new StringBuffer("a");
结果: s1.equals(s2) //是false 解释:StringBuffer类中没有重新定义equals这个方法,因此这个方法就来自Object类,而Object类中的equals方法是用来比较“地址”的,所以等于false. 注意(2): 对于s3和s4来说,有一点不一样要引起注意,由于s3和s4是两个字符串常量所生成的变量,其中所存放的内存地址是相等的,所以s3==s4是true(即 使没有s3=s4这样一个赋值语句)。
(二)对于非字符串变量来说,"=="和"equals"方法的作用是相同的,都是用来比较其对象在堆内存的首地址,即用来比较两个引用变量是否指向同一个 对象。 比如: - class A
- {
- A obj1 = new A();
- A obj2 = new A();
- }
复制代码 那么:obj1==obj2是false obj1.equals( obj2 )是false 但是如果加上这样一句:obj1=obj2; 那么:obj1==obj2 是true obj1.equals(obj2) 是true 总之:equals方法对于字符串来说是比较内容的;而对于非字符串来说是比较其指向的对象是否相同的,也就是对象在对内存中的的首地址。 == 比较符对于字符串和非字符串是一样的,都是比较指向的对象是否相同的,也就是对象在对内存中的的首地址。
三、equals方法和instanceof 的区别 Object 类的 equals() 方法的比较规则为:当参数 obj 引用的对象与当前对象为同一个对象时,就返回true,否则返回false。
在JDK中有一些类覆盖了 Object 类的equals()方法,它们的比较规则为:如果两个对象的类型一致,并且内容一致,则返回true。
这些类包括:java.io.File、java.util.Date、java.lang.String、包装类(如java.lang.Integer和java.lang.Double类)。
如果是自己定义的类的话,可以复写equals()方法,自己定义比较规则 • 对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”。
• 反射性:x.equals(x)必须返回是“true”。
• 类推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”。
• 还有一致性:如果x.equals(y)返回是“true”,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是“true”。
• 任何情况下,x.equals(null),永远返回是“false”;x.equals(和x不同类型的对象)永远返回是“false”。
|