基于Java class对象说明、Java 静态变量声明和赋值说明(详解)
先看下JDK中的说明:
java.lang.Object java.lang.ClassInstancesoftheclassClassrepresentclassesandinterfacesinarunningJavaapplication.Anenumisakindofclassandanannotationisakindofinterface.EveryarrayalsobelongstoaclassthatisreflectedasaClassobjectthatissharedbyallarrayswiththesameelementtypeandnumberofdimensions.TheprimitiveJavatypes(boolean,byte,char,short,int,long,float,anddouble),andthekeywordvoidarealsorepresentedasClassobjects. Classhasnopublicconstructor.InsteadClassobjectsareconstructedautomaticallybytheJavaVirtualMachineasclassesareloadedandbycallstothedefineClassmethodintheclassloader. ThefollowingexampleusesaClassobjecttoprinttheclassnameofanobject: voidprintClassName(Objectobj){ System.out.println("Theclassof"+obj+ "is"+obj.getClass().getName()); } ItisalsopossibletogettheClassobjectforanamedtype(orforvoid)usingaclassliteral. System.out.println("ThenameofclassFoois:"+Foo.class.getName()); 在一个运行着的JAVA应用中,类的任何实例都可以用Class对象来指代,Class可以指代所有的类和接口。枚举属于类,注解属于接口,均可以用Class指代。每个数组均属于反射的Class对象,数组中的每个元素和维度也同样拥有Class对象。Java基本类型(boolean,byte,char,short,int,long,float,anddouble)以及关键字void也都可以用Class指代。 Class类不存在构造函数,当类被加载过程中由JVM通过调用类加载器中的defineClass方法自动构造。 下面的例子是将一个对象通过Class对象打印出类名。 voidprintClassName(Objectobj){ System.out.println("Theclassof"+obj+ "is"+obj.getClass().getName()); } 通过class关键字指定类型也是可以得到Class对象的 System.out.println("ThenameofclassFoois:"+Foo.class.getName());
上面内容总结下,就是Java中所有的对象以及基本类型都是可以用Class指代的。接下来看一个Demo。
/**
*
*旨在测试Class对象和Instance之间的关系;
*旨在测试静态变量的声明和赋值过程;
*@authorzzy
*
*/
publicclassObjClass{
privateenumtmpEnum{A,B,C};
publicstaticvoidmain(String[]args){
int[]tmpArray={1,2,3};
ClassclassType;
try{
//通过类名直接获取Class对象,JVM中没有加载。
classType=InClass.class;
System.out.println(".class:"+classType);
System.out.println(".classfinish.");
//Java加载类
classType=Class.forName("InClass");
System.out.println("Class.forName:"+classType);
System.out.println("Class.forName:finish.");
//创建实例
InClassnewClassType=newInClass();
classType=newClassType.getClass();
System.out.println("newObject.getClass:"+classType);
System.out.println("newObject.getClass:finish.");
//数组对象
classType=tmpArray.getClass();
System.out.println("Array.getClass:"+classType.getSimpleName());
System.out.println("Array.getClass:finish.");
//枚举对象
classType=tmpEnum.class;
System.out.println("enum.class:"+classType);
System.out.println("enum.class:finish.");
}catch(ClassNotFoundExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
classInClass{
//对静态变量声明之前赋值
{
staticPara=10;
}
publicstaticintstaticPara;
//构造函数
publicInClass(){
System.out.println("construction...");
}
//静态代码块
static{
System.out.println("staticfunction...");
}
//静态变量赋值
{
staticPara=20;
}
{
System.out.println("normalfunction,staticPara:"+staticPara);
}
//静态变量赋值
{
staticPara=30;
}
}
输出结果:
.class:classInClass .classfinish. staticfunction... Class.forName:classInClass Class.forName:finish. normalfunction,staticPara:20 construction... newObject.getClass:classInClass newObject.getClass:finish. Array.getClass:int[] Array.getClass:finish. enum.class:classObjClass$tmpEnum enum.class:finish.
说明:
1. .class方式获取类文件的Class对象,并不需要加载JVM中。
2. Class.forName的方式JVM会加载类,同时会编译。如此,类中的静态代码块就会被执行。
3. 创建实例过程中(已经加载至JVM中,也就是说编译过了),调用构造函数,并执行非静态代码块。
4. 静态代码对于变量的声明和赋值顺序是没有影响的(编译过程处理),所以结果是20。
5.数据对象和枚举对象也是可以被Class对象指定的。
以上这篇基于Javaclass对象说明、Java静态变量声明和赋值说明(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。