Java类本身是否被视为对象?

时间:2013-08-16 16:43:06

标签: java class object

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

考虑到这些事实 Java类仍然被认为是对象本身吗?

我搜索了很多资源,但仍然感到困惑。许多参考文献都会说 Java中的所有东西(除了原语)都是对象,包括类和你的类文件......比如这里:

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

我搜索了StackExchange并且this问题有所帮助,但没有完全回答我的具体问题。

6 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:5)

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

例如,给定一个类

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

班级User有行为和状态,即。它有一个名为Field的{​​{1}}和一个名为name的{​​{1}}。以上描述了这种行为。如果您创建实例

Method

您现在拥有一个包含实际状态和展示行为的数据结构。

在Java中,您拥有所谓的Reflection,它基本上描述了类的元数据,其状态和行为。这被分别解释为setNameUser user = new User(); user.setName("Jon"); Class类的实例。

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

同样,Field类描述了一种方法。方法有一个状态,其名称为ex。 Field,它所接受的论据,例如。一个Method。它也有行为,例如。它返回void(不返回任何内容)。

最后,您有一个类setName,它描述了类的状态和行为。 String的实例描述了类的状态和行为。例如,Class类的Class实例将有一个Class对象和一个User对象(它实际上有更多,但请耐心等待)。字段和方法是类的状态。例如,行为是creating an instance of the class

答案 2 :(得分:2)

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

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

有关详细信息,请参阅here

答案 3 :(得分:1)

  

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

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

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

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

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

底线:JVM中的每个操作都将在面向对象原则(OOP)的影响下发生,因此除了原语之外,“Everything is Objects”也是如此。为了证明如果有一个类加载到没有new关键字的JVM中,它也会有一个java.lang.Class对象/实例与之关联。

答案 4 :(得分:0)

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

该类用于声明适当的程序和程序。

然后根据类创建对象。

示例:您有一个动物类和一个狗对象

Here is a longer read if you'd like to dig a little deeper.

答案 5 :(得分:0)

这应该更好地解释它;这个例子简单地说, Car是一个类。但我们可以拥有许多汽车,具体取决于他们的功能/属性对象帮助我们定义那些。所以类不是对象。来自Oracle Docs. (将自行车替换为汽车,因为我们都与它有关并且更好地理解。)

  

在现实世界中,你经常会发现许多单独的物体   同样的。可能存在数千种其他自行车,   所有相同的品牌和型号。每辆自行车都是用同样的车建造的   一组蓝图,因此包含相同的组件。在   面向对象的术语,我们说你的自行车是一个实例   一类被称为自行车的物体。一个类是蓝图   创建了哪些单个对象。

以下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);
    }
}