杰瑞科技汇

Java中class与class有何区别与联系?

  1. class 关键字:这是Java语言中的一个关键字,用来定义类。
  2. Class:这是Java API中的一个,位于 java.lang 包下,它是一个“类的类”(Class of classes),用来描述类和接口在运行时的状态信息。
  • class (小写) 是你在写代码时使用的工具,用来创建一个自定义的类型。
  • Class (大写) 是程序在运行时存在的对象,它代表了你用 class 关键字创建的那个类型。

下面我们来详细解释这两者的区别、联系以及各自的用途。

Java中class与class有何区别与联系?-图1
(图片来源网络,侵删)

class 关键字 - 创建蓝图

class 是Java中最基础、最重要的关键字之一,它是一个编译时的概念,是程序员用来构建代码结构的工具。

作用class 关键字用于定义一个,类是创建对象的模板或蓝图,它定义了对象将拥有的属性(字段/成员变量)和行为(方法)。

示例: 下面我们用 class 关键字创建一个 Person 类,这个 Person 类就是一个蓝图,用来描述“人”这个概念应该有什么属性和功能。

// 使用 class 关键字定义一个名为 Person 的类
public class Person {
    // 1. 字段:描述对象的属性
    private String name;
    private int age;
    // 2. 构造方法:用于创建和初始化对象
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    // 3. 方法:描述对象的行为
    public void sayHello() {
        System.out.println("Hello, my name is " + this.name + ", and I am " + this.age + " years old.");
    }
    // Getter 方法
    public String getName() {
        return name;
    }
}

class 关键字

Java中class与class有何区别与联系?-图2
(图片来源网络,侵删)
  • 类型:Java 语言关键字。
  • 用途:定义类、接口(虽然用 interface 关键字,但底层逻辑类似)、枚举等。
  • 时机:在编译时使用,是源代码的一部分。
  • 本质:一个模板,用于在运行时创建实例(对象)。

Class 类 - 运行时的“身份证”

Class 类是一个特殊的类,它的对象只能由Java虚拟机(JVM)自动创建,每当一个类被加载到内存中时,JVM就会自动为这个类创建一个对应的 Class 对象。

作用Class 对象是反射机制的入口,它包含了关于该类的完整信息,

  • 类的名称 (getName())
  • 父类 (getSuperclass())
  • 实现的接口 (getInterfaces())
  • 所有的字段 (getFields(), getDeclaredFields())
  • 所有的方法 (getMethods(), getDeclaredMethods())
  • 构造方法 (getConstructors(), getDeclaredConstructors())
  • 注解信息 (getAnnotations())
  • 等等...

如何获取 Class 对象?

有三种主要方式:

Java中class与class有何区别与联系?-图3
(图片来源网络,侵删)

使用 .class 语法(最推荐) 这种方式最简单、最安全,在编译时就能检查类型。

// 获取 Person 类对应的 Class 对象
Class<?> personClass = Person.class; 

使用对象的 getClass() 方法 当你已经有一个类的实例对象时,可以通过调用它的 getClass() 方法来获取其 Class 对象。

Person person = new Person("Alice", 30);
Class<?> personClass = person.getClass(); 

使用 Class.forName() 方法(字符串形式) 当你只知道类的全限定名(从配置文件或数据库中读取)时,可以使用这种方式。注意:如果类名错误或类加载失败,会抛出 ClassNotFoundException

try {
    Class<?> personClass = Class.forName("com.example.Person"); // 假设 Person 类在这个包下
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}

使用 Class 对象进行反射操作: 一旦你获得了 Class 对象,你就可以在运行时动态地操作这个类。

import java.lang.reflect.Method;
public class ReflectionExample {
    public static void main(String[] args) {
        try {
            // 1. 获取 Class 对象
            Class<?> personClass = Class.forName("Person"); // 确保 Person 类在 classpath 中
            // 2. 创建实例 (相当于调用 new Person())
            Object personInstance = personClass.getConstructor(String.class, int.class).newInstance("Bob", 25);
            // 3. 获取 sayHello 方法
            Method sayHelloMethod = personClass.getMethod("sayHello");
            // 4. 调用方法 (相当于 personInstance.sayHello())
            sayHelloMethod.invoke(personInstance);
            // 5. 获取并访问字段
            // Field nameField = personClass.getDeclaredField("name"); // 获取声明的字段(包括private)
            // nameField.setAccessible(true); // 允许访问私有字段
            // String name = (String) nameField.get(personInstance);
            // System.out.println("Retrieved name: " + name);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Class

  • 类型java.lang 包下的一个
  • 用途:在运行时提供类的信息,是实现反射的基础。
  • 时机:在运行时存在,当一个类被加载时由JVM创建。
  • 本质:一个代表“类”这个概念的对象,是类的“元数据”或“身份证”。

总结与对比

特性 class 关键字 Class
本质 Java语言的关键字,一个编译时指令 Java API中的一个,一个运行时对象
角色 创建者/设计师,用于定义类的蓝图 描述者/元数据,用于描述类的信息
使用场景 定义类、接口、枚举等 反射、框架开发(如Spring)、动态代理、注解处理等
存在时机 编译时,存在于源代码中 运行时,存在于JVM内存中
关系 class 关键字定义的 Person,在运行时会有一个 Person.class 对象与之对应 Person.class 对象是 Class 类的一个实例

一个生动的比喻

  • class 关键字 就像是建筑设计师手中的画笔和图纸,设计师用它来设计一栋大楼(Person 类),规定这栋楼要有几层(字段)、有什么功能(方法)。
  • Class 就像是这栋大楼的身份证和档案,这张身份证上记录了大楼的所有信息:设计师是谁、建于何时、有多少层、有哪些设施等,政府(JVM)根据设计师的图纸,在建成后为这栋大楼发放了这张身份证,你可以拿着这张身份证(Class 对象)去查询大楼的各种信息,甚至在特殊情况下(反射)可以修改大楼内部的结构。

希望这个解释能帮助你彻底理解Java中 classClass 的区别与联系!

分享:
扫描分享到社交APP
上一篇
下一篇