Demo d = new Demo();
d.someFunction();//Why are we using the reference?
为什么我们确实需要参考?为什么我们不能直接使用对象?
答案 0 :(得分:2)
Java没有像free functions这样的概念。在java中,您希望从另一个类中调用的任何代码只能被访问"使用某种背景。
此上下文可以是:
换句话说:您必须调用方法。这些是静态(例如Arrays.asList()
)或非静态 - 然后需要调用" on"一些对象(如System.out.println()
,其中println()
类的对象上调用了PrintStream
。
请注意:"参考"不做任何工作"为了你。它只是表示您打算调用的方法是上下文" bound"至。
答案 1 :(得分:2)
我尝试解释基础知识,因为我认为你搞砸了名字^^
理解这一点的最佳方式是举例:
假设你有类人类。人类有什么东西?一个名字,名字,肤色,国家,......让我们说我们在人类的人类中以变量的形式使用这些东西。
现在我们创建一个人类对象,我们称他为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)
我会尽力向我解释。请看下面的图片:
使用演示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进行操作。