內(nèi)容
1.獲取Class對(duì)象的三種方式
2.創(chuàng)建Class對(duì)象所表示的類的一個(gè)新實(shí)例
3.可變長(zhǎng)參數(shù)
一.獲取Class類型對(duì)象的三種方式
1.第一種方式
Class c1 = Class.forName("對(duì)象.Employee");
forName需要全名
c1引用保存內(nèi)存地址指向堆中的對(duì)象,該對(duì)象代表的是Employee整個(gè)類
2.第二種方式(更形象)
Class c2 = Employee.class;//這種方式更形象一點(diǎn)
java中每個(gè)類型都有 class 屬性(注意:是”類型“,不是“類”。int是一種“類型”,但是它不是“類”)
3.第三種方式
Employee e = new Employee();
Class c3 = e.getClass();
java中任何一個(gè)對(duì)象都有g(shù)etClass方法
c3是運(yùn)行時(shí)類(e的運(yùn)行時(shí)類是Employee)
4.具體使用示例
import java.util.Date;
public class 測(cè)試程序 {
public static void main(String[] args) throws Exception {
//第一種方式
Class c1 = Class.forName("對(duì)象.Employee");//forName需要全名
//c1引用保存內(nèi)存地址指向堆中的對(duì)象,該對(duì)象代表的是Employee整個(gè)類
//第二種方式
//java中每個(gè)類型都有 class 屬性
Class c2 = Employee.class;//這種方式更形象一點(diǎn)
//第三種方式
//java中任何一個(gè)對(duì)象都有g(shù)etClass方法
Employee e = new Employee();
Class c3 = e.getClass();//c3是運(yùn)行時(shí)類(e的運(yùn)行時(shí)類是Employee)
//c4,c5c6都代表Date這個(gè)類
Class c4 = Date.class;//c4代表Date這個(gè)類
Class c5 = Class.forName("java.util.Date");//必須寫類全名,類全名帶有包名
Date d = new Date();
Class c6 = d.getClass();
Class c7 = int.class;
//c7代表int類型
}
}
5.注意點(diǎn)
①因?yàn)镋mployee這個(gè)類在JVM中只有一個(gè),所以c1,c2,c3的內(nèi)存地址是相同的,指向堆中唯一的一個(gè)對(duì)象。
②記?。篺orName需要類的全名。獲取包名可以右鍵類名然后點(diǎn)擊“復(fù)制限定詞“。
③Class.forName();會(huì)執(zhí)行靜態(tài)語句塊,也就是說它是把A.class文件裝載到JVM中的過程
而A.class不會(huì)
//將A.class文件裝載到JVM中的過程
Class.forName("包名.A");
//靜態(tài)語句塊會(huì)執(zhí)行
//不會(huì)執(zhí)行靜態(tài)語句塊
Class c = A.class;
二.創(chuàng)建Class對(duì)象所表示的類的一個(gè)新實(shí)例
獲取Class類型的對(duì)象之后,可以創(chuàng)建該“類”的對(duì)象
1.newInstance()
只能調(diào)用相應(yīng)類的無參數(shù)構(gòu)造方法,如果沒有這個(gè)構(gòu)造方法,則會(huì)報(bào)“實(shí)例化異?!?/strong>這個(gè)錯(cuò)誤
2.使用示例
import java.util.Date;
public class 測(cè)試程序 {
public static void main(String[] args) throws Exception {
Class c = Class.forName("對(duì)象.A");
//創(chuàng)建此Class對(duì)象所表示的類的一個(gè)新實(shí)例
Object o = c.newInstance();//只會(huì)調(diào)用A的無參數(shù)構(gòu)造方法
}
}
class A{
A(){
System.out.println("A的無參數(shù)構(gòu)造方法");
}
}
輸出結(jié)果

三.可變長(zhǎng)參數(shù)
1.介紹
就是可以傳遞多個(gè)參數(shù),參數(shù)數(shù)目不定。
2.形式
類似void m(int ... a){}
3.注意點(diǎn)
①方法在調(diào)用的時(shí)候,傳遞的參數(shù)可以是0~N個(gè)。如果可以精確匹配的方法,則調(diào)用該方法,不會(huì)再去執(zhí)行可變長(zhǎng)參數(shù)的那個(gè)方法。
②可變長(zhǎng)參數(shù)可以等同看作數(shù)組,所以也可以傳遞數(shù)組名。
③可變長(zhǎng)參數(shù)只能出現(xiàn)一次,并且只能出現(xiàn)在所有參數(shù)的最后一位
4.使用示例
import java.util.Date;
public class 測(cè)試程序 {
//1.m1方法在調(diào)用的時(shí)候,傳遞的參數(shù)可以是0~N個(gè)
public static void m1(int ...a) {
System.out.println("int...a");
}
//2.如果可以精確匹配的方法,則調(diào)用該方法,不會(huì)再去執(zhí)行可變長(zhǎng)參數(shù)的那個(gè)方法
public static void m1(int i) {
System.out.println(i);
}
//3.可變長(zhǎng)參數(shù)可以等同看作數(shù)組
public static void m2(String...args) {
for(int i = 0;i < args.length;i++) {
System.out.println(args[i]);
}
}
//4.可變長(zhǎng)參數(shù)只能出現(xiàn)一次,并且只能出現(xiàn)在所有參數(shù)的最后一位
//public static void m3(String...args,int a);這條語句會(huì)報(bào)錯(cuò)
public static void m3(int a,String ...args) {
//這個(gè)方法就是合適的
}
public static void main(String[] args) throws Exception {
m1(2);
m2("我是","中","國","人");
String[] s = {"我","是","中國人"};
m2(s);//也可以直接傳數(shù)組名
}
}
運(yùn)行結(jié)果
2
我是
中
國
人
我
是
中國人