【问题标题】:Why cant we access objects directly and need references to do our work?为什么我们不能直接访问对象并且需要引用来完成我们的工作?
【发布时间】:2018-01-30 14:39:58
【问题描述】:
Demo d = new Demo();
d.someFunction();//Why are we using the reference?

为什么我们确实需要参考?为什么不能直接使用对象?

【问题讨论】:

  • 引用是以任何方式引用堆中的对象
  • “直接使用”是什么意思? Java 怎么知道你指的是哪个对象?你能发布一些代码来说明你认为这应该是什么样子吗?
  • 如果你有100个方法,你会创建100个对象来调用它们吗?
  • 这可以进行广泛的讨论,我对您的建议是深入了解基础知识,因为这是面向对象编程的基础所在。那里有很多信息真实的东西。 Start from here.
  • 我知道对象是类的一个实例,类是我们创建对象的蓝图,但究竟什么是对象?我的意思是@Dukeling 对象的目的是什么

标签: java oop instance


【解决方案1】:

因为这样可以调用同一个对象的多个方法

Demo d = new Demo();
int anotherValue = d.someAddFunction(5, 5);
d.someFunction();

或者假设您必须将对象引用传递给另一个类

Demo d1 = new Demo();
Demo d2 = new Demo();
DemoCombiner.combineDemo(d1, d2);
d1.someFunction();

【讨论】:

    【解决方案2】:

    Java 没有 free functions 这样的概念。在 java 中,您想从另一个类调用的任何代码只能使用特定的上下文“访问”。

    这个上下文可以是:

    • 一个对象
    • 或类本身

    换句话说:你必须调用方法。这些要么是static(例如Arrays.asList())要么是非静态的——然后它们需要在某个对象上“调用”(比如System.out.println(),其中println()在一个对象上调用) PrintStream 类的对象)。

    请注意:“参考”不会为您做“任何工作”。它只是表示您打算调用的方法“绑定”到的上下文

    【讨论】:

    • 我想说,在 Java 的情况下,这更多的是关于命名空间。如果你的头足够倾斜,那么即使Demo d = new Demo(); 也会创建自己的命名空间,称为package.Class.method.vars.d,然后调用d 上的方法将调用该命名空间上下文中的代码。
    • 是的,确实是“摇头”,但仍然是一个有趣的观点!喜欢它! 但是:当我们考虑 多态性 时,您的建议就失效了。您可以拥有d.foo() - 当foo() 在不同的类中被覆盖时,将调用哪个方法完全不清楚。
    【解决方案3】:

    我试图解释基础知识,因为我觉得你的名字有点搞砸了^^

    • Demo 是一个类而不是一个对象
    • d 是 Demo 类中的一个对象

    最好的理解方式是举个例子:

    假设您有 Human 类。人类拥有的东西是什么?名字、前名、肤色、国家……假设我们在人类类中以变量的形式使用这些东西。

    现在我们创建一个人类对象,我们称他为 John,看起来像这样:

    Human human1 = new Human();
    human1.name = "John";
    

    但是约翰很孤独,所以我们创建了另一个名为莎拉的人类对象。

    Human human2 = new Human();
    human2.name = "Sarah";
    

    希望能帮到你。

    【讨论】:

    • 谢谢。我从来没有说过演示不是一门课。
    • d 不是参考?
    • 那么 human1 将是堆内存中作为 Human 实例的实际对象的引用?
    【解决方案4】:

    我会尽量向我解释得更好。所以看看下面的图片:

    当你使用Demo d = new Demo()创建一个对象时,d 会被放入栈中,这是一个临时的内存位置,new Demo() 意味着它会创建一个堆上的对象,它是一个永久内存位置。d 将开始引用堆中的 Demo 对象。

    所以现在根据您的问题,我们为什么使用引用?

    1) 如果您不使用引用并假设您的类中有 100 个方法,那么您需要调用这些方法。因此,您将需要创建 100 个相同类型的对象,这将需要更多内存,这完全不是编码的好习惯。

    new ClassName().method1();
    new ClassName().method2();
    new ClassName().method3(); and so on....There will be much wastage of memory
    

    2) 但是如果我们使用引用,我们将只需要 1 个对象来调用类的任何方法。所以引用的使用效率更高。

     d.method1();
     d.method1();
     d.method1();
    

    所以我会说,我们不需要引用,我们可以直接使用对象,但是在那种情况下,我们会不必要地浪费内存。

    我希望这会有所帮助。如果您仍然有任何疑问,请告诉我。谢谢

    【讨论】:

    • 所以对象只是一个带有类数据的永久内存位置??我想知道对象到底是什么?
    • 是的,正是@Nalin
    • 可以说Object就像Container,里面包含了类中定义的变量和方法
    • 有点困惑!
    • OHHHHK 所以要访问堆栈中的这些方法,我们使用引用来帮助我们访问存储在堆中的所有方法和变量(实例)
    【解决方案5】:

    长话短说:您不能在动态堆上标记分配的内存。 在静态堆栈中你可以。名称与地址。

    S T A C K A L O C A T I O N (名称)

    Int x = 4 -> 你确实做到了:

    1 在栈上分配内存,大小为 int。

    2 将此内存位置命名为“x”。

    3 将值 4 放入 x。

    H E A P A L O C A T I O N(地址)

    Student Student1 = new Student('Peter') -> 你确实做到了:

    1 使用对象 Student 的大小在堆上分配内存。

    (您不能为堆上的这个位置分配名称)

    2 将对象的位置 ADDRESS 复制到引用 Student1 中。

    3 在对象字段中输入值“彼得”

    因此,如果您无法通过 NAME 访问位置,您可以通过 ADDRESS 访问。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-08
      • 1970-01-01
      • 1970-01-01
      • 2021-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多