为什么我们无法直接访问对象并需要引用来完成我们的工作?

时间:2017-08-22 10:41:48

标签: java oop instance

Demo d = new Demo();
d.someFunction();//Why are we using the reference?

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

5 个答案:

答案 0 :(得分:2)

Java没有像free functions这样的概念。在java中,您希望从另一个类中调用的任何代码只能被访问"使用某种背景。

此上下文可以是:

  • 一个对象
  • 或类本身

换句话说:您必须调用方法。这些是静态(例如Arrays.asList())或非静态 - 然后需要调用" on"一些对象(如System.out.println(),其中println()类的对象上调用了PrintStream

请注意:"参考"不做任何工作"为了你。它只是表示您打算调用的方法是上下文" bound"至。

答案 1 :(得分:2)

我尝试解释基础知识,因为我认为你搞砸了名字^^

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

理解这一点的最佳方式是举例:

假设你有类人类。人类有什么东西?一个名字,名字,肤色,国家,......让我们说我们在人类的人类中以变量的形式使用这些东西。

现在我们创建一个人类对象,我们称他为John,如下所示:

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

但约翰非常孤独,所以我们创造了另一个叫做莎拉的人类对象。

val group = udf((p1: String, p2: String, p3: String) => if (p1 != null) p1 else if (p2 != null) p2 else if (p3 != null) p3 else null)
val joined = first.join(second.select("B", "P"), Seq("B"), "left")
                  .withColumnRenamed("P", "P1")
                  .join(second.select("C", "P"), Seq("C"), "left")
                  .withColumnRenamed("P", "P2")
                  .join(second.select("D", "P"), Seq("D"), "left")
                  .withColumnRenamed("P", "P3")
                  .select($"A", $"B", $"C", $"D", group($"P1", $"P2", $"P3") as "P")
                  .where($"P".isNotNull) 

我希望我可以帮助你。

答案 2 :(得分:2)

我会尽力向我解释。请看下面的图片:

enter image description here

使用演示d = new Demo()创建对象时,d将被放入堆栈中,这是一个临时内存位置,而新的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个Object来调用类的任何方法。因此,使用引用更有效。

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

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

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

答案 3 :(得分:0)

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

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();

答案 4 :(得分:0)

简而言之:您无法在动态堆上分配LABEL内存。 在静态堆栈中你可以。 NAME vs ADDRESS。

S T A C K A L L O C A T I O N(NAME)

Int x = 4 - >你真的这样做:

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

2将此内存位置设为NAME' x'。

3将值4放入x。

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

学生Student1 =新学生(' Peter') - >你真的这样做:

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

(您无法在堆上为此位置指定名称)

2将对象的位置ADDRESS复制到参考Student1。

3投入价值'彼得'在对象字段

因此,如果您无法通过NAME访问某个位置,则可以通过ADDRESS进行操作。