zoukankan      html  css  js  c++  java
  • 认识class Class及其应用

    一.    Class类

    1.    class Class对象描述了运行中的classes和interfaces。通过Class对象可以取得运行中的classes和interfaces的相关信息。
    2.    每个class都有一个相应的Class对象。每个class的Class对象存储于编译后的class所在的文件中。所以,当JVM装载一个.class文件时就会装载一个Class对象。所以,一个class只有一个Class对象。

    二.    Class类的基本应用
    1.    如何获取一个class的Class对象

    1.1    通过Class.forName(classname)方法,该方法接收一个String参数,用以指定要生成哪个class的Class对象.,如Class.forName(“Dog”)。
    1.2    通过类字面常量(class literals)来获得。
    1)    字面常量的形式为:classname.class。如Dog.class。
    2)    对于基本类开,每种基本类型的外覆类都有一个名为TYPE的标准数据,能够产生一个指向相应的基本类型的Class对象的reference。如int.class等同于Integer.TYPE。
    1.3    通过Object.getClass()方法来获得,如

    1. Dog dog = new Dog();
    2. dog.getClass();

    1.4    一个产生Class对象的例子

    1. class Cat{
    2.     Cat() { System.out.println("Init Cat()"); }
    3. static{
    4. System.out.println("Loading Cat");
    5.     }
    6. }
    7. class Dog{
    8.     Dog() { System.out.println("Init Dog()"); }
    9. static{
    10. System.out.println("Loading Dog");
    11.     }
    12. }
    13. class Duck{
    14.     Duck() { System.out.println("Init Duck()"); }
    15. static{
    16. System.out.println("Loading Duck");
    17.     }
    18. }
    19. public class Test{  
    20. public static void main(String[] args){
    21. System.out.println("in main()");
    22. new Cat();
    23. System.out.println("After create Cat()");
    24. try{
    25. Class c1 = Class.forName("Dog"); //(1)
    26. Class c2 = Dog.class;  //(2)
    27.         }
    28. catch(ClassNotFoundException cnfe){
    29.             cnfe.printStackTrace();
    30.         }
    31. System.out.println("After Class.forName(\"Dog\")");
    32.         Duck d = new Duck();
    33. System.out.println("After create Duck()");
    34. Class c3 = d.getClass();
    35. System.out.println("After Class.forName(\"Duck\")");        
    36.     }
    37. }

    运行结果为:
    in main()
    Loading Cat
    Init Cat()
    After create Cat()
    Loading Dog
    After Class.forName("Dog")
    Loading Duck
    Init Duck()
    After create Duck()
    After Class.forName("Duck")
            代码(1)(2)产生了class  Dog的Class对象,但并没有产生class Dog对象。
            **:产生一个class的Class对象不会导致产生一个class对象

     

    2.    用Classc对象进行类型比较

    2.1.    直接比较
    两个Class对象不论是通过equals()函数还是直接用==运算符进行比较,比较的都是类型是否相同。
    2.2.    通过Class.isInstance(object)函数进行比较,如

    1. class Cat{}
    2. class Dog{}
    3. class Duck{}
    4. public class Test{  
    5. public static void main(String[] args){
    6. Class c2, c3;
    7.         Duck d = new Duck();
    8.         c2 = Dog.class;
    9.         c3 = d.getClass();
    10. System.out.println("c2.isIntance(d):" + (c2.isInstance(d)));
    11. System.out.println("c3.isIntance(d):" + (c3.isInstance(d)));
    12.     }
    13. }

    运行结果为:
    c2.isIntance(d):false
    c3.isIntance(d):true
    2.3.    通过instanceof关键字进行比较。但是两个处于不同的继承体系中的类对象和Class对象进行比较,会产生编译错误。

    1. class Cat{}
    2. class Dog{}
    3. class Duck{}
    4. public class Test{  
    5. public static void main(String[] args){
    6. Class c3;
    7. //Object d = new Duck(); (1)
    8.         Duck d = new Duck(); //(2)
    9.         c3 = d.getClass();
    10. System.out.println("d instanceof Dog:" + (d instanceof Dog));//(3)
    11.     }
    12. }

    由于Duck和Dog处于两个不同的继承体系中,所以代码(3)会发生编译错误。如果把代码(2)注释掉,并去掉代码(1)的注释,编译将通过。这是因为所有class都是继承自Object的,所以Object与Dog处于同一个继承体系中,可以进行比较。
    2.4.    综合实例

    1. class Base{}
    2. class Derived{}
    3. public class Test{  
    4. public static void test(Object x){
    5. System.out.println("Testing x of type " + 
    6.             x.getClass());
    7. System.out.println("x instanceof Base " + 
    8.             (x instanceof Base));
    9. System.out.println("x instanceof Derived " + 
    10.             (x instanceof Derived));
    11. System.out.println("Base.isInstance(x) " + 
    12.             Base.class.isInstance(x));
    13. System.out.println("Derived.isInstance(x) " + 
    14.             Derived.class.isInstance(x));
    15. System.out.println("x.getClass() == Base.class " + 
    16.             (x.getClass() == Base.class));
    17. System.out.println("x.getClass() == Derived.class " + 
    18.             (x.getClass() == Derived.class));
    19. System.out.println("x.getClass().equals(Base.class) " + 
    20.             (x.getClass().equals(Base.class)));
    21. System.out.println("x.getClass().equals(Derived.class) " + 
    22.             (x.getClass().equals(Derived.class)));
    23.     }
    24. public static void main(String[] args){
    25.         test(new Base());
    26.         test(new Derived());
    27.     }
    28. }

    运行结果为:
    Testing x of type class Base
    x instanceof Base true
    x instanceof Derived false
    Base.isInstance(x) true
    Derived.isInstance(x) false
    x.getClass() == Base.class true
    x.getClass() == Derived.class false
    x.getClass().equals(Base.class) true
    x.getClass().equals(Derived.class) false
    Testing x of type class Derived
    x instanceof Base false
    x instanceof Derived true
    Base.isInstance(x) false
    Derived.isInstance(x) true
    x.getClass() == Base.class false
    x.getClass() == Derived.class true
    x.getClass().equals(Base.class) false
    x.getClass().equals(Derived.class) true

  • 相关阅读:
    [ jquery 选择器 :hidden ] 此方法选取匹配所有不可见元素,或者type为hidden的元素
    剑指 Offer 03. 数组中重复的数字 哈希
    LeetCode 1736. 替换隐藏数字得到的最晚时间 贪心
    Leetcode 1552. 两球之间的磁力 二分
    Leetcode 88. 合并两个有序数组 双指针
    LeetCode 1744. 你能在你最喜欢的那天吃到你最喜欢的糖果吗?
    LeetCode 1743. 相邻元素对还原数组 哈希
    LeetCode 1745. 回文串分割 IV dp
    剑指 Offer 47. 礼物的最大价值 dp
    剑指 Offer 33. 二叉搜索树的后序遍历序列 树的遍历
  • 原文地址:https://www.cnblogs.com/pony/p/820116.html
Copyright © 2011-2022 走看看