- 如果向上转型,基类中的this代表的是导出类的this。this在涉及字符串拼接的时候,就会自动调用toString()方法。
- 每一个类又都一个Class对象,Class.forName()是取得Class对象的引用的一个方法,参数是类全名(含包名),如果类没加载就加载它,加载过程中会执行静态代码块。Class.forName()方法如果没有找不到要加载的类,就会抛出异常ClassNotFoundException。
- 如果一个类已经被加载了,还可以用这个类的getClass()方法获取Class对象的引用。
- Class对象包含了一些有用的方法:
方法 |
作用 |
getName() |
产生全限定的类名 |
getSimpleName() |
产生不含包名的类名 |
isInterface() |
判断是否为接口 |
getSuperClass() |
查询直接基类 |
- 直接使用
类名.class
也可以获取Class对象的引用,这样做在编译器就会得到检查,更安全高效。当使用类名.class
来创建Class对象的引用时,不会自动初始化该Class对象。这种用法称为类字面常量。 类字面常量不仅可以用普通类,还可以用于接口、数组、基本数据类型。
- Class引用总是指向某个Class对象,它可以制造类的实例,并包含可作用于这些实例的所有方法代码。他还包含该类的静态成员,因此,Class引用标识的就是它所指向的对象的确切类型,而该对象便是Class类的一个对象。(P320)
Class<?>
优于Class
,问号时通配符,还可以与extends关键字结合,例如Class<? extends Number>
,它与仅仅声明Class<Number>
不同。关于泛化Class的引用,还没用看懂,参考P320
- 在做类型转换前,可以先做检查,这样可以消除发生异常的可能性,需要用到的关键字是instanceof,例如:
if (test05_2 instanceof Test05_2_2) {
((Test05_2_2) test05_2).f();
}
- Class类的isInstance()方法比instanceof关键字更强大,可以替代instanceof关键字。isInstance()方法的参数是对象,不是类。例如:
if (Test05_2_2.class.isInstance(test05_2)) {
((Test05_2_2) test05_2).f();
}
发表评论