基于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静态变量声明和赋值说明(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。