当前位置: 首页 > 编程笔记 >

简单了解JAVA中类、实例与Class对象

曹浩
2023-03-14
本文向大家介绍简单了解JAVA中类、实例与Class对象,包括了简单了解JAVA中类、实例与Class对象的使用技巧和注意事项,需要的朋友参考一下


类是面向对象编程语言的一个重要概念,它是对一项事物的抽象概括,可以包含该事物的一些属性定义,以及操作属性的方法。面向对象编程中,我们都是以类来编码。

实例

简单理解,就是new,就是对类的实例化,创建这个类对应的实际对象,类只是对事物的描述,而实例化就相当于为这个描述新开辟了一块内存,可以改变这块区域里的各种属性(成员变量),当然,也可以实例化多块区域,只是不同的对象而已。

Class

注意这里C大写了,与类概念区分开,在java里,Class是一个实实在在的类,在包 java.lang 下,有这样一个Class.java文件,它跟我们自己定义的类一样,是一个实实在在的类,Class对象就是这个Class类的实例了。

在Java里,所有的类的根源都是Object类,而Class也不例外,它是继承自Object的一个特殊的类,它内部可以记录类的成员、接口等信息,也就是在Java里,Class是一个用来表示类的类。(o(∩_∩)o 有点绕啊,抓住关键一点,Class是一个实实在在的类,可以为它创建实例,也就是本文后面提到的Class对象,也看叫做Class实例)。

java提供了下面几种获取到类的Class对象的方法:

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

2) 使用Class类的静态方法forName("包名+类名"),用类的名字获取一个Class实例

3)运用 类名.class 的方式来获取Class实例;

我们知道java世界是运行在JVM之上的,我们编写的类代码,在经过编译器编译之后,会为每个类生成对应的.class文件,这个就是JVM可以加载执行的字节码。运行时期间,当我们需要实例化任何一个类时,JVM会首先尝试看看在内存中是否有这个类,如果有,那么会直接创建类实例;如果没有,那么就会根据类名去加载这个类,当加载一个类,或者当加载器(class loader)的defineClass()被JVM调用,便会为这个类产生一个Class对象(一个Class类的实例),用来表达这个类,该类的所有实例都共同拥有着这个Class对象,而且是唯一的。

总结

在java里,类只是信息描述的,写明了有哪些内部属性及接口,你可以理解为是定义了一套规则;而Class对象在java里被用来对类的情况进行表述的一个实例,也就是是类的实际表征,可以理解为是对规则的图表化,这样JVM才能直观的看懂,可以看做是一个模版;而类的实例化对象,就是通过模版,开辟出的一块内存进行实际的使用。

例子:

我们通过一个例子来理解Class实例,为了说明方便,我们新建一个包名深点的类。

新建Name.java(当然,该文件要放在com\dxjia\sample的目录下)

package com.dxjia.sample;
public class Name {
  static int count = 0;
  static {
    count++;
    System.out.println("Name Class Loaded! count = [" + count + "]" );
  }
  public Name() {
    System.out.println("Name Constructor called!");
  }
}

再在根目录新建一个Test主类

import com.dxjia.sample.Name;
public class Test {
  static {
    Name mName;
    System.out.println("Test Class loaded");
  }
  public static void main(String[] args) {
    System.out.println("entern Test main()");
    // Name.class
    Class mClassPointClass;
    // Class.forName("完整包名+类名")
    Class mClassForName;
    // new 对象后,对象.getClass()
    Class mClassObjectPointClass1;
    Class mClassObjectPointClass2;
    try {
      //测试 类名.class
      mClassPointClass = Name.class;
      System.out.println("mClassPointClass = " + mClassPointClass);      
      //测试Class.forName()
      mClassForName = Class.forName("com.dxjia.sample.Name");
      System.out.println("mClassForName = " + mClassForName);

      //测试Object.getClass()
      Name name1 = new Name();
      mClassObjectPointClass1 = name1.getClass();
      System.out.println("mClassObjectPointClass1 = " + mClassObjectPointClass1);
    } catch (ClassNotFoundException e) {
      // TODO Auto-generated catch block 
      e.printStackTrace();
      return;
    } 
    Name name2;
    System.out.println("defined one Name object");
    name2 = new Name();
    System.out.println("Name object instance done!");    
    mClassObjectPointClass2 = name2.getClass();
    if (mClassForName == mClassPointClass
      && mClassPointClass == mClassObjectPointClass1
      && mClassObjectPointClass1 == mClassObjectPointClass2) {
      System.out.println("all the Class object equal...");
    }
  }
}

