用Java调用方法

时间:2015-03-05 21:55:43

标签: java methods call

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

据我所知,静态方法可以在有或没有对象的情况下调用。非静态方法需要调用一个对象,但是当在另一个非静态方法中调用非静态方法时,在书面形式中,它只能通过名称调用(如 method()),没有对象的书面引用(如 object.method() this.method())。

还有另一种情况,可以用这种方式编写非静态方法调用吗? 是否有另一种方法可以调用超出这些方法的方法?

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

4 个答案:

答案 0 :(得分:5)

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

public class Foo {
    public void doSomething() {
        doSomethingElse();   // equivalent to "this.doSomethingElse()"
    }

    private void doSomethingElse() {
        System.out.println("Bar");
    }
}

答案 1 :(得分:3)

让我们不要担心一秒钟的静态/非静态,这是另一种蠕虫病毒。让我们来思考一下你到目前为止主要建立的程序类型;也许你已经设计了一个程序,比如计算两个(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是Wall,C是Character),你需要找出所有三个坐标(AB,AC和BC)之间的距离。为什么?因为如果AB == AC + BC,那么我们的角色就碰壁了!这是一个视频,解释了为什么这将真正适用于您:Collision Detection of 2D Points

我是否想重复输入相同的公式?还是浪费时间复制和粘贴?不,我很懒。这就是我编程计算机为我做事的原因。

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

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命名为dist而不是距离;只是很好的编程习惯,不要将变量命名为与方法相同。

两,我投入了返回声明。现在,想想我展示的第一个项目,它完成后会做什么?没有。它打印到屏幕上即可。它会关闭并清除内存。但是,如果我以后需要距离呢?那么,返回就会出现。它确保在完成计算之后,在清除内存之前,它希望将它还给你。

如果您已了解Math.random(),请注意您需要存储或使用它,否则它会一直消失。这是因为Math.random()返回类型 double System.out.println()之类的返回类型为 void ,因为它不会返回'任何东西,只需在屏幕上显示文字。

方法背后的基本前提是:

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

目前,访问修饰符应保持public static。您稍后将了解课程。 return type是重要的,因为这就像你做变量一样;你必须告诉Java它是什么数据类型 - 对于一个方法是相同的。你必须告诉Java这个微小的程序将产生什么数据类型。 name与命名变量时没有什么不同,但现在,您必须添加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");

答案 2 :(得分:1)

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

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

两者都会以同样的方式运作。

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

private int a = 1;

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

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

希望它有所帮助。

答案 3 :(得分:1)

当您在Java中编写this(或隐含)时,您正在引用实例化该类的对象,因此this是对对象而非类的引用。 这一开始很难实现,但面向对象编程中的对象和类的概念之间存在差异,因此在Java中也存在差异。

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