我试图了解Java中“调用对象的方法”的工作方式,但这使我感到困惑

时间:2018-12-10 12:55:52

标签: java

我目前已经读过the documentation 3次了,我很难将所写的内容应用到自己的简单程序中。我试图从根本上理解为什么我在下面的代码中确实写了p.add(v);

我声明一个对象p和一个对象v,其值分别为5和17。然后,我的方法add将两个值加在一起。我采用了参数v,因此我理解在主方法中引用对象v时必须将其放在add(v)的括号中。但是,我很难用言语来解释为什么我需要相对于add调用方法pp也不像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;
    }
}

6 个答案:

答案 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运算符(称为构造函数方法)来初始化两个类实例vnew

pvPositive的两个不同实例。

每个pv都具有此类中列出的方法(此处为addget),每个方法对于每个实例都是唯一的。

然后使用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);
    }
}