内容
1.获取Class对象的三种方式
2.创建Class对象所表示的类的一个新实例
3.可变长参数
一.获取Class类型对象的三种方式
1.第一种方式
Class c1 = Class.forName("对象.Employee");
forName需要全名
c1引用保存内存地址指向堆中的对象,该对象代表的是Employee整个类
2.第二种方式(更形象)
Class c2 = Employee.class;//这种方式更形象一点
java中每个类型都有 class 属性(注意:是”类型“,不是“类”。int是一种“类型”,但是它不是“类”)
3.第三种方式
Employee e = new Employee();
Class c3 = e.getClass();
java中任何一个对象都有getClass方法
c3是运行时类(e的运行时类是Employee)
4.具体使用示例
import java.util.Date;
public class 测试程序 {
public static void main(String[] args) throws Exception {
//第一种方式
Class c1 = Class.forName("对象.Employee");//forName需要全名
//c1引用保存内存地址指向堆中的对象,该对象代表的是Employee整个类
//第二种方式
//java中每个类型都有 class 属性
Class c2 = Employee.class;//这种方式更形象一点
//第三种方式
//java中任何一个对象都有getClass方法
Employee e = new Employee();
Class c3 = e.getClass();//c3是运行时类(e的运行时类是Employee)
//c4,c5c6都代表Date这个类
Class c4 = Date.class;//c4代表Date这个类
Class c5 = Class.forName("java.util.Date");//必须写类全名,类全名带有包名
Date d = new Date();
Class c6 = d.getClass();
Class c7 = int.class;
//c7代表int类型
}
}
5.注意点
①因为Employee这个类在JVM中只有一个,所以c1,c2,c3的内存地址是相同的,指向堆中唯一的一个对象。
②记住:forName需要类的全名。获取包名可以右键类名然后点击“复制限定词“。
③Class.forName();会执行静态语句块,也就是说它是把A.class文件装载到JVM中的过程
而A.class不会
//将A.class文件装载到JVM中的过程
Class.forName("包名.A");
//静态语句块会执行
//不会执行静态语句块
Class c = A.class;
二.创建Class对象所表示的类的一个新实例
获取Class类型的对象之后,可以创建该“类”的对象
1.newInstance()
只能调用相应类的无参数构造方法,如果没有这个构造方法,则会报“实例化异常”这个错误
2.使用示例
import java.util.Date;
public class 测试程序 {
public static void main(String[] args) throws Exception {
Class c = Class.forName("对象.A");
//创建此Class对象所表示的类的一个新实例
Object o = c.newInstance();//只会调用A的无参数构造方法
}
}
class A{
A(){
System.out.println("A的无参数构造方法");
}
}
输出结果
三.可变长参数
1.介绍
就是可以传递多个参数,参数数目不定。
2.形式
类似void m(int ... a){}
3.注意点
①方法在调用的时候,传递的参数可以是0~N个。如果可以精确匹配的方法,则调用该方法,不会再去执行可变长参数的那个方法。
②可变长参数可以等同看作数组,所以也可以传递数组名。
③可变长参数只能出现一次,并且只能出现在所有参数的最后一位
4.使用示例
import java.util.Date;
public class 测试程序 {
//1.m1方法在调用的时候,传递的参数可以是0~N个
public static void m1(int ...a) {
System.out.println("int...a");
}
//2.如果可以精确匹配的方法,则调用该方法,不会再去执行可变长参数的那个方法
public static void m1(int i) {
System.out.println(i);
}
//3.可变长参数可以等同看作数组
public static void m2(String...args) {
for(int i = 0;i < args.length;i++) {
System.out.println(args[i]);
}
}
//4.可变长参数只能出现一次,并且只能出现在所有参数的最后一位
//public static void m3(String...args,int a);这条语句会报错
public static void m3(int a,String ...args) {
//这个方法就是合适的
}
public static void main(String[] args) throws Exception {
m1(2);
m2("我是","中","国","人");
String[] s = {"我","是","中国人"};
m2(s);//也可以直接传数组名
}
}
运行结果
2
我是
中
国
人
我
是
中国人