简单了解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实例只有唯一的一个。

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

(0)

相关推荐

  • Java中通过Class类获取Class对象的方法详解

    前言 本文主要给大家介绍的是关于Java通过Class类获取Class对象的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 阅读API的Class类得知,Class 没有公共构造方法.Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的 获取Class对象的三种方式(实例采用Person类) 方式1:通过Object类的getObject()方法 Person p = new Person(); Class c

  • java中staticclass静态类详解

    一般情况下是不可以用static修饰类的.如果一定要用static修饰类的话,通常static修饰的是匿名内部类. 在一个类中创建另外一个类,叫做成员内部类.这个成员内部类可以静态的(利用static关键字修饰),也可以是非静态的.由于静态的内部类在定义.使用的时候会有种种的限制.所以在实际工作中用到的并不多. 在开发过程中,内部类中使用的最多的还是非静态地成员内部类.不过在特定的情况下,静态内部类也能够发挥其独特的作用. 一.静态内部类的使用目的. 在定义内部类的时候,可以在其前面加上一个权限

  • 深入浅析Java中Static Class及静态内部类和非静态内部类的不同

    java中的类可以是static吗?答案是可以.在java中我们可以有静态实例变量.静态方法.静态块.类也可以是静态的. java允许我们在一个类里面定义静态类.比如内部类(nested class).把nested class封闭起来的类叫外部类.在java中,我们不能用static修饰顶级类(top level class).只有内部类可以为static.      静态内部类和非静态内部类之间到底有什么不同呢?下面是两者间主要的不同. (1)内部静态类不需要有指向外部类的引用.但非静态内部

  • 基于java类路径classpath和包的实例讲解

    类路径(classpath) java编译器编译.java文件和java虚拟机执行.class文件时的路径和写法不一样. 在没有设置任何classpath环境变量的情况下,javac可以编译全路径的.java文件.例如: javac d:\myjava\HelloWorld.java 编译后,在.java同路径目录下生成class文件. 默认java虚拟机要从classpath环境变量的路径中搜索class文件去执行,对于java虚拟机来说,这不是类文件,而是类.它只有类路径,而没有文件系统路径

  • 浅谈Java中的class类

    Class 类是在Java语言中定义一个特定类的实现.一个类的定义包含成员变量,成员方法,还有这个类实现的接口,以及这个类的父类.Class类的对象用于表示当前运行的 Java 应用程序中的类和接口. 比如:每个数组均属于一个 Class 类对象,所有具有相同元素类型和维数的数组共享一个Class 对象.基本的 Java 类型(boolean, byte, char, short,int, long, float 和 double) 和 void 类型也可表示为 Class 对象. 以下示例使用

  • Java中ClassLoader类加载学习总结

    双亲委派模型 类加载这个概念应该算是Java语言的一种创新,目的是为了将类的加载过程与虚拟机解耦,达到"通过类的全限定名来获取描述此类的二进制字节流"的目的.实现这个功能的代码模块就是类加载器.类加载器的基本模型就是大名鼎鼎的双亲委派模型(Parents Delegation Model).听上去很牛掰,其实逻辑很简单,在需要加载一个类的时候,我们首先判断该类是否已被加载,如果没有就判断是否已被父加载器加载,如果还没有再调用自己的findClass方法尝试加载.基本的模型就是这样(盗图

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

    类 类是面向对象编程语言的一个重要概念,它是对一项事物的抽象概括,可以包含该事物的一些属性定义,以及操作属性的方法.面向对象编程中,我们都是以类来编码. 实例 简单理解,就是new,就是对类的实例化,创建这个类对应的实际对象,类只是对事物的描述,而实例化就相当于为这个描述新开辟了一块内存,可以改变这块区域里的各种属性(成员变量),当然,也可以实例化多块区域,只是不同的对象而已. Class 注意这里C大写了,与类概念区分开,在java里,Class是一个实实在在的类,在包 java.lang 下

  • java中类和对象的详细介绍

    面向过程和面向对象 C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题. JAVA是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成. 面向过程注重的是过程,在整个过程中所涉及的行为,就是功能. 面向对象注重的是对象,也就是参与过程所涉及到的主体.是通过逻辑将一个个功能实现连接起来 [面向对象概念] 面向对象是思考问题的一种思考方式,是一种思想.比如:概念与实例.理论与实践.名和实等等. 类就是一类对象的统称.对象就是这一类具体化的一个

  • Java中类与对象的相关知识点总结

    目录 一.面向过程与面向对象的理解 二.类与对象的理解与认识 三.类的成员 1.字段/属性/成员变量 2.对null的基本认识 3.方法 (method) 4.static 关键字 四.封装 1. private实现封装 2.getter和setter方法 五.构造方法 1.构造方法的基本语法及使用 2.this关键字 六.Java中的代码块 1.认识代码块 2.普通代码块 3.构造代码块 4.静态代码块 七.toString方法 1.重写println的toString方法 2.匿名对象 八.

  • Java Web 简单的分页显示实例代码

    本文通过两个方法:(1)计算总的页数. (2)查询指定页数据,实现简单的分页效果. 思路:首先得在 DAO 对象中提供分页查询的方法,在控制层调用该方法查到指定页的数据,在表示层通过 EL 表达式和 JSTL 将该页数据显示出来. 先给大家展示下效果图: 题外话:该分页显示是用 "表示层-控制层-DAO层-数据库"的设计思想实现的,有什么需要改进的地方大家提出来,共同学习进步.废话不多说了,开始进入主题,详细步骤如下所示: 1.DAO层-数据库 JDBCUtils 类用于打开和关闭数据

  • 简单记事本java源码实例

    本文实例讲述了简单记事本java实现代码.分享给大家供大家参考.具体如下: 完整代码如下: 复制代码 代码如下: import java.awt.*; import java.io.*; import java.awt.datatransfer.*; import java.awt.event.*;   public class Main extends Frame implements ActionListener {         private static final long ser

  • java实现一个简单的Web服务器实例解析

    Web服务器也称为超文本传输协议服务器,使用http与其客户端进行通信,基于java的web服务器会使用两个重要的类, java.net.Socket类和java.net.ServerSocket类,并基于发送http消息进行通信. 这个简单的Web服务器会有以下三个类: *HttpServer *Request *Response 应用程序的入口在HttpServer类中,main()方法创建一个HttpServer实例,然后调用其await()方法,顾名思义,await()方法会在指定端口上

  • 简单了解JAVA变量类型及代码实例

    这篇文章主要介绍了简单了解JAVA变量类型及代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在Java语言中,有类变量.实例变量.局部变量,所有的变量在使用前必须声明.声明普通变量如下: public int a,b,c; //整型变量 public float f = 3.14f: //单精度浮点型变量,并赋值 public double d; //双精度浮点型变量 public byte b =22: //整型变量 public S

  • java中类和对象的知识点总结

    虽然说最近带着小伙伴们学了不少java中的知识点,但是对于最基本的概念,是每个小伙伴必不可少学习的要点.我们需要时时对它们进行复习和考察,才不会在后期结合其他的知识点而不会使用,下面小编就为大家带来java中类和对象的讲解,一起往下看看吧. 1.类和对象 类是一类对象的统称. 对象是这个类具体的一个实例. 基本语法为: class 类名{ //属性 //方法 } //例 class person{ public int age; public String name; public String

  • 带你快速了解Java中类和对象的关系

    本文重点解读Java里的类和对象的关系 1.首先介绍两个概念 类:类是对现实生活中一类具有共同属性和行为事务的抽象,确定对象将会拥有的属性和行为. 对象:对象是类的一个实例(对象不是找个女朋友),有状态和行为.例如,一条狗是一个对象,它的状态有:颜色.名字.品种:行为有:摇尾巴.叫.吃等. 概念比较抽象,我们来讲一个具体的项目开发场景,来理解类和对象.假如,我们现在要开发一套图书管理系统,我们如何在程序里面表示出一本书呢?这个时候就用到了类的概念,我们可以定义一个表示书的数据类型,这个新的数据类

  • Java中类赋值的解释实例详解

    Java中类赋值的解释实例详解 Java是面向对象的存储语言,进行的是信息的传递,也就是类的赋值,实际上他们占用的是同样的存储空间: 下面上一个自己写的例子: 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

随机推荐