分别对他们进行编译:

javac com\dxjia\sample\Name.java
 javac Test.java

执行:

java Test

代码中使用了static静态代码块来进行实验,一个类的运行,JVM做会以下几件事情 1、类装载 2、链接 3、初始化 4、实例化;而初始化阶段做的事情是初始化静态变量和执行静态方法等的工作,而且永远只执行一次。

输出结果:

Test Class loaded
entern Test main()
mClassPointClass = class com.dxjia.sample.Name
Name Class Loaded! count = [1]
mClassForName = class com.dxjia.sample.Name
Name Constructor called!
mClassObjectPointClass1 = class com.dxjia.sample.Name
defined one Name object
Name Constructor called!
Name object instance done!
all the Class object equal...

通过结果可以看出在使用 类名.class获得Class实例时,并不会触发类的初始化,而 Class.forName方法就会触发,当然实例化对象肯定也是会触发的,但因为static代码块只执行一次,所以不会再有打印,最后的打印,说明一个类的Class实例只有唯一的一个。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍简单了解JAVA变量类型及代码实例,包括了简单了解JAVA变量类型及代码实例的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了简单了解JAVA变量类型及代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在Java语言中,有类变量、实例变量、局部变量,所有的变量在使用前必须声明。声明普通变量如下: 类变量 类变量也称为

  • 本文向大家介绍简单了解java类的初始化以及类的实例化,包括了简单了解java类的初始化以及类的实例化的使用技巧和注意事项,需要的朋友参考一下 前言 上一篇我们知道了一个类的生命周期是:加载->验证->准备->解析->初始化->使用->卸载。 当初始化完成以后,一个类所有的类变量(被static修饰的变量)都被赋值。但是未被static修饰的成员变量又是何时被赋值的呢? 一个类何时会被初始化 一个

  • 本文向大家介绍实例详解java Struts2的配置与简单案例,包括了实例详解java Struts2的配置与简单案例的使用技巧和注意事项,需要的朋友参考一下 Struts2的配置与简单案例: 1. 创建一个dynamic web project(创建时让它自动生成web.xml文件) 2.引入相关jar包 3.在web.xml中进行配置 (启动tomcat服务器之后第一个加载的文件就是web.x

  • 本文向大家介绍Android  PreferenceActivity与PreferenceFragment详解及简单实例,包括了Android  PreferenceActivity与PreferenceFragment详解及简单实例的使用技巧和注意事项,需要的朋友参考一下 Android  PreferenceActivity与PreferenceFragment 前言 转来转去又回到了Andr

  • 本文向大家介绍java Spring AOP详解及简单实例,包括了java Spring AOP详解及简单实例的使用技巧和注意事项,需要的朋友参考一下 一、什么是AOP   AOP(Aspect Oriented Programming)面向切面编程不同于OOP(Object Oriented Programming)面向对象编程,AOP是将程序的运行看成一个流程切面,其中可以在切面中的点嵌入程序

  • 本文向大家介绍Java Class类 isAnnotationPresent()方法与示例,包括了Java Class类 isAnnotationPresent()方法与示例的使用技巧和注意事项,需要的朋友参考一下 Class类方法 isAnnotationPresent()方法在java.lang包中可用。 当给定类型的注释存在于此实体上时,isAnnotationPresent()方法将返回t