类,对象和实例之间的区别


Answers:


86

Java(和任何其他编程语言)是根据类型建模的。从理论上讲,是某些信息量的表示,类型是一组值。当我们说值X类型Y的实例时,我们只是说X是类型Y的值集合的成员。

这就是“实例”一词的真正含义:它描述的是一种关系而不是事物。

Java编程语言的类型系统支持两种类型,原始类型引用类型。引用类型进一步分为数组类型。Java对象是引用类型的实例。

对象是类实例或数组。(JLS 4.3.1

这就是类型理论的观点。

实际上,大多数Java开发人员将单词“ instance”和“ object”视为同义词。(这包括我在内,然后我试图快速地解释一些事情。)大多数开发人员使用“值”一词而不是“实例”来指代原始类型的实例。


3
先生,我真的很感谢您的回答,我几乎明白了,只是一个问题。我们说:“只要编译器命中0参数构造函数,它就会创建一个类的实例。” 在这种情况下,真正创建实例或对象的是什么?我猜是一个对象,我们使用“实例”一词作为同义词。但是,如果您能更好地加以确认,它会很友好。
Pranjut

3
@Ryan:基本上是:它正在创建一个对象,该对象是所讨论的类的实例。(但请注意,引用的句子是在说“一个类的实例”,而不仅仅是“实例”……因此作者在这里实际上并没有使用“实例”作为同义词。)
Stephen C

1
@RuneFS-我正在谈论的“建模”与表示无关。这是理论上的。是的,在某些语言中,有些对象表示类型,甚至允许您枚举类型的所有实例。但是这些属性增强了通用的“建模”,而不是使其无效。
斯蒂芬·C

1
@RuneFS-不,我在说“类型论”。它是数学的一个分支。它独立于用于运行程序的技术。与计算最接近的类型理论是Lambda微积分。(如果您有兴趣,请尝试获取Benjamin C. Pierce的“类型和编程语言”的副本。)
Stephen C

1
您犯的错误与相同user2390183。您将变量视为“名称”。他们不是。变量是“引用持有人”,其中包含对对象的引用。对象没有内部名称。引用是对象的“名称”最接近的东西,除了它们没有常量表示。(GC可以移动一个对象,该对象会更改用于表示引用的位模式。)
Stephen C

96

是用来创建一个蓝图的对象。对象是实例类-这是您使用特定类制作的具体“东西”。因此,“对象”和“实例”是同一件事,但是“实例”一词表示对象与其类的关系。

如果看一个例子,这很容易理解。例如,假设您有一个class House。您自己的房子是一个对象,并且是class的实例House。姐姐的房子是另一个对象(class的另一个实例House)。

// Class House describes what a house is
class House {
    // ...
}

// You can use class House to create objects (instances of class House)
House myHouse = new House();
House sistersHouse = new House();

该类House描述房屋的概念,并且有一些具体的混凝土房屋,它们是class的对象和实例House

注意:在Java中,这与所有面向对象的编程语言完全相同。


class House { // blue print for House Objects } class Car { // blue print for Instances of Class Car } House myHouse = House new(); Car myCar = Car new();
Suraj Jain

myHouse和myCar是对象myHouse是House的实例(将Object-myHouse与其Class-House关联)myCar是Car的实例。这是真的吗,请查看user2390183的上述答案是否正确?
Suraj Jain

29

类基本上是一个定义,并且包含对象的代码。对象是类的实例

例如,如果你说

String word = new String();

该类是String类,它描述对象(实例)字。

当声明一个类时,没有分配内存,所以类只是一个模板。

声明该类的对象时,将分配内存。


您是说对象和实例相同吗?
Pranjut

感谢大卫的链接。从我得到的主题中,每个具有状态和行为的现实世界的事物都可以称为“对象”。为了对这些对象进行分类,我们使用class(一个类是从中创建单个对象的蓝图)。它说,类的对象是实例。现在请有人告诉我对象和实例之间有什么区别,这是否意味着对象在编程上下文中并不真正存在,而实例在其中表示对象?
Pranjut

@Mustafa:很抱歉与您矛盾,但是根据JLS,数组也是Java中的对象。而且您会发现JLS根本没有定义术语“实例”。看我的答案。
斯蒂芬·C

@Ryan:请参见我的答案,以区分“实例”和“对象”。@Mustafa的回答和评论具有误导性。
斯蒂芬·C

@mustafabar- “声明一个类时,不会分配任何内存,因此类只是一个模板。” -这也不是真的。内存分配给(至少)表示static该类的变量。(以及与类的类型标识有关的其他事情。)
Stephen C

13

我喜欢Jesper用外行人的解释

通过从Jesper的答案中即兴创作示例,

class House {
// blue print for House Objects
}

class Car {
// blue print for Instances of Class Car 
}

House myHouse = new House();
Car myCar = new Car();

myHouse和myCar是对象

myHouse是House的实例(将Object-myHouse与其Class-House相关)myCar是Car的实例

简而言之

“的MyHouse是一个实例屋”,这是等于说“的MyHouse是对象类型屋”


6

类是数据类型,您可以使用此类型创建对象。

  • 实例是逻辑的,而对象是物理的,则意味着占用一些内存。

  • 我们可以为抽象类以及接口创建实例,但是不能
    为这些对象创建对象。

  • 对象是类的实例,实例是类的代表,即对象。

  • 实例是指对象的引用。

  • 对象实际上指向该实例的内存地址。

  • 您不能在层上传递实例,但可以在层上传递对象

  • 您不能存储实例,但可以存储对象

  • 一个对象可以有多个实例。

  • 实例将具有类定义和对象定义,而在对象中,实例将仅具有对象定义。

对象的语法:

 Classname var=new Classname();

但是对于实例创建,它仅返回引用对象的指针,语法为:

 Classname varname;

3

在Java中,对象是在堆内存中产生的。这些需要参考并在我们的应用程序中使用。引用具有对象的内存位置,我们可以在应用程序中使用这些对象。简而言之,引用就是变量的名称,该变量存储在内存位置上实例化的对象的地址。

Aninstance是的通用术语object。仅供参考,Object是一类。

例如,

Class A{

}

A ref = new A();

对于以上代码段,ref是在堆上生成的A类对象的引用。


3

老实说,我对Alfred博客定义更满意:

对象:现实世界中的对象共有2个主要特征,即状态和行为。人类具有状态(名称,年龄)和行为(跑步,睡觉)。轿厢具有状态(当前速度,当前档位)和行为(施加制动器,换档)。软件对象在概念上与现实世界中的对象相似:它们也由状态和相关行为组成。对象将其状态存储在字段中,并通过方法公开其行为。

:是用于创建对象的“模板” /“蓝图”。基本上,一个类将由字段,静态字段,方法,静态方法和构造函数组成。字段用于保存类的状态(例如:Student对象的名称)。方法用于表示类的行为(例如:Student对象如何站起来)。构造函数用于创建Class的新实例。

实例:实例是代表对象的类的唯一副本。创建类的新实例时,JVM将为该类实例分配一个内存空间。

给出下一个示例:

public class Person {
    private int id;
    private String name;
    private int age;

    public Person (int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + id;
        return result;
    }

    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person other = (Person) obj;
        if (id != other.id)
            return false;
        return true;
    }

    public static void main(String[] args) {
        //case 1
        Person p1 = new Person(1, "Carlos", 20);
        Person p2 = new Person(1, "Carlos", 20);

        //case 2
        Person p3 = new Person(2, "John", 15);
        Person p4 = new Person(3, "Mary", 17);
    }
}

对于情况1,有Person类的两个实例,但是两个实例代表同一个对象。

对于情况2,类Person有两个实例,但是每个实例代表一个不同的对象。

因此,类,对象和实例是不同的东西。对象和实例不是同义词,如在选择为正确答案的答案中所建议的那样。


2

如果您有一个模拟汽车的程序,那么您就有一个代表汽车的类,因此在代码中您可以说:

Car someCar = new Car();

someCar现在是Car类的一个实例。如果该程序在修理厂使用,并且someCar在系统中代表您的汽车,则您的汽车就是对象。

所以Car是一个可以代表任何现实世界的汽车的类,someCar是Car类的一个实例,someCare代表一个现实的对象(您的汽车)

但是,在讨论编码时,实例和对象经常互换使用


1
严格来说,someCar它是对Car实例的引用。实例本身没有名称。
约阿希姆·绍尔

2

您的计算机存储和处理的任何类型的数据都以其最基本的表示形式排成一行。这些位的解释方式是通过数据类型完成的。数据类型可以是原始的也可以是复杂的。基本数据类型为-例如,int或double。它们具有特定的长度和特定的解释方式。对于整数,通常第一位用于符号,其他位用于值。

复杂数据类型可以是原始数据类型和其他复杂数据类型的组合,在Java中称为“类”。

您可以定义复杂的数据类型PeopleName,该数据类型由两个名为名字和姓氏的字符串组成。Java中的每个String是另一种复杂的数据类型。返回的字符串(可能)使用原始数据类型char实现,Java知道该类型的原始数据类型存储多少位以及如何解释它们。

创建数据类型的实例时,您将获得一个对象,并且计算机为其保留了一些内存,并记住了它的位置和该实例的名称。内存中的PeopleName实例将占用两个String变量的空间,外加更多簿记空间。Java中的整数占32位。

可以为复杂数据类型分配方法。方法可以对其参数或您从中调用此方法的数据类型的实例执行操作。如果您有两个名为p1和p2的PeopleName实例,并且调用了方法p1.getFirstName(),则它通常返回第一个人的名字,而不是第二个人的名字。


2

类和对象背后的概念是将逻辑封装到单个编程单元中。是创建对象的蓝图。

这是一个代表Car的类的示例:

public class Car {

    int currentSpeed;
    String name;

    public void accelerate() {  
    }

    public void park() {
    }

    public void printCurrentSpeed() {
    }
}

您可以创建实例中的对象这样的车:

Car audi = new Car();
Car toyota = new Car();

我已经从本教程中获取了示例


2

类别:结构

对象:身体表现

实例:从类创建的每个对象

参考:对象地址


1

  • 它具有逻辑上的存在,即在创建时没有分配存储空间。

  • 它是一组对象。

  • 类可以被视为创建对象的蓝图。

    • 它是使用class关键字创建的

    • 一个类定义对象将拥有的方法和数据成员。


目的

  • 它具有物理存在,即在创建时分配内存空间。

  • 它是一个类的实例。

  • 对象是一个唯一的实体,其中包含OOP语言中的数据成员和成员函数。

    • 它是使用new关键字创建的

    • 对象指定方法的实现以及类中的数据成员将拥有的值。


1
当“创建”一个类时,可以分配空间。该类定义的任何静态变量都需要该空间。(并且“逻辑”对“物理”正在扩展它,因为对象表示只是某些存储设备中的位模式帮助。)
Stephen C

@StephenC还有什么不同呢?

见我的答案。仅仅谈论差异是无法正确回答这个问题的。
斯蒂芬·C

0

类是制作对象(=实例)所需的蓝图。

对象和实例之间的区别在于,对象是事物,实例是关系。

换句话说,实例描述了对象与对象所基于的类的关系。


-1

定义“对象是类的实例”在概念上是错误的,但根据实现是正确的。实际上,面向对象的功能是从现实生活中获取的,以便使程序员的思想从多一点或少一点集中。在现实生活中,班级是为管理对象而设计的。例如,我们人类有种姓,宗教,国籍等等。这些演员,宗教,国籍是阶级,没有人类就不存在。但是在实现中,不存在没有类的对象。对象对象是具有一些定义明确的属性的离散实体。在这里,离散意味着某种使其与众不同的东西。定义明确的属性在某些情况下很有意义。类-具有某些常见行为的对象或某种常见类型的对象的分类。


-1

尽管以上答案是正确的,但有关类和对象的另一种思考方式是使用真实的示例:名为Animal的类可能包含Cat,Dog或Fish之类的对象。具有圣经标题的对象将是Book等类。类是通用的,对象是特定的。当我学习Java时,这个思想示例对我有所帮助。


是的……但是类比也可能使人困惑。如果Animal是一个班级并且Cat是一个实例,那么我的宠物猫“蓬松”是什么?
斯蒂芬·C

-2

类是模板或类型。对象是类的实例。

例如:

public class Tweet {

}

Tweet newTweet = new Tweet();

Tweet是一个类,而newTweet是该类的对象。


这些只是言语。您实际上并没有解释单词的意思。(实际上,Java类在现实生活中或在使用Javascript,Python,Ruby等语言时都不会像模板那样工作)
Stephen C
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.