什么是类,引用和对象?

use*_*206 49 java oop reference class object

我已经编程java 2年了,显然我遇到了一个问题,我无法理解并再次区分类,引用和对象(我不明白为什么我会忘记这些概念).

让我们来解决问题,即我不确定类或引用是否相同,尽管我已经知道什么是对象.

有人能够以一种好的,可理解的和完整的方式区分什么是类,引用和对象?

我所知道的是,这个类更像是一个对象的模板(一个房子的蓝图,其中类是蓝图而房子是一个对象).

ysh*_*vit 131

如果你喜欢住房隐喻:

  • 堂课就像房子的蓝图.使用此蓝图,您可以根据需要构建尽可能多的房屋.
  • 您构建的每个房屋(或在OO术语中实例化)都是一个对象,也称为实例.
  • 当然,每个房子也有一个地址.如果你想告诉某人房子的位置,你可以给他们一张上面写有地址的卡片.该卡是对象的参考.
  • 如果您想访问房子,请查看卡上写的地址.这称为解除引用.

您可以根据需要复制该引用,但只有一个房子 - 您只是复制其上有地址的卡,而不是房屋本身.

在Java中,您无法直接访问对象,您只能使用引用.Java不会相互复制或分配对象.但是您可以复制并分配对变量的引用,以便它们引用同一个对象.Java方法总是按值传递,但值可以是对象的引用.所以,如果我有:

Foo myFoo = new Foo();     // 1
callBar(myFoo);            // 2
myFoo.doSomething()        // 4

void callBar(Foo foo) {
    foo = new Foo();       // 3
}
Run Code Online (Sandbox Code Playgroud)

然后让我们看看发生了什么.

  1. 第1行中发生了一些事情.new Foo()告诉JVM使用Foo蓝图构建一个新房子.JVM这样做,并返回对房屋的引用.然后,您将此引用复制到myFoo.这基本上就像要求承包商为你建房子.他这样做,然后告诉你房子的地址; 你写下这个地址.
  2. 在第2行中,您将此地址提供给另一种方法callBar.让我们接下来跳转到那个方法.
  3. 在这里,我们有一个参考Foo foo.Java是通过按值,所以foocallBar是一个拷贝的的myFoo参考.可以想象它就像给callBar自己的卡片上面有房子的地址一样.什么是callBar与此卡怎么办?它要求建造一个新房子,然后用你给它的卡片写下新房子的地址.请注意,callBar现在无法到达第一个房子(我们在第1行建造的那个房子),但是这个房子没有改变,因为过去在其上有地址的卡,现在有一些其他房屋的地址.
  4. 回到第一种方法,我们取消引用myFoo调用它的方法(doSomething()).这就像看卡片,去卡片上的地址,然后在那个房子里做点什么.请注意,我们myFoo的地址卡的callBar方法没有改变- 请记住,我们提供callBar一份参考资料.

整个序列将是这样的:

  1. 请求JVM建造房屋.它确实给了我们地址.我们将此地址复制到名为的卡片中myFoo.
  2. 我们援引callBar.在我们开始之前,我们将写入的地址复制myfoo到我们提供的新卡上callBar.它叫那张卡片foo.
  3. callBar问JVM另一所房子.它创建它,并返回新房子的地址.callBar将此地址复制到我们提供的卡片上.
  4. 回到第一种方法,我们看看我们原来的未更改的卡片; 去我家卡上的地址; 并在那里做点什么.

  • @iamcreasy他们非常相似.地址是对象所在的JVM(即内存中)的位置.引用是指向此地址的变量.类比就像问一个整数和一个`int`之间的区别 - 整数(或地址)是你想要存储的东西,而`int`(或引用)是存储它的东西. (2认同)

Mar*_*elo 13

当你编码时,你建立一个

实例(发生,复制)

一个

宾语

一说

并保持一个

参考

它,所以你可以调用它的方法.

此外,一些OOP基础:,对象,实例引用.

  • @ user962206引用只不过是指向所述对象在内存中的"指针".可以说你在类文件中写了'实现',不确定这是什么意思? (2认同)
  • @Marcelo轻微的挑剔:引用不是"Car"对象的地址,它是一个可以存储地址副本的地方.如果你修改引用,它不会改变`Car`的地址 - 只是意味着你现在指向另一个对象(或`null`,这是没有地址). (2认同)

小智 7

在Bruce Eckel的"Thinking in Java"一书中,它被完美地描述:

"你可能会想象一个电视(对象)和一个遥控器(参考).只要你拿着这个参考,就可以连接到电视,但当有人说"改变频道"或"降低频道"时音量,"你操作的是参考,然后修改对象.如果你想在房间里移动并仍然控制电视,你可以随身携带遥控/参考,而不是电视.

此外,遥控器可以独立,没有电视.也就是说,仅仅因为你有一个引用并不意味着必然有一个对象连接到它.因此,如果要保留单词或句子,则创建一个String引用:

String s;
Run Code Online (Sandbox Code Playgroud)

但是在这里你只创建了引用,而不是对象.如果您此时决定向s发送消息,则会收到错误,因为s实际上并未附加任何内容(没有电视).因此,更安全的做法是在创建引用时始终初始化引用:

String s = "asdf";
Run Code Online (Sandbox Code Playgroud)

但是,这使用了一个特殊的Java功能:可以使用带引号的文本初始化字符串.通常,您必须对对象使用更通用的初始化类型.

创建引用时,您希望将其与新对象连接.通常,您可以使用new运算符执行此操作.关键字new表示"让我成为这些对象中的新对象."因此在前面的示例中,您可以说:

String s = new String("asdf");
Run Code Online (Sandbox Code Playgroud)

这不仅意味着"让我成为一个新的字符串",而且它还提供了有关如何通过提供初始字符串来生成字符串的信息.当然,除了String之外,Java还附带了大量现成的类型.更重要的是,您可以创建自己的类型.实际上,创建新类型是Java编程中的基本活动."