Class类和Class实例

来源:互联网 发布:预付款融资模式优化 编辑:程序博客网 时间:2024/04/29 18:47

Class类和Class实例

 

张三、李四两个对象

class  Person{

//张三、李四共同的具备的行为(方法)和状态(字段)

}

Person就是张三、李四这两个对象的类型,即是张三李四两个对象的描述

一切皆对象,那么personDateString...又是什么类型呢?--Class,即都是Class类的对象,都由Class类来描述

Class的实例是什么?--就应该是类或接口【更严格的说是java中的字节码(类或接口编译后生成的.class文件)】

Class类:用于描述一切类或接口

Class实例:就是JVM中的一份字节码(一个类或接口)  (枚举是一种类、注解是一种接口)

 

问题:那Class实例到底表示的是哪一份字节码(或者哪一个类或接口)?

Class  clz1=Date.class;

Class  clz2=String.class;

为了明确区分出Class实例表示的是谁的字节码,Class类提供了泛型!!

上面两个示例中,是省略了泛型的写法------第一个示例的clz1表示的是Date的字节码,Date.class的类型就是Class<Date>;第二个示例的clz2表示的是String的字节码,String.class的类型就是:Class<String>

(上面的写法会出现编译警告)

实例化时无法确定所表示的字节码类型时通常使用通配符?或者T,上面的两个示例可以写为下面的方式:

Class<Date>  clz1=Date.class;//不会出现编译警告

Class<String>  clz2=String.class;

或者使用通配符:

Class<?>  clz1=Date.class;//不会出现编译警告

Class<?>  clz2=String.class;


public void demo(Class<?>  clazz);

泛型通配符?(或者T):表示的是当前所表示的字节码类型-----?是在实例化时无法确定所表示的字节码类型时使用的,通配所有类型


 

 

Class类中没有字段、显示构造器

如何得到Class的实例?------有三种方式

1、数据类型.class-------就是一个字节码

2、静态方法forName(String  className);----Class.forName(String  className);-----根据一个类的全限定名来构建Class对象,该方法会抛出ClassNotFoundException异常---注意必须是全限定名才能获得对应实例

3、对象.getClass();----------每个对象都有该方法,因此该方法定义在Object类中----返回的是该对象的真实类型,即运行时类型

Object obj=new Date();

Obj的编译是类型Object

obj.toLocalString();//toLocalStringDate类的方法,代码在编译阶段去编译类型Object中检查是否有该方法,如没有,编译失败;–这条语句会在编译阶段报错 

反射可以解决:

Class  clz=obj.getClass();//等价于Class<Date>  clz=obj.getClass();  通常写法:Class<?>  clz=obj.getClass();--------此时的?表示的时obj的运行时类型,即Date类型

clz.toLocalString();//正确

 

一个类或接口在Java虚拟机(JVM)中,有且只有一份字节码

 

 

 

 

0 0
原创粉丝点击