instanceof,isinstance,isAssignableFrom,asSubclass的区别
1,isAssignableFrom():是字节码对象的方法
是用来判断一个类的字节码对象和另一个类的字节码对象是否相同或是子类或接口。
assignable英 [ə,sainəbl]美 [ə,sainəbl]
adj. [经] 可分配的;可指定的;可让渡的
更多释义>>
[网络短语]
assignable 可转让信用证,可转让的,可指定的
assignable assets 可确指的资产
assignable document 可转让单据
格式为:(xxx是否可从xxx转换)
Class1.isAssignableFrom(Class2)
调用者和参数都是java.lang.Class类型的对象。
/**
* 判断一个类是否是另一个类的父类
* 是false
*/
public static void testIsAssignedFrom1() {
System.out.println("String是Object的父类:"+String.class.isAssignableFrom(Object.class));
}
/**
* 判断一个类是否是另一个类的父类
* 是true
*/
public static void testIsAssignedFrom2() {
System.out.println("Object是String的父类:"+Object.class.isAssignableFrom(String.class));
}
/**
* 判断一个类是否和另一个类相同
* 是true
*/
public static void testIsAssignedFrom3() {
System.out.println("Object和Object相同:"+Object.class.isAssignableFrom(Object.class));
}
2,instanceof :是关键词
是用来判断一个对象实例是否是一个类或接口的或其子类子接口的实例。
如果被测对象是null值,则测试结果总是false。
格式是:
o instanceof TypeName
第一个参数是对象实例名,第二个参数是类名或接口名,例如:String/InputStream。
/**
* 判断str是否是Object类的实例
* 是true
*/
public static void testInstanceOf1() {
String str = new String();
System.out.print("str是Object的实例:");
System.out.println(str instanceof Object);
}
/**
* 判断o是否是Object类的实例
* 是true
*/
public static void testInstanceOf2() {
Object o = new Object();
System.out.print("o是Object的实例:");
System.out.println(o instanceof Object);
}
3,isinstance:字节码对象的方法
这个方法是instanceof运算符的动态等价。
自身类.class.isInstance(自身实例或子类的实例) 返回true
例子:
String s=new String("javaisland");
System.out.println(String.class.isInstance(s)); //true
4,asSubclass:是字节码对象的方法
asSubclass用于窄化未知的Class类型的范围(得到一个特定类型字节码对象。)
是java.lang.Class中的一个方法,作用是将class对象(字节码对象)转换成由clazz参数所表示的class对象(字节码对象)的某个子类。
public <U> Class<? extends U> asSubclass(Class<U> clazz)
例子:
List<String> strList = new ArrayList<String>();
Class<? extends List> strList_cast = strList.getClass().asSubclass(List.class);
这么做似乎没有什么意义,因为我们很清楚strList.getClass()获取的class对象就是ArrayList,它当然是List.class的一个子类;
但有些情况下,我们并不能确知一个class对象的类型,典型的情况是Class.forName()获取的class对象:class.forName()的返回类型是Class<>,但这显然太宽泛了,
假设我们需要List.class类型的class对象,这时我们就可以用到asSubclass()这个方法了,如下:
Class.forName("xxx.xxx.xxx").asSubclass(List.class).newInstance();
当xxx.xxx.xxx是List的子类时,正常执行,当不是List的子类时,抛出ClassCastException。asSubclass()在JDK中广泛使用。
instanceof,isinstance,isAssignableFrom,asSubclass的区别的更多相关文章
- instanceof, isinstance,isAssignableFrom的区别
instanceof运算符 只被用于对象引用变量,检查左边的被测试对象 是不是 右边类或接口的 实例化.如果被测对象是null值,则测试结果总是false. 形象地:自身实例或子类实例 instanc ...
- instanceof isInstance isAssignableFrom 比较
instanceof : java 的关键字 判断一个 实例对象 是不是 可以赋值 给一个 class( 实例对象是不是 class 或者 subClass 的实现 ),表示的类和对象之间的关系 ...
- day25——私有成员、类方法、静态方法、属性、isinstance和issubclass的区别
day25 类的私有成员 当你遇到重要的数据,功能(只允许本类使用的一些方法,数据)设置成私有成员 python所有的私有成员都是纸老虎,形同虚设 类从加载时,只要遇到类中的私有成员,都会在私有成员前 ...
- Class.isAssignableFrom(Class clz)与instanceof与Class.isInstance(Object obj) 的区别和联系
编程的时候可能会遇到一个不知道它属于哪个类的对象,我们可以用下列运算符或者方法来判断. 1.instanceof instanceof是运算符只被用于对象引用变量,检查左边的被测试对象是不是右边类或 ...
- instanceof运算符、Class的isInstance( )与isAssignableFrom之间的区别
instanceof运算符 只被用于对象引用变量,检查左边的被测试对象 是不是 右边类或接口的 实例化.如果被测对象是null值,则测试结果总是false.形象地:自身实例或子类实例 instance ...
- 判断一个类是否为另一个类的实例 instanceof关键字和isAssignableFrom方法的区别
Which of the following is better? a instanceof B or B.class.isAssignableFrom(a.getClass()) The only ...
- instanceOf与isInstance()方法之间的区别
instanceof运算符 只被用于对象引用变量,检查左边的被测试对象 是不是 右边类或接口的 实例化.如果被测对象是null值,则测试结果总是false.Class类的isInstance(Obje ...
- instanceof 与isAssignableFrom
instanceof 针对实例 isAssignableFrom针对class对象 isAssignableFrom 是用来判断一个类Class1和另一个类Class2是否相同或是另一个类的超类或 ...
- isinstance与type的区别
1.isinstance()内置函数 python中的isinstance()函数是python的内置函数,用来判断一个函数是否是一个已知类型.类似type. 2.用法: isinstance(obj ...
随机推荐
- 什么是UE、UI、UCD、UED?UE、UI、UCD、UED四者的区别(转)
字面释义: UE (User Experience) : 用户体验 UI (User Interface) : 用户界面 UCD (User-Centered Design) :以用户为中心的设计 U ...
- Node.js的优点和缺点(转载)
著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:FengqiAsia链接:http://www.zhihu.com/question/19653241/answer/1599 ...
- 282 expression and operations添加运算符
[抄题]: 给定一个仅包含数字 0 - 9 的字符串和一个目标值,返回在数字之间添加了 二元 运算符(不是一元)+, - 或 * 之后所有能得到目标值的情况. "123", 6 - ...
- 关于Yii2.0的url路径优化问题(配置虚拟路径)
backend/config/main.php 'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' => fa ...
- qt学习(二) buttong layout spinbox slider 示例
开启qt5 creator 新建项目 qt widgets 改写main.cpp #include "mainwindow.h" #include <QApplication ...
- 百度地图point 转化成经纬度
百度1.0表示的坐标点,直接在1.3的api上使用坐标无法定位,研究了一阵子百度拾取坐标系统的源码才知道,原来1.0的point是Pixel,调用js的转化代码就搞定了 转化方法如下: var b = ...
- IntelliJ IDEA 2017版 SpringBoot的Json字符串返回
一.说明 SpringBoot框架已经自动封装好json字符串解析,所以我们只需要用它的注解来返回操作就可以了. 二.实战 1.书写一个实体类User,设置属性id和name package com. ...
- tab切换代码优化
上次的tab切换的代码里面有很多重复的代码,需要做做优化,把重复的代码用函数封装起来调用. 优化前: <script> //获取id封装成一个函数$()方便调用 function $(id ...
- FCLK、HCLK、PCLK
一,PLL S3C2440 CPU主频可达400MHz,开发板上的外接晶振为12M,通过时钟控制逻辑的PLL(phase locked loop,锁相环电路)来倍频这个系统时钟.2440有两个P ...
- Sypder 安装和使用
一.安装Spyder 我傻傻以为直接下载Spyder就可以用了,但我其实大错特错了.Spyder虽然提供科学计算,但是它还需要一个介于Python和其之间的框架,或者说,显示界面PyQt5.(PyQt ...