Java中的实例是什么?

58
对象、实例和引用之间有什么区别?他们说他们必须创建一个应用实例?这是什么意思?

可能是对象和实例的区别的重复问题。 - jww
12个回答

83

对象和实例是同一概念

个人而言,我更倾向于在引用某个特定类型的特定对象时使用“实例”这个词,例如“类型为Foo的一个实例”。但当谈论对象时,我会使用“对象”而不是“实例”。

引用要么指向特定对象,要么是空引用。


他们说必须要创建应用程序的一个实例,这是什么意思?

他们可能意味着你需要编写类似以下的内容:

Foo foo = new Foo();

如果您不确定应该实例化哪种类型,您应该联系应用程序的开发人员,并要求提供更完整的示例。


1
我无法编辑它,因为它只是一个字符。请在你的回答中在引号内加上一个"y"。"他们说他们必须..." - uranibaba

15
"

应用程序实例(instance to an application)没有具体含义。

"对象(object)"和"实例(instance)"是同一个概念,有一个定义结构的“类(class)”及其实例(通过new ClassName()获得)。例如有一个名为Car的类,它有不同属性的实例,如里程、最大速度、马力、品牌等。

在Java上下文中,引用(reference)是一个变量* - 它指向一个对象/实例。例如,String s = null; - s 是一个引用,目前没有指向任何实例,但可以引用String类的实例。

*Jon Skeet提到了变量和引用之间的区别。请参见他的注释。这是关于Java如何在调用方法时工作的重要区别 - 传值传递(pass-by-value)。

s的值是一个引用(reference),重要的是要区分变量和值以及对象和引用。

"

8
当你使用关键字new,例如JFrame j = new JFrame();时,你正在创建一个类JFrame的实例。

new运算符通过为新对象分配内存并返回对该内存的引用来实例化一个类。
注意:短语“实例化一个类”的意思与“创建一个对象”的意思相同。当你创建一个对象时,你正在创建一个类的“实例”,因此是“实例化”一个类。

请查看创建对象


Java编程语言的类型分为两类:原始类型引用类型
引用类型包括类型、接口类型和数组类型。
还有一种特殊的null类型。
对象是动态创建的类型的实例或者动态创建的数组
引用类型的值是对象的引用。

有关更多信息,请参见类型、值和变量


1
我认为j不是一个对象,它只是存储对对象的引用。 - Voooza
7
请注意,j 甚至不是一个引用。它是一个变量。 j 是一个引用。在变量和值,对象和引用之间进行区分非常重要。 - Jon Skeet
我说的是存储引用而不是等于引用。也许我表达得不太好,但那就是我的意思。 - Voooza
@Jon 我之前说过 j 是以 JFrame 类型创建的对象。 这意味着 j 是一个引用类型的变量,其数据类型为 JFrame - Alpine
如果那是你的意思,那就应该说清楚。鉴于这个问题涉及术语的细节,准确性非常重要。 - Jon Skeet

7

我认为Object(对象)等同于Instance(实例)。Reference(引用)是指向一个Object的“链接”。

Car c = new Car();

变量c存储了一个类型为Car的对象的引用。

6
Computer c= new Computer()

这里创建了一个来自Computer类的对象。一个名为"c"的引用允许程序员访问该对象。


5

主要区别是当你说 ClassName obj = null; 时,你只是创建了该类的一个对象。它不是该类的实例。

这个声明只会为静态成员变量分配内存,而不会为普通成员变量分配内存。

但是当你说 ClassName obj = new ClassName(); 时,你正在创建该类的一个实例。这个声明将为所有成员变量分配内存。


4

基本上,"对象(object)"和"实例(instance)"这两个词可以互换使用。 一个类是一个对象的模板,而一个对象是一个类的实例。


1
实例的字面意思是“某事物的一个例子或单个事件”,这与Java术语中的实例非常接近。
Java遵循动态加载,不像C语言,在运行时将所有代码复制到RAM中。我们可以通过一个例子来说明这一点。
   class A
    {
    int x=0;
    public static void main(String [] args)    
     {
    int y=0;
    y=y+1;
    x=x+1;
     }   
    
    }

让我们编译并运行这段代码。

步骤1:javac A.class(生成了字节码的.class文件)

步骤2:java A(.class文件被转换为可执行代码)

在第二步中,主方法和静态元素被加载到RAM中以进行执行。在上述情况下,直到y=y+1这一行都没有问题。但是,每当执行x=x+1时,就会抛出运行时错误,因为JVM不知道在主方法之外(非静态)声明的变量x是什么

因此,如果某种方式使.class文件的内容在内存中可用于CPU执行,则不再有问题。

这是通过创建对象和关键字NEW来实现的。

在运行时为硬盘(这里是.class文件)内容在RAM中保留内存的概念称为实例


1

创建一个类的实例

在库中叫做Nacho的类

变量Libre用于保存将要更改的"实例"

Nacho Libre = new Nacho(Variable、Scanner输入或其他内容,这是接受更改并将值放入等号左侧的"Libre"的位置(你知道"Nacho Libre = new Nacho(Scanner.in)","Nacho Libre"在=号的左侧(那不是技术术语,而是我解释的方式)

我认为这比说"类型的实例"或"类的实例"更好。实际上,重点是需要更详细地解释......"类型或类的实例"对于初学者来说不够好......哇,就像是一句绕口令,大脑无法很好地专注于绕口令......"instance"这个词非常烦人,仅仅听到它的声音就让我抓狂......它需要更多的细节......它需要更好地被分解。我不得不Google什么是"instance"才能搞清楚方向......试着跟你的奶奶说"类的实例"......天啊!


这应该是一个注释。 - nanofarad

0

实例变量:它必须附加到对象上。在实例化类之后才能使用此类中的实例变量。

public class Test{
   static int a = 13;
   int b = 14;


   public static void main(String[] args){
       int d = new Test().b;
       System.out.println(d);
   }
}

1
这并没有回答问题。在回答问题时,请确保您已经阅读了问题。该问题已经被回答多次,已有一个非常高质量的被接受答案。如果您想添加答案,请确保它包含被接受答案中缺失的信息。 - SimonC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接