首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中的调用方法

问Java中的调用方法
EN

Stack Overflow用户
提问于 2015-03-05 21:55:43
回答 4查看 15.7K关注 0票数 3

我是个初学者,我正试图掌握Java中的方法。通常,我理解静态方法和非静态方法之间的区别,但有时,在阅读其他代码时,我对如何编写感到困惑。

据我所知,静态方法可以用对象调用,也可以不带对象调用。非静态方法需要调用一个对象,但是,当在另一个非静态方法中调用非静态方法时,在书面形式的中,可以只通过名称(例如method())调用它,而不需要对对象(如object.method()或this.method())进行书面引用。

当非静态方法调用可以用这种方式编写时,还有其他情况吗?除此之外,还有其他方法来调用方法吗?

如有任何意见,我将不胜感激。

EN

回答 4

Stack Overflow用户

发布于 2015-03-05 22:02:11

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

代码语言:javascript
复制
public class Foo {
    public void doSomething() {
        doSomethingElse();   // equivalent to "this.doSomethingElse()"
    }

    private void doSomethingElse() {
        System.out.println("Bar");
    }
}
票数 5
EN

Stack Overflow用户

发布于 2015-03-05 22:19:28

让我们暂时不要担心静态/非静态,那是另一罐蠕虫。让我们考虑一下,到目前为止,您所构建的程序是什么样的;也许您已经设计了一个程序,比如计算两个(x,y)坐标之间的距离。

代码语言:javascript
复制
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,那么我们的角色就遇到了一堵墙!下面是一段视频,解释为什么你能真正做到这一点:二维点的碰撞检测

我想要重复输入相同的公式吗?还是浪费时间复制和粘贴?不,我很懒。这就是为什么我给电脑编程来帮我做事情。

然而,我所做的是设计能够在我的大主程序中运行的小程序。这就是所谓的方法。

代码语言:javascript
复制
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,而不是距离;最好的编程实践是不要将变量命名为与方法相同的变量。

第二,我提交了一个返回语句。现在,想想我展示的第一个程序,当它完成时,它在做什么?没什么。印在屏幕上就这样了。它关闭并清除记忆。但如果我需要以后的距离呢?嗯,这就是return进来的地方。它确保在计算之后,在清除内存之前,它想把它还给你。

如果您已经了解了Math.random(),请注意您需要存储或使用它,否则它就会永远消失。这是因为Math.random()有一个双的返回类型。类似于System.out.println()的东西有一个返回类型的void,因为它不‘返回’任何东西,只会在屏幕上显示文本。

方法背后的基本前提是:

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

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

既然我已经将distance作为一种方法,我可以在任何时候任意使用它三次:

代码语言:javascript
复制
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");
票数 3
EN

Stack Overflow用户

发布于 2015-03-05 22:07:05

基本上,您可以调用如下非静态方法:method();或this.method();。

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

两人都会以同样的方式工作。

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

代码语言:javascript
复制
private int a = 1;

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

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

希望能帮上忙。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28888518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档