我目前已经读过the documentation 3次了,我很难将所写的内容应用到自己的简单程序中。我试图从根本上理解为什么我在下面的代码中确实写了p.add(v);
。
我声明一个对象p
和一个对象v
,其值分别为5和17。然后,我的方法add
将两个值加在一起。我采用了参数v
,因此我理解在主方法中引用对象v
时必须将其放在add(v)
的括号中。但是,我很难用言语来解释为什么我需要相对于add
调用方法p
。 p
也不像v
这样的说法吗?为什么我不能仅将方法更改为:
public void add(Positive v, Positive p)
然后通过说add(v,p);
来调用它吗?
根据Java文档,当对象位于类之外时,我需要调用一个方法吗?但是这里的一切都在我班里吗?因此,我不确定他们要在文档中说什么到底是什么。
public class Positive {
public static void main(String[] args) {
Positive p = new Positive(5);
Positive v = new Positive(17);
p.add(v);
System.out.println(p.get());
}
private int n;
public Positive(int n) {
this.n = n;
}
public void add(Positive v)
{
this.n += v.get();
}
public int get() {
return n;
}
}
答案 0 :(得分:1)
因此,您得到了一个名为Positive
的类,那里有一个public static void main
函数。
您还记得,Java程序开始以main方法执行(请阅读以下维基百科:https://en.wikipedia.org/wiki/Entry_point#Java)。
因此,当您运行此方法时,将执行以下操作:
Positive p = new Positive(5);
Positive v = new Positive(17);
在这里,您可以使用p
运算符(称为构造函数方法)来初始化两个类实例v
和new
。
p
和v
是Positive
的两个不同实例。
每个p
和v
都具有此类中列出的方法(此处为add
和get
),每个方法对于每个实例都是唯一的。
然后使用n
的{{1}}方法从v
获得get
字段并将其添加到v
的{{1}}成员(在此处详细了解实例方法与静态方法:在此处详细了解以下内容:https://www.geeksforgeeks.org/static-methods-vs-instance-methods-java/)
还了解了有关成员(https://www.programcreek.com/2011/11/java-access-level-public-protected-private/)的Java访问级别的信息
现在您要通过执行[首先将执行n
的{{1}}方法来执行p
的{{1}}方法:
add
;
因为它们都是非静态方法,所以它们属于一个实例,因此您需要此语法。
;;;
关于p
;如果将get
声明为v
,并且参数为p.add(v.get())
,则可以执行建议的操作:
add(p,v)
详细了解静态/实例方法。
答案 1 :(得分:0)
此调用将v
的值添加到 p
。
如果仅将v and p
加在一起,要将结果存储在哪里?
此调用的作用是将实例n
的私有值p
增加v
的值。
简单地说:
开始于: p = 5 v = 17
p.add(v)的意思是:p = 22(p中的5个+ v中的17个)并存储在p 中。所以p现在是22 再次调用p.add(v),它将再次将p的值增加17,使其总计为39。
v一直都是17岁。
为了好玩,您可以致电: p.add(v) p.add(v) v.add(p)
如前所述,前两个加法将p带到39,如果现在将p加到v,则将那39加到v的17中,并将结果存储在v 中(因为您调用了v.add
)。
v就是56。
我希望这可以使方法调用的内容更加清楚。 干杯格里斯
答案 2 :(得分:0)
您还可以使用覆盖public void add(Positive v, Positive p)
的静态方法,如下所示:
public static void add(Positive v, Positive p)
{
p.n += v.get();
}
还请阅读我的答案here,它将解释有关从对象进行调用和静态调用的更多信息。
答案 3 :(得分:0)
p
作为add(v,p)
的参数,而p
作为调用方法add(v)
的对象,两者之间存在细微差别。
当您将p
视为一个对象Positive
时,它就会与它持有的数字区分开。
一般而言,我们说p
是一个拥有数字Positive
的{{1}}对象。 n
对象中的数字(n
)可以更改,而Positive
对象本身保持不变。
换句话说,p
将添加两个add(v,p)
(通常将其定义为Positive
方法),而static
将修改正p.add(v)
(通常声明为实例方法)。
答案 4 :(得分:0)
static
和非static
方法之间是有区别的。
静态方法基本上是具有某些附加访问权限的常规方法。
另一方面,非静态方法会收到一个附加的隐藏“ this
”参数,您可以使用该参数传达调用的上下文。这样,您可以实现OOP功能,例如封装,继承和多态性。
例如,可以将非静态方法Positive.add(Positive v)
设为virtual
,并在子类ComplexPositive
中将其重写。然后,您可以继续使用Positive
对象,但是对add()
的调用将取决于对象的每个 instance 。使用静态方法无法轻松实现。
答案 5 :(得分:0)
我认为您应该从 class 开始。
类是一组数据和方法。
方法是一种消息,您可以将其发送到特定 class 类型的对象。
这些消息可以是查询,可以向您返回该对象中包含的一些数据,或者只是返回其他格式的数据。
或者您可以向对象发送命令,以更改对象中包含的数据。
什么是对象?
它只是您的类的一个实例,这意味着它是内存的一部分,其中包含以定义类的方式组织的特定数据。
在您的代码示例中,您正在定义一个 Positive 类,该类表示可以添加的整数。
因此,您编写了一个命令 add(Positive p)和一个查询 get()。
Java中的 main()方法是一种特殊的方法,JVM在运行时使用它来执行程序。
这是一个入口点。
由于Java是基于类的,因此所有内容都应放置在一个类中,所以即使是 main()方法也是如此。
为什么必须调用一个方法才能添加2个肯定值?
原因是因为您想隐藏有关此操作的详细信息。
在您的情况下,这是微不足道的,因为它只是整数的总和,但是在正常情况下,它可能非常复杂,并且您不希望逻辑在代码库中散布开来。
因此,您添加了查询和更改类中数据的逻辑,以避免在添加新功能或仅修复错误时的复杂性和问题。
在您的情况下,没有理由使用方法编写类,您可以在main方法内部执行相同的结果:
public class Positive {
public static void main(String[] args) {
int a = 5;
int b = 17;
System.out.println(a+b);
}
}
或者只是:
public class Positive {
public static void main(String[] args) {
System.out.println(5+17);
}
}