• Java进阶04 RTTI


    链接地址:http://www.cnblogs.com/vamei/archive/2013/04/14/3013985.html

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

    运行时类型识别(RTTI, Run-Time Type Identification)是Java中非常有用的机制,在Java运行时,RTTI维护类的相关信息。

    多态(polymorphism)是基于RTTI实现的。RTTI的功能主要是由Class类实现的。

    Class类

    Class类是"类的类"(class of classes)。如果说类是对象的抽象和集合的话,那么Class类就是对类的抽象和集合。

    每一个Class类的对象代表一个其他的类。比如下面的程序中,Class类的对象c1代表了Human类,c2代表了Woman类。

    复制代码
    public class Test
    {
        public static void main(String[] args)
        {
            Human aPerson = new Human();
            Class c1      = aPerson.getClass();
            System.out.println(c1.getName());
    
    
            Human anotherPerson = new Woman();
            Class c2      = anotherPerson.getClass();
            System.out.println(c2.getName());  
    } } class Human {
    /** * accessor */ public int getHeight() { return this.height; } /** * mutator */ public void growHeight(int h) { this.height = this.height + h; } private int height; } class Woman extends Human { /** * new method */ public Human giveBirth() { System.out.println("Give birth"); return (new Human()); } }
    复制代码

    当我们调用对象的getClass()方法时,就得到对应Class对象的引用。

    在c2中,即使我们将Women对象的引用向上转换为Human对象的引用,对象所指向的Class类对象依然是Woman。

    Java中每个对象都有相应的Class类对象,因此,我们随时能通过Class对象知道某个对象“真正”所属的类。无论我们对引用进行怎样的类型转换,对象本身所对应的Class对象都是同一个。当我们通过某个引用调用方法时,Java总能找到正确的Class类中所定义的方法,并执行该Class类中的代码。由于Class对象的存在,Java不会因为类型的向上转换而迷失。这就是多态的原理。

    getClass: 我是谁?

    除了getClass()方法外,我们还有其他方式调用Class类的对象。

    复制代码
    public class Test
    {
        public static void main(String[] args)
        {
            Class c3      = Class.forName("Human");
            System.out.println(c1.getName());
    
            Class c4      = Woman.class
            System.out.println(c2.getName());  
        }
    }
    复制代码

    上面显示了两种方式:

    • forName()方法接收一个字符串作为参数,该字符串是类的名字。这将返回相应的Class类对象。
    • Woman.class方法是直接调用类的class成员。这将返回相应的Class类对象。

    Class类的方法

    Class对象记录了相应类的信息,比如类的名字,类所在的包等等。我们可以调用相应的方法,比如:

    getName()         返回类的名字

    getPackage()      返回类所在的包

    可以利用Class对象的newInstance()方法来创建相应类的对象,比如:

    Human newPerson = c1.newInstance();  

    newInstance()调用默认的不含参数的构建方法。

    我们可以获得类定义的成员:

    getFields()       返回所有的public数据成员

    getMethods()      返回所有的public方法

    可以进一步使用Reflection分析类。这里不再深入。

    Class类更多的方法可查询官方文档:

    http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Class.html

    Class类的加载

    当Java创建某个类的对象,比如Human类对象时,Java会检查内存中是否有相应的Class对象。

    如果内存中没有相应的Class对象,那么Java会在.class文件中寻找Human类的定义,并加载Human类的Class对象。

    在Class对象加载成功后,其他Human对象的创建和相关操作都将参照该Class对象。

     

    欢迎继续阅读“Java快速教程”系列文章

    如果一件事情你觉得难的完不成,你可以把它分为若干步,并不断寻找合适的方法。最后你发现你会是个超人。不要给自己找麻烦,但遇到麻烦绝不怕,更不要退缩。 电工查找电路不通点的最快方法是:分段诊断排除,快速定位。你有什么启示吗? 求知若饥,虚心若愚。 当你对一个事情掌控不足的时候,你需要做的就是“梳理”,并制定相应的规章制度,并使资源各司其职。
  • 相关阅读:
    Blue:贪心,单调队列
    建设城市(city):组合数,容斥原理
    [考试反思]0809NOIP模拟测试15:解剖
    [考试反思]0807NOIP模拟测试14:承认
    [考试反思]阶段性总结:NOIP模拟测试7~13
    [考试反思]0805NOIP模拟测试13:窒息
    [考试反思]0803NOIP模拟测试12:偿还
    [态度]关于博客
    差异:后缀数组(wzz模板理解),决策单调性
    [考试反思]0801NOIP模拟测试11
  • 原文地址:https://www.cnblogs.com/wvqusrtg/p/4992526.html
Copyright © 2020-2023  润新知