#1 楼
Java(和任何其他编程语言)是根据类型和值建模的。从理论上讲,值是某些信息量的表示,类型是一组值。当我们说值X是类型Y的实例时,我们只是说X是类型Y的值集合的成员。因此,“实例”一词的真正含义是:它描述的不是事物的关系。
Java编程语言的类型系统支持两种类型,原始类型和引用类型。引用类型进一步分为类和数组类型。 Java对象是引用类型的实例。
对象是类实例或数组。 (JLS 4.3.1)
这就是类型理论视图。
实际上,大多数Java开发人员都将“实例”和“对象”视为同义词。 (这包括我在内,然后我试图快速解释一些事情。)大多数开发人员使用“值”一词而不是“实例”来指代原始类型的实例。
评论
先生,我非常感谢您的回答,我几乎明白了,只是一个问题。我们说:“只要编译器命中0参数构造函数,它就会创建一个类的实例。”在这种情况下,真正创建实例或对象的是什么?我猜是一个对象,我们使用“实例”一词作为同义词。但是,如果您能更好地加以确认,它会很友好。
–Pranjut
09年8月2日在2:23
@Ryan:基本上是:它正在创建一个对象,该对象是所讨论的类的实例。 (但是请注意,引用的句子是在说“一个类的实例”,而不只是“实例”……因此,作者在这里实际上并没有使用“实例”作为同义词。)
– Stephen C
09年8月2日在3:38
@RuneFS-我正在谈论的“建模”与表示无关。这是理论上的。是的,在某些语言中,有些对象表示类型,甚至允许您枚举类型的所有实例。但是这些属性增强了通用的“建模”,而不是使其无效。
– Stephen C
2015年4月6日在22:50
@RuneFS-不,我在说“类型论”。它是数学的一个分支。它独立于用于运行程序的技术。与计算最接近的类型理论是Lambda微积分。 (如果您有兴趣,请尝试获取Benjamin C. Pierce的“类型和编程语言”的副本。)
– Stephen C
2015年4月7日15:32
您正在犯与user2390183相同的错误。您将变量视为“名称”。他们不是。变量是“引用持有人”,其中包含对对象的引用。对象没有固有名称。引用是对象的“名称”最接近的东西,除了它们没有常量表示。 (GC可以移动一个对象,该对象会更改用于表示参考的位模式。)
– Stephen C
16 Dec 25 '22:33
#2 楼
类是用于创建对象的蓝图。对象是类的实例-这是您使用特定类制作的具体“东西”。因此,“对象”和“实例”是同一件事,但是“实例”一词表示对象与其类的关系。如果看一个例子,这很容易理解。例如,假设您有一个类
House
。您自己的房子是一个对象,并且是House
类的实例。您姐姐的房子是另一个对象(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
类描述了房屋的概念,并且有一些具体的混凝土房屋它们是类House
的对象和实例。注意:这在Java中与所有面向对象的编程语言完全相同。
评论
class House {// House对象的蓝图} class Car {// Class Car实例的蓝图} House myHouse = House new(); Car myCar =汽车new();
–苏拉杰(Suraj Jain)
16 Dec 25'3:43
myHouse和myCar是对象myHouse是House的实例(将Object-myHouse与其Class-House关联)myCar是Car的实例。这是真的吗,请查看user2390183的上述答案是否正确?
–苏拉杰(Suraj Jain)
16 Dec 25'3:44
#3 楼
类基本上是一个定义,并且包含对象的代码。对象是类的实例,例如,如果您说String word = new String();
,则该类是String类,它描述了对象(实例)单词。
当声明一个类时,没有分配内存,因此该类只是模板。
当声明该类的对象时,分配了内存。
评论
您是说对象和实例相同吗?
–Pranjut
09年8月1日在5:20
感谢大卫的链接。从我得到的主题中,每个具有状态和行为的现实世界的事物都可以称为“对象”。为了对这些对象进行分类,我们使用class(一个类是从中创建单个对象的蓝图)。它说,类的对象是实例。现在请有人告诉我对象和实例之间的区别是什么,这是否意味着对象在编程上下文中并不真正存在,而实例在其中表示对象?
–Pranjut
09年8月1日在6:13
@Mustafa:很抱歉与您矛盾,但是根据JLS,数组也是Java中的对象。而且您会发现JLS根本没有定义术语“实例”。看我的答案。
– Stephen C
2009年8月1日14:10
@Ryan:请参见我的答案,以区分“实例”和“对象”。 @Mustafa的回答和评论具有误导性。
– Stephen C
09年8月2日在1:51
@mustafabar-“声明一个类时,不会分配任何内存,因此类只是一个模板。” -这也不是真的。分配给(至少)表示类的静态变量的内存。 (还有其他与类的类型标识有关的事情。)
– Stephen C
16 Dec 25'在11:16
#4 楼
我喜欢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 is类房屋的实例”与说“ myHouse是房屋类型的对象”相同
#5 楼
类是数据类型,您可以使用这种类型来创建对象。实例是逻辑的,而对象是物理的,则意味着要占用一些内存。
我们可以为抽象类创建一个实例,如下所示:和接口一样,但是我们不能为它们创建
对象。
对象是类的实例,而实例表示类的代表,即对象。
实例是指对象的引用。
对象实际上指向该实例的内存地址。
您不能在层上传递实例,但可以在层上传递对象
您不能存储实例但可以存储一个对象
单个对象可以有多个实例。
实例将具有类定义和对象定义,而在对象中,实例将仅具有对象定义。
对象的语法:
Classname var=new Classname();
但是例如创建它只返回一个指向对象的指针,语法为:
Classname varname;
#6 楼
在Java中,对象在堆内存中生成。这些需要参考并在我们的应用程序中使用。引用具有对象的内存位置,我们可以在应用程序中使用这些对象。简而言之,引用就是变量的名称,该变量存储在内存位置上实例化的对象的地址。instance
是object
的通用术语。仅供参考,Object
是一个类。例如,
Class A{
}
A ref = new A();
对于上述代码段,ref是类对象的引用在堆上生成。
#7 楼
老实说,我对Alfred博客的定义更满意:对象:现实世界中的对象共有2个主要特征,即状态和行为。人类具有状态(名称,年龄)和行为(跑步,睡觉)。轿厢具有状态(当前速度,当前档位)和行为(施加制动器,换档)。软件对象在概念上与现实世界中的对象相似:它们也由状态和相关行为组成。对象将其状态存储在字段中,并通过方法公开其行为。
类:是用于创建对象的“模板” /“蓝图”。基本上,一个类将由字段,静态字段,方法,静态方法和构造函数组成。字段用于保存类的状态(例如:Student对象的名称)。方法用于表示类的行为(例如:Student对象如何站起来)。构造函数用于创建Class的新实例。
Instance:实例是代表对象的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类的实例,但是每个实例代表一个不同的对象。
所以类,对象和实例是不同的东西。对象和实例不是同义词,这是在选择为正确答案的答案中所建议的。
#8 楼
如果您有一个模拟汽车的程序,那么您就有一个表示汽车的类,那么在代码中您可以说:Car someCar = new Car();
someCar现在是类车。如果程序是在修理厂使用的,并且someCar在系统中代表您的汽车,那么您的汽车就是对象。
所以Car是可以代表任何现实世界中的汽车的类
someCar是Car类的一个实例,
someCare表示一个现实生活中的对象(您的汽车)
但是,在讨论编码时,实例和对象经常可互换使用
评论
严格来说,someCar是对Car实例的引用。实例本身没有名称。
– Joachim Sauer
09年9月28日在10:54
#9 楼
您的计算机存储和处理的任何类型的数据都以其最基本的表示形式排成一行。这些位的解释方式是通过数据类型完成的。数据类型可以是原始的也可以是复杂的。基本数据类型为-例如,int或double。它们具有特定的长度和特定的解释方式。对于整数,通常首位用于符号,其他位用于值。复杂数据类型可以是原始数据类型和其他复杂数据类型的组合,称为“ Java中的“类”。
您可以定义复杂的数据类型PeopleName,该数据类型由两个名为名字和姓氏的字符串组成。 Java中的每个String是另一种复杂的数据类型。返回的字符串(可能)使用原始数据类型char实现,Java知道该原始数据类型要存储多少位以及如何解释它们。
创建数据类型的实例时,获取一个对象,您的计算机将为其保留一些内存,并记住其位置和该实例的名称。内存中的PeopleName实例将占用两个String变量的空间,外加更多簿记空间。 Java中的整数占32位。
可以为复杂的数据类型分配方法。方法可以对其参数或您从中调用此方法的数据类型的实例执行操作。如果您有两个名为p1和p2的PeopleName实例,并且调用了方法p1.getFirstName(),则它通常返回第一个人的名字,而不是第二个人的名字。
#10 楼
类和对象背后的概念是将逻辑封装到单个编程单元中。类是创建对象的蓝图。以下是代表Car的类的示例:
public class Car {
int currentSpeed;
String name;
public void accelerate() {
}
public void park() {
}
public void printCurrentSpeed() {
}
}
您可以创建的实例。像这样的对象Car:
Car audi = new Car();
Car toyota = new Car();
我已从本教程中获取了示例
#11 楼
类:结构对象:物理表现形式
实例:从类创建的每个对象
参考:对象的地址
#12 楼
类它具有逻辑存在,即在创建时没有分配内存空间。
它是一组对象。
一个类可以视为创建对象的蓝图。
使用类关键字创建。
类定义对象将拥有的方法和数据成员。
对象
它具有物理存在,即,在创建它时分配内存空间。 />它是一个类的实例。
对象是一个唯一的实体,它以OOP语言包含数据成员和成员函数。
它是使用new关键字创建的
对象指定方法的实现以及类中数据成员将拥有的值。
评论
当“创建”一个类时,可以分配空间。该类定义的任何静态变量都需要该空间。 (并且“逻辑”对“物理”正在扩展它,因为对象表示只是位模式在某些存储设备中有所帮助。)
– Stephen C
16 Dec 25 '11:06
@StephenC还有什么不同呢?
–user6110959
16/12/25在11:33
见我的答案。仅仅谈论差异是无法正确回答这个问题的。
– Stephen C
16 Dec 25 '13:35
#13 楼
类是制作对象(=实例)所需的蓝图。对象和实例之间的区别在于,对象是事物,实例是关系。
换句话说,实例描述了对象与对象所基于的类的关系。
#14 楼
定义“对象是类的实例”在概念上是错误的,但根据实现是正确的。实际上,面向对象的功能是从现实生活中获取的,以便使程序员的思想从多一点或少一点集中。在现实生活中,班级是为管理对象而设计的。例如,我们人类有种姓,宗教,国籍等等。这些演员,宗教,国籍是阶级,没有人类就不存在。但是在实现中,不存在没有类的对象。对象-对象是具有某些定义明确的属性的离散实体。在这里,离散意味着某种使其与众不同的东西。定义明确的属性在某些情况下很有意义。
类-具有某些常见行为的对象或具有某些常见类型的对象的分类。
#15 楼
尽管以上答案是正确的,但有关类和对象的另一种思考方式是使用真实的示例:名为Animal的类可能包含Cat,Dog或Fish之类的对象。具有圣经标题的对象将是Book等类。类是通用的,对象是特定的。当我学习Java时,这个思想示例对我有所帮助。评论
是的……但是类比也可能使人困惑。如果Animal是一个类,Cat是一个实例,那么我的宠物猫咪“蓬松”是什么?
– Stephen C
16 Dec 25 '11:08
实际上,在现实世界中(在类型论中),“动物”表示所有动物的集合,而“猫”表示所有猫的集合。猫是动物的子集,而不是动物的实例。
– Stephen C
12月24日5:41
#16 楼
类是模板或类型。对象是类的实例。例如:
public class Tweet {
}
Tweet newTweet = new Tweet();
Tweet是类,而newTweet是该类的对象。
评论
这些只是言语。您实际上并没有解释单词的意思。 (实际上,Java类在现实生活中或在Java语言,Python,Ruby等语言中的行为都不像模板)
– Stephen C
16-09-25在2:48
评论
检查以下链接