类名.class 就是字面常量,代表的就是该类的Class对象引用。常量需要赋值给变量

    1. 简单,安全。 编译期接受检查,不需要像forName一样置于try/catch块中。
    2. 加载后不会进行初始化,初始化被延迟到静态方法静态域首次使用时。
    3. 类字面常量可用于类 接口 数组 基本数据类型
    4. 基本数据类型也有类字面常量如int.class, 对应的包装器的 Integer.TYPE。
              System.out.println(int.class); //int
      System.out.println(Integer.TYPE); //int
      System.out.println(Integer.class); //class java.lang.Integer
    5. Integer继承自Number 但 Integer Class 对象不是 Number Class对象的子对象,也就是说Class<Number> cn  = int.class; 是错误的。

二.泛化的Class引用

1.普通的类引用可以重新指向任何其它的Class对象,使用泛型类引用只能赋值为指向其声明的类型,除外使用通配符?

  Class intClass = int.class;
Class<Integer> genericIntClass = int.class;
Class<?> i = int.class;
i = double.class;
genericIntClass = Integer.class; // Same thing
intClass = double.class;

2.Class<?> 优于Class 因为Class在编译期不会产生警告,而Class<?>当指向一个非具体的类引用时会产生警告

3.a.newInstance()如果Class引用a不是泛型引用,在编译期就不知道它会返回什么类型那么只能返回Object。

        Class a = A.class;
Object t = a.newInstance();
//A t = (A) a.newInstance();//无法确定类型需要强制转换
System.out.println(t.getClass().getName());//thinking14class.A

4.a.newInstance()  a 是泛型引用并且能确定类型则会返回确切的类型。

        Class <A> a= A.class;
Class <? extends C> c= C.class; //上界
Class <? super A> d= A.class;
A ta = a.newInstance(); // 可以确定
A tc = c.newInstance(); // 上界至少它是一个C可以确定

5. a.newInstance()  a 是泛型引用但不能确定类型则只能返回Object。

        Class <A> a= A.class;
Class <? extends C> c= C.class; //上界
Class <? super A> d= A.class; //下界
//A ta = a.newInstance(); // 通配符无法确定 A tc = c.newInstance(); // 上界至少它是一个C可以确定 //A td = d.newInstance();// 下界无法确定

6. 利用Class类的cast()方法来转换类型

class Building {}
class House extends Building {}

public class ClassCasts {
public static void main(String[] args) {
Building b = new House();
Class<House> houseType = House.class;
House h = houseType.cast(b);
h = (House)b; // ... or just do this.
}
} ///:~

fd

java 类字面常量,泛化的Class引用的更多相关文章

  1. JAVA类和对象创建

    面向对象 学习目标: 理解面向对象的编程思想 理解类与对象的关系 如何创建类与对象 方法重载 一:什么是面向对象编程(OOP) 面向对象编程(Object Oriented Programming,O ...

  2. Java类的设计----关键字super

    关键字super 在Java类中使用super来引用父类的成分 super可用于访问父类中定义的属性 super可用于调用父类中定义的成员方法 super可用于在子类构造方法中调用父类的构造方法 su ...

  3. Jython引用Java类

    Ubuntu下如下指令安装Jython:$ sudo apt-get install jython下面的指令用于查看Jython版本:$ jython --version下面的代码是一个简单的Java ...

  4. jvm系列(一):java类的加载机制

    java类的加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装 ...

  5. Java 类的实例变量初始化的过程 静态块、非静态块、构造函数的加载顺序

    先看一道Java面试题: public class Baset { private String baseName = "base"; // 构造方法 public Baset() ...

  6. 深入研究Java类装载机制

    目录 1.为什么要研究java类装在机制? 2.了解类装载机制,对于我们在项目开发中有什么作用? 3.装载实现细节. 4.总结 一.为什么药研究Java类装载机制 java类加载机制,便于我们使用自定 ...

  7. 第9章 Java类的三大特性之一:继承

    1.什么是继承 子类继承父类就是对父类的扩展,继承时会自动拥有父类所拥有的处private之外的所有成员作用:增加代码复用语法格式: class 子类名 extends 父类名{…………}第9章 Ja ...

  8. 解析Java类和对象的初始化过程

    类的初始化和对象初始化是 JVM 管理的类型生命周期中非常重要的两个环节,Google 了一遍网络,有关类装载机制的文章倒是不少,然而类初始化和对象初始化的文章并不多,特别是从字节码和 JVM 层次来 ...

  9. Java Native Interfce三在JNI中使用Java类的普通方法与变量

    本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 前面我们学习了如何在JNI中通过参数来使用J ...

随机推荐

  1. nginx设置反向代理后端jenklins,页面上的js css文件无法加载

    转载 2017年06月14日 22:36:59 8485 问题现象: nginx配置反向代理后,网页可以正常访问,但是页面上的js css文件无法加载,页面样式乱了. (1)nginx配置如下: (2 ...

  2. my phone blackberry classic / passport / priv / keyone

    smy blackberry classic PIN: 2BF66A72 / 查看手机位置https://protect.blackberry.com/protect/mydevice#BlackBe ...

  3. mysql表备份的一种方式

    前提: 最近测试环境shop表经常出现表损坏不能正常查询,通过mysql的修复方法,暂时有效.故做该表的迁移操作. 思路是: 停止数据库的操作 1.备份老表.  2.创建一个结构一样的表. 3.将老表 ...

  4. MYCAT分库分表

    一.整体架构 1.192.168.189.130:mysql master服务,两个数据库db_store.db_user,db_store做了主从复制 db_user: 用户表users为分片表 数 ...

  5. 解决vue <router-link>在IE与火狐上点击失效(路由不跳转)问题

    <router-link to="/GoAbroad"> </router-link> vue中的<router-link>这种声明式的路由方式 ...

  6. Calendar add 方法 和set方法

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Calendar c = Calendar. ...

  7. MongoDB 时差问题问题

    在读取的时候,需要再次转换回来,比较麻烦. 其实,Mongo本身就已经提供了相应的处理方法,即在实体类中加个属性即可.具体如下: [BsonDateTimeOptions(Kind = DateTim ...

  8. spring注解第06课 @Value

    1.注入<bean>中的属性 支持3种类型的赋值 <bean id="person" class="com.model.Person"> ...

  9. mssql拿webshell的方法

    首先检测下MSSQL数据库的用户权限,一般有两种,一种是SA权限,这种权限很大,还有一种是DB_OWNER权限,这个权限赋给用户一些对数据库的修改.删除.新增数据库表,执行部分存储过程的权限.但是涉及 ...

  10. Guava Immutable 不可变集合

    Immutable是为了创建不可变集合使用,不可变集合在很多情况下能提高系统性能.一般使用 .of()或者.builder()<>().put().build()初始化创建不可变集合