一、泛型简介
1、定义:泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。
2、泛型的好处:在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。
二、泛型的使用
1、泛型可以有效防止强制转换类型出错,保证安全,例如:
import java.util*;
public class Demo1 {
public static void main(String[] args) {
ArrayList al=new ArrayList();
Class1 a=new Class1();
al.add(a);
Class2 b=(Class1)al.get(0);
//编译时不会报错,但运行时就会报错,错误内容为“ java.lang.ClassCastException”
}
}
使用泛型后:
import java.util*;
public class Demo1 {
public static void main(String[] args) {
ArrayList<Class1> al=new ArrayList<Class1>();
Class1 a=new Class1();
al.add(a);
Class2 b=(Class1)al.get(0);
//此时编译就不会通过,显示“Type mismatch: cannot convert from Class1 to Class2”
}
}
2、泛型可以提高代码的利用率
例如,从键盘分别读入一个整数,一个字符串然后输出
不使用泛型代码:
import java.util.Scanner;
public class Demo2 {
public static void main(String[] args) {
Gen1 g1=new Gen1(sc.nextInt());
g1.Show();
String b=sc.nextLine();
Gen2 g2=new Gen2(b);
g2.Show();
}
}
class Gen1
{
int a;
public Gen1(int a)
{
this.a=a;
}
public void Show()
{
System.out.println(a);
}
}
class Gen2
{
String a;
public Gen2(String a)
{
this.a=a;
}
public void Show()
{
System.out.println(a);
}
}
使用泛型之后:
import java.util.Scanner;
public class Demo2 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
Gen<String> gr=new Gen<String>(sc.nextLine());
gr.Show();
int a=sc.nextInt();
Gen<Integer> gr2=new Gen<Integer>(a);
gr2.Show();
}
}
class Gen<T>
{
private T o;
public Gen(T a)
{
this.o=a;
}
public void Show()
{
System.out.println(o);
}
}
三、反射机制
1、要正确使用Java反射机制就得使用java.lang.Class这个类。它是Java反射机制的起源。当一个类被加载以后,Java虚拟机就会自动产生一个Class对象。通过这个Class对象我们就能获得加载到虚拟机当中这个Class对象对应的方法、成员以及构造方法的声明和定义等信息。
2、通过JAVA的反射机制,我们可以:
①获取一个对象的类信息.
②获取一个类的访问修饰符、成员、方法、构造方法以及超类的信息.
③检获属于一个接口的常量和方法声明.
④创建一个直到程序运行期间才知道名字的类的实例.
⑤获取并设置一个对象的成员,甚至这个成员的名字是在程序运行期间才知道.
⑥检测一个在运行期间才知道名字的对象的方法
3、简单的使用方法:
import java.lang.reflect.Method;
public class Demo4 {
public static void main(String[] args) {
//将泛型设为一个对象
Ex<Person> p1=new Ex<Person>(new Person());
p1.showTypeMethod();
}
}
class Ex<T>
{
public T a;
public Ex (T a)
{
this.a=a;
}
public void showTypeMethod()
{
//将a中所有类的方法放入到类型为Method的数组里
Method []m=a.getClass().getDeclaredMethods();
for(int i=0;i<m.length;i++)
{
//获得方法的名称
System.out.println(m[i].getName());
}
}
}
//创建一个类
class Person
{
int a;
public void Show()
{
System.out.println(a);
}
}
//剩下的方法见帮助文档