【问题标题】:Calling methods in Java在 Java 中调用方法
【发布时间】:2015-05-07 10:50:50
【问题描述】:

我是初学者,我正在尝试掌握 Java 中的方法。一般来说,我理解静态方法和非静态方法之间的区别,但有时,阅读其他代码时,我对特定调用的编写方式感到困惑。

据我了解,可以使用或不使用对象来调用静态方法。非静态方法需要调用一个对象,但是当非静态方法在另一个非静态方法中被调用时,书面形式,它可以只通过一个名字来调用(如 method()),没有对对象的书面引用(如 object.method()this.method())。

还有另一种情况,非静态方法调用可以这样写吗? 除了这些,还有其他方法可以调用方法吗?

如果有任何 cmets,我将不胜感激。

【问题讨论】:

  • 你想要的是反射吗?看这里:stackoverflow.com/questions/37628/…
  • foo() 在非静态类方法中等价于this.foo()this 是隐含的。除此之外没有什么特别之处。
  • @stribizhev 他明确表示书面形式,我猜他说是为了排除反射作为可能的答案。

标签: java methods call


【解决方案1】:

让我们暂时不要担心静态/非静态,那是另一种蠕虫。让我们想想到目前为止您主要构建了哪些类型的程序;也许你设计了一个程序,比如计算两个 (x,y) 坐标之间的距离。

public static void main(String[] args) {
    double x1 = 4.0;
    double y1 = 3.0;
    double x2 = 4.0;
    double y2 = 4.0;

    double x = Math.pow(x2 - x1, 2);
    double y = Math.pow(y2 - y1, 2);
    double distance = Math.sqrt(x+y);
    System.out.println("The distance is" + distance);
}

现在,如果您想在更复杂的程序(例如视频游戏)中使用该代码来确定您的角色是否撞到墙上,会发生什么?现在您有 3 个坐标(A 和 B 是墙,C 是角色),您需要找出所有三个坐标(AB、AC 和 BC)之间的距离。为什么?因为如果 AB == AC + BC,那么我们的角色就撞墙了!这是一个视频,解释了为什么这对您真正有效:Collision Detection of 2D Points

我想重复输入相同的公式吗?还是浪费时间复制和粘贴?不,我很懒。这就是为什么我要让计算机为我做事。

然而,我可以做的是设计可以在我的大型主程序中运行的小型程序。这些被称为方法

public static double distance(double x1, double y1, double x2, double y2) {
    double x = Math.pow(x2 - x1, 2);
    double y = Math.pow(y2 - y1, 2);
    double dist = Math.sqrt(x+y);
    return dist;
}

现在,请注意我做了两件事不同。

第一,我将变量命名为 dist 而不是 distance;最好不要将变量命名为与方法相同的名称。

二,我投了一个return statement。现在,想想我展示的第一个程序,它完成后在做什么?没有。它打印到屏幕上,就是这样。它关闭并清除内存。但是如果我以后需要距离怎么办?嗯,这就是 return 的用武之地。它确保在完成计算之后,在清除内存之前,它想把它还给你。

如果您了解了Math.random(),请注意您需要存储或使用它,否则它就一去不复返了。那是因为Math.random() 有一个返回类型 doubleSystem.out.println() 之类的返回类型为 void,因为它不“返回”任何内容,只是在我们的屏幕上显示文本。

方法背后的基本前提是:

<access modifier> <return type> <name> (<parameters>) { }

目前,访问修饰符应该保持public static。稍后您将了解课程。 return type 很重要,因为这就像您创建变量时一样;您必须告诉 Java 它是什么数据类型——对于方法也是如此。你必须告诉 Java 这个很小很小的程序会产生什么数据类型。 name 与您命名 variables 时没有什么不同,但现在,您必须添加 parameters,它们只是方法中的占位符,因为我们不知道会产生什么值/变量以后会用到!

现在我有了distance 作为方法,我可以在任何我想要的地方使用它三遍:

double distAB = distance(4, 0, 4, 4);
double distAC = distance(4, 0, 4, 2);
double distBC = distance(4, 4, 4, 2);
if (distAB == distAC + distCB)
    System.out.println("Collision Detected");

【讨论】:

  • 补充一下,现在我已经编写了一个public static 方法,我可以从任何地方相对而言)!如果我将我的文件保存为Collision.java,然后创建另一个文件Pacman.java,然后在我的Pacman 中的main method 中,我可以拥有:Collision.distance(x1, y1, x2, y2); 这是静态方法发挥作用的地方,我指的是它的类内置,而不必做new Collision() 或类似的东西。
  • 再补充一下,类方法的想法现在说如果我想使用自定义数据类型而不是doubles,比如Point 类,它有自己的distance(Point other) {} 方法.这个版本的distance 现在将永远直接与其原点相关联;而上面每次调用时都是两个不同的点。 Point p1 = new Point(0,0);Point p2 = new Point(1,1); 现在相互交互,其中一个点作为参考的(对不起,双关语),例如p1.distance(p2);
【解决方案2】:

当您在 Java 中的类中编写 this 时(或暗示时),您指的是实例化该类的对象,因此 this 是对对象而不是类的引用。 一开始很难理解,但是在面向对象编程中对象和类的概念之间存在差异,因此在 Java 中也是如此。

还请注意,当您调用静态方法时,您使用包含静态方法的类的名称,因为静态方法是为类定义的概念,而不是实例化该类的特定对象。

【讨论】:

    【解决方案3】:

    基本上,您可以像这样调用非静态方法:method();this.method();

    当您使用带有this 的第二种语法时,您将告诉编译器您将从您所在的实例调用(显式)。

    两者的工作方式相同。

    但是,还有另一个例子可以为您明确这一点。考虑变量。检查此代码:

    private int a = 1;
    
    public void method(int a) {
        this.a = a;
    }
    

    对象的变量是使用局部变量设置的。如果您不使用 this 进行该调用,编译器会理解您正在处理的变量只是本地变量。

    希望对你有帮助。

    【讨论】:

    • 如果在 TheClass 中定义了静态方法,您可以通过简单的 methodName(arguments) 或 TheClass.methodName(参数)。
    【解决方案4】:

    也许您正在考虑调用同一类中的方法,例如:

    public class Foo {
        public void doSomething() {
            doSomethingElse();   // equivalent to "this.doSomethingElse()"
        }
    
        private void doSomethingElse() {
            System.out.println("Bar");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-09-28
      • 2015-09-15
      • 2013-10-01
      • 2013-04-03
      • 2012-03-22
      • 2011-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多