java class是什么,讓我們一起了解一下?
CLASS是在網絡工程中的一種協議,在java中有兩種對象:實例對象和Class對象。每個類運行時的類型信息就是用Class對象表示的,它包含了與類有關的信息,其實實例對象就是通過Class對象來創建的。
那我們如何獲得Class對象?
1、Class.forName(“類的全限定名”)
2、實例對象.getClass()
3、類名.class (類字面常量)
實戰操作:如何獲得一個實例的類型類?
Object類中包含一個方法名叫getClass,利用這個方法就可以獲得一個實例的類型類。類型類指的是代表一個類型的類,因為一切皆是對象,類型也不例外,在Java使用類型類來表示一個類型,所有的類型類都是Class類的實例。getClass()會看到返回Class>。
JDK中,普通的Class.newInstance()方法的定義返回Object,要將該返回類型強制轉換為另一種類型,但是使用泛型的Class
代碼如下:
public?class?Main2?{ ????public?static?void?main(String[]?args)?throws?InstantiationException,?IllegalAccessException?{ ????????System.out.println("1-----------"); ????????Dog?dog1?=?creatNew1(Dog.class); ????????System.out.println(dog1.name?+?"?is?"?+?dog1.type+?"\n"); ????????System.out.println("2-----------"); ????????Animal?ani1?=?creatNew2(Cat.class); ????????Cat?cat1?=?(Cat)?ani1; ????????System.out.println(cat1.name?+?"?is?"?+?cat1.type?+?"\n"); ????????System.out.println("3-----------"); ????????Object?obj?=?creatNew3(Dog.class); ????????Dog?dog2?=?(Dog)?obj; ????????System.out.println(dog1.name?+?"?is?"?+?dog2.type?+?"\n"); ????????System.out.println("4-----------"); ????????Object?obj2?=?creatNew4(Cat.class); ????????Cat?cat2?=?(Cat)?obj2; ????????System.out.println(cat2.name?+?"?is?"?+?cat2.type?+?"\n"); ????????System.out.println("5-----------"); ????????Object?obj3?=?creatNew5(new?Cat()); ????????Cat?cat3?=?(Cat)?obj3; ????????System.out.println(cat3.name?+?"?is?"?+?cat3.type?+?"\n"); ????} ????/** ?????*?此方法是一個非泛型類中的泛型方法,參數為Class類型,可以傳入任何類,但是Class 將參數在函數內部的類型固定為?T類,使用clazz.newInstance(),返回的類型也為固定的?T?類型。 ?????*?如:?傳入Dog.class,?函數中的?T?固定為Dog.class,函數返回的是Dog類型,不需要強制轉換為Dog類型 ?????*?(當然,函數返回類型也可以是Object類型,但是沒必要) ?????*/ ????public?static? ?T?creatNew1(Class ?clazz)?throws?IllegalAccessException,?InstantiationException?{ ????????System.out.println(clazz);//打印具體傳入的類型。 ????????return?clazz.newInstance(); ????} ????/** ?????*?此方法參數是Class?extends?Animal>,只能傳入Animal及其子類的類型,函數返回類型只能聲明為Animal或Object類型, ?????*?如:傳入Cat.class,函數返回一個Animal的子類對象,需將此子類對象強制轉換為具體的子類(即Cat類)。 ?????*/ ????public?static?Animal?creatNew2(Class?extends?Animal>?clazz)?throws?IllegalAccessException,?InstantiationException?{ ????????System.out.println(clazz);//打印具體傳入的類型。 ????????return?clazz.newInstance(); ????} ????/** ?????*?此方法參數是Class,可傳入任何類,其返回只能聲明為Object類對象。 ?????*?如:傳入Dog.class,?返回的是Object類型的對象,需強制轉換為Dog類型的對象。 ?????*/ ????public?static?Object?creatNew3(Class?clazz)?throws?IllegalAccessException,?InstantiationException?{ ????????System.out.println(clazz);//打印具體傳入的類型。 ????????return?clazz.newInstance(); ????} ????/** ?????*?傳入參數Class>?和?上一個方法傳入?Class?的區別還不是很清楚,其返回只能聲明為Object類對象。 ?????*?如:Cat.class,?返回的是Object類型的對象,需強制轉換為Cat類型的對象。 ?????*/ ????public?static?Object?creatNew4(Class>?clazz)?throws?IllegalAccessException,?InstantiationException?{ ????????System.out.println(clazz);//打印具體傳入的類型。 ????????return?clazz.newInstance(); ????} ????/** ?????*?傳入Object類型的對象,返回也聲明為Object類型。 ?????*/ ????public?static?Object?creatNew5(Object?object)?{ ????????System.out.println(object.getClass());//打印具體傳入的類型。 ????????return?object; ????} } abstract?class?Animal?{ ????public?String?type?=?"type?=?animal?"; } class?Dog?extends?Animal?{ ????public?String?name?=?"name?=?gou"; } class?Cat?extends?Animal?{ ????public?String?name?=?"name?=?mao"; } /** ?*?這些方法,傳的參數聲明不同,其返回的聲明也必然要隨之不同。 ?*/
以上就是小編今天的分享了,希望可以幫助到大家。