我是初学者,我正在努力掌握Java中的方法。一般来说,我理解静态方法和非静态方法之间的区别,但有时候,阅读其他代码,我对特定调用编写的方式感到困惑。
据我所知,静态方法可以在有或没有对象的情况下调用。非静态方法需要调用一个对象,但是当在另一个非静态方法中调用非静态方法时,在书面形式中,它只能通过名称调用(如 method()),没有对象的书面引用(如 object.method()或 this.method())。
还有另一种情况,可以用这种方式编写非静态方法调用吗? 是否有另一种方法可以调用超出这些方法的方法?
如果有任何意见,我将不胜感激。
答案 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中也存在差异。
另请注意,当您调用静态方法时,您使用包含静态方法的类的名称,因为静态方法是为类定义的概念,而不是实例化该类的特定对象。