我是个初学者,我正试图掌握Java中的方法。通常,我理解静态方法和非静态方法之间的区别,但有时,在阅读其他代码时,我对如何编写感到困惑。
据我所知,静态方法可以用对象调用,也可以不带对象调用。非静态方法需要调用一个对象,但是,当在另一个非静态方法中调用非静态方法时,在书面形式的中,可以只通过名称(例如method())调用它,而不需要对对象(如object.method()或this.method())进行书面引用。
当非静态方法调用可以用这种方式编写时,还有其他情况吗?除此之外,还有其他方法来调用方法吗?
如有任何意见,我将不胜感激。
发布于 2015-03-05 22:02:11
也许您在考虑调用同一个类中的方法,例如:
public class Foo {
public void doSomething() {
doSomethingElse(); // equivalent to "this.doSomethingElse()"
}
private void doSomethingElse() {
System.out.println("Bar");
}
}发布于 2015-03-05 22:19:28
让我们暂时不要担心静态/非静态,那是另一罐蠕虫。让我们考虑一下,到目前为止,您所构建的程序是什么样的;也许您已经设计了一个程序,比如计算两个(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,那么我们的角色就遇到了一堵墙!下面是一段视频,解释为什么你能真正做到这一点:二维点的碰撞检测
我想要重复输入相同的公式吗?还是浪费时间复制和粘贴?不,我很懒。这就是为什么我给电脑编程来帮我做事情。
然而,我所做的是设计能够在我的大主程序中运行的小程序。这就是所谓的方法。
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作为一种方法,我可以在任何时候任意使用它三次:
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");发布于 2015-03-05 22:07:05
基本上,您可以调用如下非静态方法:method();或this.method();。
当您在this中使用第二种语法时,您将告诉编译器您将从您所在的实例(显式)调用。
两人都会以同样的方式工作。
但是,还有另一个例子可以为您清楚地说明这一点。考虑变量。检查此代码:
private int a = 1;
public void method(int a) {
this.a = a;
}对象的变量是使用局部变量设置的。如果您不使用this进行该调用,编译器就会理解您正在处理的变量只是本地变量。
希望能帮上忙。
https://stackoverflow.com/questions/28888518
复制相似问题