Java语言class类用法及泛化(详解)

这篇文章主要介绍了Java语言class类用法及泛化(详解),大家都知道Java程序在运行过程中,对所有的对象进行类型标识,也就是RTTI。这项信息记录了每个对象所属的类。虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类型信息的类是Class类。Class类封装一个对象和接口运行时的状态,当装载类时,Class类型的对象自动创建,具体内容介绍如下:

说白了就是:

Class类也是类的一种,只是名字和class关键字高度相似。Java是大小写敏感的语言。
Class类的对象内容是你创建的类的类型信息,比如你创建一个shapes类,那么,Java会生成一个内容是shapes的Class类的对象
Class类的对象不能像普通类一样,以 new shapes() 的方式创建,它的对象只能由JVM创建,因为这个类没有public构造函数
Class类的作用是运行时提供或获得某个对象的类型信息,和C++中的typeid()函数类似。这些信息也可用于反射。

1.Class类原理

我们都知道所有的java类都是继承了object这个类,在object这个类中有一个方法:getclass().这个方法是用来取得该类已经被实例化了的对象的该类的引用,这个引用指向的是Class类的对象。我们自己无法生成一个Class对象(构造函数为private),而 这个Class类的对象是在当各类被调入时,由 Java 虚拟机自动创建 Class 对象,或通过类装载器中的 defineClass 方法生成。我们生成的对象都会有个字段记录该对象所属类在CLass类的对象的所在位置。如下图所示:

2.获得一个Class类对象

第一种办法,Class类的forName函数

代码如下:

public class shapes{} 
Class obj= Class.forName("shapes");

第二种办法,使用对象的getClass()函数

代码如下:

public class shapes{}
shapes s1=new shapes();
Class obj=s1.getClass();
Class obj1=s1.getSuperclass();//这个函数作用是获取shapes类的父类的类型

第三种办法,使用类字面常量

代码如下:

Class obj=String.class;
Class obj1=int.class;

注意,使用这种办法生成Class类对象时,不会使JVM自动加载该类(如String类)。而其他办法会使得JVM初始化该类。

3.使用Class类的对象来生成目标类的实例

生成不精确的object实例

获取一个Class类的对象后,可以用 newInstance() 函数来生成目标类的一个实例。然而,该函数并不能直接生成目标类的实例,只能生成object类的实例

代码如下:

Class obj=Class.forName("shapes");
Object ShapesInstance=obj.newInstance();

使用泛化Class引用生成带类型的目标实例

代码如下:

Class<shapes> obj=shapes.class;
shapes newShape=obj.newInstance();

因为有了类型限制,所以使用泛化Class语法的对象引用不能指向别的类。

代码如下:

Class obj1=int.class;
Class<Integer> obj2=int.class;
obj1=double.class;
//obj2=double.class;

这一行代码是非法的,obj2不能改指向别的类了
然而,有个灵活的用法,使得你可以用Class的对象指向基类的任何子类。

代码如下:

Class<? extends Number> obj=int.class;
obj=Number.class;
obj=double.class;

因此,以下语法生成的Class对象可以指向任何类。

代码如下:

Class<?> obj=int.class;
obj=double.class;
obj=shapes.class;

最后一个奇怪的用法是,当你使用这种泛型语法来构建你手头有的一个Class类的对象的基类对象时,必须采用以下的特殊语法

代码如下:

public class shapes{}
class round extends shapes{}
Class<round> rclass=round.class;
Class<? super round> sclass= rclass.getSuperClass();
//Class<shapes> sclass=rclass.getSuperClass();

在这里需要大家注意:明知道round的基类就是shapes,但是却不能直接声明 Class < shapes >,必须使用特殊语法Class < ? super round >

以上内容介绍就是针对Java语言class类用法及泛化(详解)全部内容,希望大家喜欢以上内容介绍。

(0)

