14章类型信息

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();



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值