=、equals()、isAssignableFrom()、isInstance()、instanceof()

==:

当==作用于基本数据类型时,比较的是他们两个的值

当==作用于引用类型的变量时,比较的是引用类型变量所指向对象的地址

equals:

equals不能作用域基本数据类型

如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;

诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

        int a=3;
        int b=3;

        System.out.println(a==b);//true

        String str1=new String("abc");
        String str2=new String("abc");

        System.out.println(str1==str2);//false
        System.out.println(str1.equals(str2));//true

未重写的equals--Object:

比较的仍是地址信息

重写的equals--String:

1.先比较两个对象的地址是否相同,地址相同的话内容肯定就一样

2.在比较该对象是否是String类型的

3.类型相同时在比较其长度

4.长度相同时将其拆分成字符数组,再一一进行比较

简而言之:

==比较的是地址

equals比较的是内容

isAssignableFrom:

jdk描述:

判定此 Class 对象所表示的类或接口与指定的 Class 参数所表示的类或接口是否相同,或是否是其超类或超接口。如果是则返回 true;否则返回 false。如果该 Class 表示一个基本类型,且指定的 Class 参数正是该 Class 对象,则该方法返回 true;否则返回 false

        Father f = new Father();
        Child c = new Child();

        System.out.println(Father.class.isAssignableFrom(Child.class));//true
        System.out.println(Child.class.isAssignableFrom(Father.class));//false

getClass()和类名.class:

getClass():从一个类的实例获得类类型

类名.class:当前类的类类型

相同点:

都可以获得某个类的类类型

不同点:

出现时期不同:

getClass()和Class.forName()是运行时加载,是动态加载

类名.class是编译器加载,是静态加载

instanceof:

java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。

        Father f = new Father();
        Child c = new Child();

        System.out.println(c instanceof Father);//true
        System.out.println(f instanceof Child);//false

总结:

isAssignableForm:当前类是否为该类的父类或是其接口

                            isAssignableFrom是父-->子

                            isAssignableFrom是接口->实现

instanceof :当前类是否为该类的子类或是其接口的实现类

                            instanceof 是子-->父

                            instanceof 是实现-->接口

isInstance:

jdk描述:

判定指定的 Object 是否与此 Class 所表示的对象赋值兼容。此方法是 Java 语言 instanceof 运算符的动态等效方法。如果指定的 Object 参数非空,且能够在不引发 ClassCastException 的情况下被强制转换成该 Class 对象所表示的引用类型,则该方法返回 true;否则返回 false

特别地,当该 Class 对象表示一个已声明的类时,若指定的 Object 参数是所表示类(或其任一子类)的一个实例,则此方法返回 true;否则返回 false。如果此 Class 对象表示一个数组类,且通过身份转换或扩展引用转换,指定的 Object 参数能转换为一个数组类的对象,则返回 true;否则返回 false。如果此 Class 对象表示一个接口,且指定 Object 参数的类或任一超类实现了此接口,则此方法返回 true;否则返回 false。如果此 Class 对象表示一个基本类型,则此方法返回 false

        System.out.println(c instanceof Father);//true
        System.out.println(f instanceof Child);//false       
        System.out.println(Child.class.isInstance(f));//false
        System.out.println(Father.class.isInstance(c));//true
        Father f1 =c;
        //Child c1 = (Child) f;//报错

此方法是 Java 语言 instanceof 运算符的动态等效方法。如果指定的 Object 参数非空,且能够在不引发 ClassCastException 的情况下被强制转换成该 Class 对象所表示的引用类型,则该方法返回 true;否则返回 false

即当一个对象转为另一个对象不会抛出异常时,isInstance运算为treu,否则为false

猜你喜欢

转载自blog.csdn.net/qq_33371372/article/details/81542671