5

我知道 Java 类为对象提供了蓝图。
我也知道所有类都继承自Object该类。

考虑到这些事实,Java 类本身是否仍被视为对象?

我搜索了很多资源,但仍然很困惑。许多参考资料会说Java 中的所有内容(除了原语)都是对象,包括类和您的类文件......例如这里:

http://howtoprogramwithjava.com/podcast-episode-10-objects-and-static-keyword

我搜索了 StackExchange,这个问题有点帮助,但没有完全回答我的具体问题。

4

6 回答 6

12

类本身不是对象,因为在执行类时没有直接使用的运行时对象。存在其他对象,但是它们是类的表示,并且在内存中强制对它们进行的更改不会更改该类字节码的执行。但是,每个类都有一个Class与之关联的对象,该对象允许通过反射与该类、其实例和成员进行交互。

这个类实际上是泛型的,因为 FooClass.class 实际上是java.lang.Class<FooClass>,这有助于泛型,因为传入一个 Class 对象可以在运行时解析泛型返回类型和约束。

于 2013-08-16T16:45:45.723 回答
5

从概念上讲,类是对状态和行为的描述。对象(实例)是包含该状态和行为的数据结构。

例如,给定一个类

class User {
    String name;
    void setName(String name) {
        this.name = name
    }
}

该类User具有行为和状态,即。它有一个Field被叫name和一个Method被叫setName。上面描述了这种行为。如果您创建一个实例

User user = new User();
user.setName("Jon");

你现在有了一个包含实际状态和表现行为的数据结构。

在 Java 中,你有所谓的反射,它基本上描述了一个类的元数据、它的状态和它的行为。这分别被解释为ClassFieldMethod类的实例。

在上面的示例中,由于字段name本身具有状态和行为(它有一个名称(“名称”),我们可以对其进行读取或写入),因此必须有一个类来描述它。描述该状态和行为的类是包含该状态和行为的Field实例。Field

同样,Method该类描述了一个方法。一个方法有一个状态,它的名字 ex。setName,它接受的参数,例如。一个String。它也有行为,例如。它返回 void (不返回任何内容)。

最后,你有一个Class描述类的状态和行为的类。Class描述类的状态和行为的实例。例如,类的Class实例User将有一个Field对象和一个Method对象(它实际上不止这些,但请耐心等待)。字段和方法是类的状态。例如,行为是创建类的实例

于 2013-08-16T16:45:41.300 回答
2

编辑:类在被调用时也是对象。否则它们是引用类型。

对于每个类定义,类加载器调用 java.lang.Class 的实例并将这些特殊的类对象存储在 JVM 内存的 PermGen 空间中。

请参阅此处了解更多信息。

于 2013-08-16T16:45:36.017 回答
1

考虑到这些事实,Java 类本身是否仍被视为对象?

不,您不能将 java 类/类型说成对象/实例。
类/类型的对象意味着堆上的内存分配(其中内存取决于类内部定义的成员变量)。new当您使用关键字 调用类型/类构造函数时,确实会发生这种情况。

但是,当ClassLoader将类加载到 JVM 时,会关联或创建一个类/类型 Class( java.lang.Class ) 的对象。这个 Class 对象有助于 JVM 跟踪在 JVM 中运行的类,并在它们同步时获取静态方法上的 LOCK。另一方面,对于程序员来说,类的 Class 对象在很多方面都有帮助。

例如:REFLECTION.( java.lang.reflect )...

至于 Object( java.lang.Object ) 只是所有类的超类,它不会使类成为对象/实例。但是如果有一个名为 A 的类,我们知道它本质上是java.lang.Object的子类,现在 A 类的任何对象/实例都将具有类 A 和java.lang.Object的属性。

底线:JVM 内部的每个操作都将在面向对象原则(OOP)的影响下发生,因此除了原语之外,“万物皆对象”的说法。如果有一个没有new关键字的类加载到 JVM 中,那么它也将有一个与之关联的java.lang.Class对象/实例。

于 2013-08-16T17:24:47.640 回答
0

类和对象是不同的。但是对象是类的一个实例。

该类用于声明属性和过程。

然后基于类创建对象。

示例:您有一个 Animal 类和一个 Dog 对象

如果您想更深入地挖掘,这里是一个更长的阅读。

于 2013-08-16T16:45:23.360 回答
0

这应该更好地解释它;该示例简单地说,Car 是一个类。但是我们可以有很多汽车,这取决于它们的特性/属性对象帮助我们定义这些。所以类不是对象。来自Oracle 文档。 (用汽车代替自行车,因为不知何故我们都与它相关并且更好地理解。)

在现实世界中,您经常会发现许多同类对象。可能还有成千上万的其他自行车,都是相同的品牌和型号。每辆自行车都是由同一组蓝图制造的,因此包含相同的组件。在面向对象的术语中,我们说您的自行车是称为自行车的对象类的一个实例。类是创建单个对象的蓝图。

以下 Car 类是自行车的一种可能实现:

class Car{

    int cadence = 0;
    int speed = 0;
    int gear = 1;

    void changeCadence(int newValue) {
         cadence = newValue;
    }

    void changeGear(int newValue) {
         gear = newValue;
    }

    void speedUp(int increment) {
         speed = speed + increment;   
    }

    void applyBrakes(int decrement) {
         speed = speed - decrement;
    }

    void printStates() {
         System.out.println("cadence:" +
             cadence + " speed:" + 
             speed + " gear:" + gear);
    }
}
于 2013-08-16T16:55:08.870 回答