码迷,mamicode.com
首页 > 其他好文 > 详细

14章类型信息

时间:2014-12-07 06:49:25      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:信息   空间   

1、初始化被延迟到了对静态方法(构造器隐式地是静态的)或者非常数静态域进行首次引用时才执行
 01、static final int staticFinal = 47;这样直接引用class就可以不用初始化,因为这个是编译期常量,这个值不需要对Initable类进行初始化就可以被读取。

 02、 static final int staticFinal2 =ClassInitialization.rand.nextInt(1000);

这个是不确定的,所以要初始化后,才能引用(对于像这里的staticFinal2进行访问的时候,就会强制进行类的初始化,因为它不是一个编译期常量)

03、static int staticNonFinal = 74;这个不是final的,所以也是会有更改的可能,所以要等到对这个变量引用的时候,才会初始化

总结:

如果一个static域不是final的,那么在对它访问时,要先进行链接(为这个域分配存储空间)和
初始化(初始化该存储空间)

(如果一个域只设置为static或者final的话,这不足以确保这种行为)

2、class泛化知识要点:

01、Class<Integer> genericIntClass = int.class;
这个已经规定是Integer类型了,所以是限制死了,再给它赋予 genericIntClass = double.class;这个值的话,编译就会出错。

02、放松限制:
用通配符?像: Class<?> intClass2 = int.class;这样的话就不会出错了
然后还有如果要用T,Z什么的做泛型的话,要在class就声明T,然后成员变量和方法里面就可以声明用T了,但是成员变量和方法都要
不是static的,如果是static的话,那就会在编译时出错。例子:
public class GenericClassReferences<T>{
private Class<T> classs;
private void test() {
// TODO Auto-generated method stub
 Class<T> to ;
}
}
这样可以,
但是如果:
public class GenericClassReferences<T>{
private static Class<T> classs;
public static void main(String[] args) {

   
      Class<T> intClass2 ;
     
      
  }
}
这样就会报错

03、Class<Number> genericNumber = Integer.class,像这样的话,就会报错
虽然Integer是Number的子类,但是我的理解是,在这里就是不能向上转型为他的父类,所以编译时就会报错,解决方法是:
 Class<? extends Number> bounded = int.class;这样写就没问题了

04、class Toy {
  // Comment out the following default constructor
  // to see NoSuchMethodError from (*1*)
  Toy() {}
  Toy(int i) {}
}
class FancyToy extends Toy
implements HasBatteries, Waterproof, Shoots {
  FancyToy() { super(1); }
}
如果是这样的话就会报错:
Class<Toy> up2 = ftClass.getSuperclass();
解决办法:
 Class<? super FancyToy> up = ftClass.getSuperclass();
这样就没问题了哦
解释:因为getSuperclass()方法返回的是基类,它代表的不仅仅只是某个类,而是指FancyToy超类,并不是具体的某个类,所以正是这种含糊行,这里的
Object obj = up.newInstance();才会是object,不是那个具体类
具体比较

  Class<FancyToy> ftClass = FancyToy.class;
  FancyToy fancyToy = ftClass.newInstance();
这样就不需要转型了,直接就是这个对象
但是像这个的话,就要转型:如下:
Class<? super FancyToy> up = ftClass.getSuperclass();
  Object obj = up.newInstance();

本文出自 “追随心的彼岸” 博客,谢绝转载!

14章类型信息

标签:信息   空间   

原文地址:http://qa962839575.blog.51cto.com/6819179/1587122

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!