相关推荐

  • C语言与JAVA的区别是什么(推荐)

    首先来说说他们各自的历史:C语言的发展历史 C语言的发展颇为有趣.它的原型ALGOL 60语言.(也成为A语言) 1963年,剑桥大学将ALGOL 60语言发展成为CPL(Combined Programming Language)语言. 1967年,剑桥大学的Matin Richards 对CPL语言进行了简化,于是产生了BCPL语言. 1970年,美国贝尔实验室的Ken Thompson将BCPL进行了修改,并为它起了一个有趣的名字"B语言".意思是将CPL语言煮干,提炼出它的精华

  • 深入理解:Java是类型安全的语言,而C++是非类型安全的语言

    有过C++开发经验的人会发现,我们可以将0作为false,非零作为true.一个函数即使是bool类型的,但是我们还是可以返回int类型的,并且自动将0转换成false,非零转换成true.代码实例如下: 复制代码 代码如下: #include<iostream> #include<stdlib.h> using namespace std; bool fun()//函数返回类型是bool,但是我们在函数中可以返回int类型. {     return 1; } void main

  • Java语言class类用法及泛化(详解)

    这篇文章主要介绍了Java语言class类用法及泛化(详解),大家都知道Java程序在运行过程中,对所有的对象进行类型标识,也就是RTTI.这项信息记录了每个对象所属的类.虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类型信息的类是Class类.Class类封装一个对象和接口运行时的状态,当装载类时,Class类型的对象自动创建,具体内容介绍如下: 说白了就是: Class类也是类的一种,只是名字和class关键字高度相似.Java是大小写敏感的语言. Class类的对象内容是你创

  • Java中Properties类的操作实例详解

    Java中Properties类的操作实例详解 知识学而不用,就等于没用,到真正用到的时候还得重新再学.最近在看几款开源模拟器的源码,里面涉及到了很多关于Properties类的引用,由于Java已经好久没用了,而这些模拟器大多用Java来写,外加一些脚本语言Python,Perl之类的,不得已,又得重新拾起.本文通过看<Java编程思想>和一些网友的博客总结而来,只为简单介绍Properties类的相关操作.  一.Java Properties类 Java中有个比较重要的类Properti

  • Java语言中的内存泄露代码详解

    Java的一个重要特性就是通过垃圾收集器(GC)自动管理内存的回收,而不需要程序员自己来释放内存.理论上Java中所有不会再被利用的对象所占用的内存,都可以被GC回收,但是Java也存在内存泄露,但它的表现与C++不同. JAVA中的内存管理 要了解Java中的内存泄露,首先就得知道Java中的内存是如何管理的. 在Java程序中,我们通常使用new为对象分配内存,而这些内存空间都在堆(Heap)上. 下面看一个示例: public class Simple { public static vo

  • Go语言基础map用法及示例详解

    目录 概述 语法 声明和初始化 读取 删除 遍历 总结 示例 概述 map是基于key-value键值对的无序的集合 Go语言中的map是引用类型 必须初始化才能使用. 语法 声明和初始化 配合make使用,否则是nil var map[KeyType]ValueType //KeyType:表示键的类型 //ValueType:表示键对应的值的类型 make(map[KeyType]ValueType, [cap]) //cap表示map的容量,该参数虽然不是必须的,但是我们应该在初始化map

  • Go语言基础数组用法及示例详解

    目录 概述 语法 注意 示例 概述 固定长度,数组声明后长度便不能再修改 只能存储一种特定类型元素的序列 语法 编号 方式 代码示例 1 直接声明 var arr [3]int 2 make arr:=make([]int,3) 3 字面量 arr:=[3]int{1,2,3} 4 自动识别长度 arr:=[-]int{1,2,3} 5 二维数组 arr := [4][4]int{{1}, {1, 2}, {1, 2, 3}} 6 new arrp := new([10]int) 7 下标取值

  • Java中Optional类及orElse方法详解

    目录 引言 Java 中的 Optional 类 ofNullable() 方法 orElse() 方法 案例 orElseGet() 方法 案例 orElse() 与 orElseGet() 之间的区别 引言 为了让我更快的熟悉代码,前段时间组长交代了一个小任务,大致就是让我整理一下某个模块中涉及的 sql,也是方便我有目的的看代码,也是以后方便他们查问题(因为这个模块,涉及的判断很多,所以之前如果 sql 出错了,查问题比较繁琐). 昨天算是基本完成了,然后今天组长就让给我看一个该模块的缺陷

  • Java文件与类动手动脑实例详解

    动手动脑1: 使用Files. walkFileTree()找出指定文件夹下所有大于指定大小(比如1M)的文件. package classJava; import java.io.IOException; import java.nio.file.FileSystems; import java.nio.file.FileVisitOption; import java.nio.file.FileVisitResult; import java.nio.file.FileVisitor; im

  • java中Calendar类用法实例详解

    本文实例讲述了java中Calendar类用法.分享给大家供大家参考,具体如下: java中的Calendar在开发中经常被忽略,这篇博客总结一下这个类,对后面项目中使用时期的时候有帮助. Calendar常量(field)的作用 Calendar cal = Calendar.getInstance(); cal.get(Calendar.DATE);//-----------------------当天 1-31 cal.get(Calendar.DAY_OF_MONTH);//------

  • Java Arrays工具类用法详解

    本文实例讲述了Java Arrays工具类用法.分享给大家供大家参考,具体如下: Arrays类 功能描述 Arrays类是一个工具类,其中包含了数组操作的很多方法,比如搜索和排序: Arrays类中的方法均为static修饰的,可以直接通过Arrays.xxx(xxx)的形式调用方法. 几个重要方法   1.asList(T... a) 由给定的数组a,返回一个固定大小的List对象.在这里,着重解释一下前面这句话的深层含义,我们可以看Arrays类的源码,来帮助我们理解. 生成的List对象

  • Java类的继承实例详解(动力节点Java学院整理)

    一.你了解类吗? 在Java中,类文件是以.java为后缀的代码文件,在每个类文件中最多只允许出现一个public类,当有public类的时候,类文件的名称必须和public类的名称相同,若不存在public,则类文件的名称可以为任意的名称(当然以数字开头的名称是不允许的). 在类内部,对于成员变量,如果在定义的时候没有进行显示的赋值初始化,则Java会保证类的每个成员变量都得到恰当的初始化: 1)对于  char.short.byte.int.long.float.double等基本数据类型的

随机推荐