l 特殊的类
实名内部类
将一个类的定义置于另一个类中,这个类就是内部类。
内部类需要遵循以下准则:
(1) 内部类的类名只用于定义它的类或语句块之内,在外部引用它是必须给出带有外部类名的完整名称。
(2) 内部类的名字不允许与外部类的名字相同。
(3) 内部类可以是抽象类或接口,若是接口,则可以由其他内部类实现。
内部类包含实名内部类(含有显式的类名)和匿名内部类。
实名内部类格式:
类修饰词表 class 类名 extends 父类名 implements 接口名列表{
类体;
}
实名内部类的访问控制方式相比一般的类增加了protected和private这两个权限。实名内部类的修饰词可以使用static,通过static修饰的实名内部类为静态实名内部类,创建静态实名内部类的实例对象格式如下:
new.外部类名.实名内部类名(构造方法调用参数列表)
没有static修饰的内部类称为不具有静态属性的实名内部类,它的成员变量若有静态属性,则必须同时具有final属性,但成员方法不能有静态属性,创建不具有静态属性的实名内部类的实例对象如下:
外部类实例对象.new 实名内部类名(构造方法调用参数列表)
访问实名内部类的静态属性成员和非静态成员的方式也是有区别的:
访问静态成员:外部类名.实名内部类名.静态成员名
访问非静态成员:实名内部类 实例对象.成员
内部类可以拥有和外部类同名的成员,外部类可以通过实例化内部类得到其对象,并能使用内部类的成员,内部类能直接在外部类的方法中定义。
当内部类成员变量与外部类同名时,调用内部类的成员变量可以使用this关键字,调用外部类同名成员变量可采用外部类名.this的方式。
匿名内部类
其主要特征是:1.不具有类名 2.类不具有抽象和静态属性也不能派生出子类
格式:new 父类名(父类型的构造函数的调用参数列表){
类体;
}
内部类的作用:
(1) 进一步实现多重继承
(2) 能更好地解决接口和父类中方法的同名冲突
(3) 隐藏程序实现细节
类的访问控制方式一般只有public和默认权限,但内部类有private与protected权限,所以能通过内部类来隐藏程序实现细节。
(4) 能够无条件访问外部类的成员
即使该成员是私有访问控制方式,对内部类也是没有任何影响的。
l 泛型类
泛型本质是参数化类型,也就是所操作的数据类型被指定为一个参数,当这种参数类型用在类中时,该类就被称为泛型类。泛型类的格式如下:
[类修饰词列表] class 类名<类型参数列表> [ex tends 父类名][implements 接口名称列表]{
类体;
}
类型参数定义方式:
(1) 类型变量标识符
该类型参数的定义等价于一类型参数变量标识符extends object,object类是Java中自带包中包含,该类很特殊,处于Java继承层次中最顶端,它封装了Java所有类的公共行为,Java语言默认它是每个Java类的直接或间接父类。
(2) 类型变量标识符extends父类型
该方式表明所定义的类型变量是其父类型的子类型,使泛型变量能直接使用继承自父类的方法。
(3) 类型变量标识符extends 父类型1 & 父类型2 &…&父类型n
Java加入房型技术的原因:泛型技术提供了编译时期数据类型的检查功能,即在编译时期强制使用正确的数据类型,可以提前预知错误的发生,增加代码安全性,尤其在大型程序中,泛型技术能提高程序代码的复用性,减少数据的类型转换,以提高代码的运行效率。
l Class类
Java运行时系统一直对所有的对象进行运行时类型标识,这项信息
记录了每个对象所属的类,Java虚拟机通常使用运行时类型信息选准正
确方法去执行,用来保存这些类型信息的类是class类。
Class类无公共构造方法,class对象是在加载类时由JAVA虚拟机以及通
过调用类加载器中的defineclass方法自动构造的,因此不能显示地声明一个class对象。
虚拟机为每种类型管理一个独一无二的class对象,即每一个类都有一个class对象,运行程序时,虚拟机首先检查所要加载的类对应的class对象是否已加载,如果没有, JVM就会根据类名查找class文件,并将其class对象载入,一旦某个类型的class对象已被加载到内存,就可以用它来产生该类型的所有对象。
获取class实例的三种方式:
(1) 利用对象调用getclass()方法获取该对象的class实例
(2) 使用class类的静态方法forName(),用类的名字获取一个class实例。
(3) 运用对象.class方式来获取class实例,对于基本数据类型的封装类,还可以用.TYPE来获取相对应的基本数据类型的class实例。
反射技术
反射技术就是把Java类中的各种成分映射成相应的Java类,例如:一个Java类中用一个class类的对象来表示,表示Java类中组成的部分(成员变量,方法,构造函数,包等信息)也用一个个的Java类来表示,表示Java类的class类显然要提供一系列方法来获取其中的成员变量,方法,构造函数,包等信息,这些信息通过相应类的实例对象来得到,用到的实例对象包括field,method,contructor,package等。
通过反射技术,一个类中的每个成员都可以用相应的反射API类的一个实例对象来表示,通过调用class类的方法可以得到这些实例化对象,在实际编程中,通过class类的反射技术,能较好的提高程序的灵活性和复用性。