java 类型信息_从头再来:Java的类型信息(必须知道的)

2afd4fecb2db34a615beba2128e5a72c.pngJava的类型信息

还是老规矩,先看个测试题,下面的程序的执行结果是什么?

f00af44a1f7b8a22525025f802fc8509.png测试程序

上面就是和类型相关的测试,如果有任何疑问,请慢慢往后看。

Java的类型包括基本类型和对象类型,类型信息可以通RTTI(Run-Time Type Identification)或者反射方式获取。

01Class对象

Class对象是用来创建“普通”对象的,包含了类的各种信息,比如类名,变量,方法签名等。每当我们编写了一个类并通过编译后就会生成一个Class对象,保存到在一个同名的.class文件中。

大家都知道类在使用前需要类加载器来加载,当一个类的Class对象加载到内存后,就用来它创建这个类的对象。

获取Class对象的方式有这个几种,可以通过实例的getClass方法或者通过类.class获取,也可以用Class.forName获取,下面就是一个例子:

e8b93338f70893a8dc51801fc19b04a3.png获取Class对象的例子

Class对象支持泛型,如果添加了泛型后下面的程序有问题吗?

d7be3e19b54afd3eb0ffa157b00bd1d5.png泛型化的class对象引用

很明显程序有编译错误,Interger类继承于Number类,为什么还有问题?答案就是Integer Class对象不是Number 的Class对象的子类。那怎么解决这种问题,可以使用通配符?,这个可以匹配任何类型,如果知道他是某个类的子类可以用?加上extends关键字实现,代码如下:

85a9287b4f51be1dab8353672772e60b.png修正后的代码

02类型转换

编程过程中有时候需要类型转换,通常使用括号强制转换或者使用SE5之后的cast方法。但是在转换的时候,如果类型不匹配就会收到一个ClassCastException异常。为了避免异常,我们需要在转换前进行类型检查,可以使用instanceof关键字或者Class的isAssignableFrom方法。

instanceof关键字,用来在运行时判断一个实例是否是某个接口或者类的实例。这个关键字和Class对象的isInstance方法是相同的作用。isAssignableFrom方法,用来判断当前Class 对象所表示的类或接口与指定的 Class 参数所表示的类或接口是否相同,或是否是其接口或者父类。如果是返回true,否则返回false。这两种方式都可以在类型转换前检查,有些情况下instance不能实现,那就是要判断的是接口或者抽象类的时候,因为他们不能实例化,这个时候就得使用Class对象的isAssignableFrom方法。

250c495be135ac31632e2bfd473aba81.pngisAssignableFrom判断

使用方式为调用基类Class对象的isAssignableFrom方法,参数是要检查的Class对象,上面的运行结果为true。

03Java中的反射

用RTTI获取对象的类型信息的前提是类在编译的时候已知,但是有时候我们需要从网络或者磁盘的其他地方加载一个类,这时候就需要用到反射了,反射在开发中也是常用的,后续有时间自己整理一下,在这里就简单提一下。

反射的类在java.lang.reflect包下面,包括Field,Method和Constructor等。我们就用反射的方式获取类的方法和变量,示例代码如下:

a6c5a8f52258417f7a16c73c8524213b.png反射的实例代码

上面的代码的输出结果如下,类的名字,参数类型,和修饰都可以获取到,只要你需要。

801fa65b4457732ad9ffca385acfa6b3.png输出结果

04开头处测试的输出结果

那段程序在运行的时候报了一个错误,错误的信息是找不到构造方法,具体如下:

eca34cc94fffca6a5ea8f413549cb12f.png错误的输出信息

因为我们使用newInstance的无参数的方法,这个方法会调用A的无参数的构造方法,如果我们定义了一个有参数的,Java就不会再生产默认的构造方法,需要显示声明。

另外,如果真没有无参数的构造方法,我们可以用constructor的newInstance来实现,自己可以试着实现,这里就不举例子了。

欢迎关注留言讨论,如果有任何错误,请批评指正,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值