zoukankan      html  css  js  c++  java
  • Java Class 与 Object

    平时看代码时,总是碰到这些即熟悉又陌生的名次,每天都与他们相见,但见面后又似曾没有任何的交集,所以今天我就来认识下这两个江湖侠客的背景:

    CLASS

    在Java中,每个class都有一个相应的Class对象。也就是说,当我们编写一个类,编译完成后,在生成的.class文件中,就会产生一个Class对象,用于表示这个类的类型信息

    获取Class实例的三种方式:

    (1)利用对象调用getClass()方法获取该对象的Class实例;

    (2)使用Class类的静态方法forName(),用类的名字获取一个Class实例(staticClass forName(String className) Returns the Classobject associated with the class or interface with the given stringname. );

    (3)运用.class的方式来获取Class实例,对于基本数据类型的封装类,还可以采用.TYPE来获取相对应的基本数据类型的Class实例

    在newInstance()调用类中缺省的构造方法 ObjectnewInstance()(可在不知该类的名字的时候,常见这个类的实例) Creates a new instance of the class represented by this Classobject.

    在运行期间,如果我们要产生某个类的对象,Java虚拟机(JVM)会检查该类型的Class对象是否已被加载。如果没有被加载,JVM会根据类的名称找到.class文件并加载它。一旦某个类型的Class对象已被加载到内存,就可以用它来产生该类型的所有对象

    Class对象的生成方式如下:

    1.Class.forName("类名字符串") (注意:类名字符串必须是全称,包名+类名);

    2.类名.class;

    3.实例对象.getClass();

    package baseJava;

    public class TestClass {

     /**
      * @param args
      * 2013-4-11 上午10:30:05
      * @author zhao_xingcai
      */
     public static void main(String[] args) {
      // TODO Auto-generated method stub
      try {
     
       //测试Class.forName() 
       Class classForName = Class.forName("baseJava.TestClass");
       System.out.println("classForName  : [" + classForName + "]");
       
       //测试类名.class
       Class classForName2 = TestClass.class;
       System.out.println("classForName2 : [" + classForName2 + "]");
       
       //测试Object.getClass()
       TestClass newInstance = new TestClass();
       System.out.println("newInstance  : [" + newInstance.getClass() + "]");
       
       //hashCode指的是内存的地址
       System.out.println("newInstanceHashCode  : [" + newInstance.hashCode() + "]");
       
       //toString代表该对象的一个字符串
       //格式:this.getClass().getName() + '@' + Integer.toHexString(hashCode())
       System.out.println("newInstanceToString  : [" + newInstance.toString() + "]");
       
       
      }catch (ClassNotFoundException e) {
       e.printStackTrace();
      }
     }
     /*
      * 构造函数
      */
     public TestClass() {
      System.out.println(" 构造函数");
     }
     
     /*
      * 静态的参数初始化 
      */
     static {
      System.out.println("静态的参数初始化  ");
     }
     
     /*
      * 非静态的参数初始化 
      */
     {
      System.out.println("非静态的参数初始化  ");
     }

    }

    运行结果如下:

    静态的参数初始化

    classForName  : [class baseJava.TestClass]

    classForName2 : [class baseJava.TestClass]

    非静态的参数初始化

    构造函数

    newInstance  : [class baseJava.TestClass]

    newInstanceHashCode  : [12677476]

    newInstanceToString  : [baseJava.TestClass@c17164]

    也就是说:

    三种方法生成CLASS对象是一样的,因为CLASS在JVM的名称是一样的,但是三种生成的方法略有不同:静态的方法属性初始化,是在加载类的时 候初始化。而非静态方法属性初始化,是new类实例对象的时候加载。当我们编写一个新的JAVA类时,JVM就会帮我们编译成CLASS对象,存放在同名 的.class文件中,在运行时,当需要生成这个类的对象时,JVM就会检查此类是否装载到内存中,会没有装载,就把.class装载到内存中,若装载 过,则根据.class生成对象。

  • 相关阅读:
    JAVA学习日报 8.2
    软件工程书籍《大道至简》读后感
    【CSAPP】第三章 程序的机器级表示
    【算法】KMP
    【经验总结】CodeBlocks使用mingw64
    【C++】指针和函数
    【C++】字符串处理
    【C++】自定义数据类型
    【C++】STL容器
    【C++】STL算法
  • 原文地址:https://www.cnblogs.com/1995hxt/p/5341823.html
Copyright © 2011-2022 走看看