zoukankan      html  css  js  c++  java
  • 泛型

    未来真实数据类型的一个代表---泛型

    运行期,真实传递是什么就是什么

    定义的时候可以是任何类型,应用的时候传递什么就是什么

    泛型参数

    泛型参数的有限界定,泛型必须满足某些条件

    泛型参数不可以是基本数据类型,必须是引用类型

    //  Map<String, int> map=new HashMap<String, int>();×

        Map<String, Integer> map=new HashMap<String, Integer>();√

    泛型编译的时候有,运行的时候就擦除了,没有了

    加载xxx.class文件-(编译)-Class对象(运行)

    1.当首次创建型为Dog的对象时(构造器可以看成静态方法),或者Dog类的静态方法/静态域首次被访问时,Java解释器必须查找类路径,以定位Dog.class文件。 
    2.然后载入Dog.class(这将创建一个Class对象),有关静态初始化的动作都会执行。因此,静态初始化只在Class对象首次加载的时候进行一次。 
    3.当你用new Dog()创建对象的时候,首先将在堆上为Dog对象分配足够的存储空间。 
    4.这块存储空间会被清零,这就自动地将Dog中的所有基本类型数据设置成了默认值(对数字来说就是0,对布尔型和字符型也相同),而引用则被置成了null。 
    5.执行所有出现于域定义处的初始化动作。 
    6.执行构造器。

    Class<T>怎么理解?

    API上这样解释:

    类型参数:

    T - 由此 Class 对象建模的类的类型。例如,String.class 的类型是 Class<String>。如果将被建模的类未知,则使用 Class<?>

    首先理解Class这个特殊的类:

     

        要理解运行时类型信息在Java中的工作原理,首先必须知道类型信息在运行时是如何表示的.这项工作是由称为"Class对象"的特殊对象完成的,它包含了与类有关的信息.事实上,Class对象就是用来创建类的所有的"普通"对象的.

       类是程序的一部分,每一个类都有一个Class对象,换言之,每当编写并且编译一个新类,就会产生一个Class对象(更恰当地说,是被保存在一个同名的.class文件中).在运行时,当我们想生成这个类的对象时,运行这个程序的JVM首先检查这个类的Class对象是否已经加载,如果尚未加载,JVM就会根据类名查找.class文件,并将其载入,所以Java程序并不是一开始执行就被完全加载的,这一点与许多传统语言都不同的.

    一旦某个类的Class对象被载入内存,它就被用来创建这个类的所有对象.如果这么解释仍然不清楚,请看下面的一个程序:

     

    说白了,Class这个特殊的类对应的就是 xx.class文件

     

    每个类被加载后都在内存产生一个对应的Class对象clazz

     

    Class clazz  java字节码(xx.class)对象

    Class<T>     这也是定义在类上的泛型

      Class<String>   String.class

      Class<Integer>  Integer.class

      .....

     

      Map<k,v> 这是定义在类上的泛型

     

    明白了吧

     

    如何创建一个 Class<T> 类型的实例?就像使用非泛型代码一样,有两种方式:调用方法 Class.forName() 或者使用类常量X.class。Class.forName() 被定义为返回 Class<?>。另一方面,类常量 X.class 被定义为具有类型 Class<X>,所以 String.class 是Class<String> 类型的。

     

  • 相关阅读:
    团队冲刺第十天
    每日学习
    每日学习
    团队冲刺第九天
    每日学习
    2021.4.26
    2021.4.23
    2021.4.22
    2021.4.21
    2021.4.20
  • 原文地址:https://www.cnblogs.com/imChay/p/5591070.html
Copyright © 2011-2022 走看看