你只有几个小问题。您在评论中提到您对 C 有一些经验,所以我将尝试绘制一些基本的类比。方法static
(例如main
)的行为类似于普通的 C 函数。static
但是,非方法采用隐藏参数: this
,它指的是该方法要对其进行操作的对象。当您编写这样的方法时:
private void swapMe(int a, int b) {
// ...
它的真正含义是这样的:
private void swapMe(VeryBasicJava this, int a, int b){
// ^^^^^^^^^^^^^^^^^^^^
// ...
因为this
参数被特殊处理,所以static
在对象上调用非方法有一种特殊的语法:
myInstance.swapMe(someA, someB);
// ^^^^^^^^^^ ^^^^^ ^^^^^
// this a b
并且因为swapMe
没有声明static
,它期望像上面那样被调用。
main
在类中声明的事实VeryBasicJava
并不意味着您自动拥有一个VeryBasicJava
对象。同样,因为main
is static
,它就像一个普通的 C 函数:
void VeryBasicJava_main(...) {
// ...
为了创建对象的实例,您使用new
:
VeryBasicJava vbj = new VeryBasicJava();
这类似于malloc
在 C 中:
VeryBasicJava *vbj = malloc(sizeof(VeryBasicJava));
VeryBasicJava_construct(vbj);
使用实例,您可以调用方法:
vbj.swapMe(spam, eggs);
您的另一个问题是双重的:一个scope和 of members。您可能知道,作用域是指变量存在的位置。采取这个功能:
1: private void swapMe(int a, int b) {
2: int a;
3: int b;
4: int tmp = a;
5: this.a = b;
6: this.b = a;
7: }
调用此方法时,会发生以下情况:
a
和b
被创建,给定在调用中指定的值swapMe
。
创建一个新a
的,本地到swapMe
,具有默认值0
。这a
隐藏了参数a
,并且没有办法区分它们。
创建了一个新b
的,也是严格本地的。它也有默认0
值,并且隐藏了参数b
。
tmp
被创建,并且它的值被设置为新声明的值a
,所以它也是0
。
[见下文]
[见下文]
当地人a
和b
不复存在,参数a
和 也是如此b
。
在第 5 行和第 6 行中,您尝试使用语法this.a
来引用本地a
而不是参数。尽管这种语法存在于 Java 中,但它并不符合您的意思。参数被视为与局部变量相同,因此不是区分这两个类别,而是this.a
区分 locals 和members。现在,什么是会员?好吧,假设您的类声明包含变量声明:
class VeryBasicJava {
private int a;
private int b;
// ...
}
这就像 C 中的成员声明struct
:
struct VeryBasicJava {
int a;
int b;
};
这意味着当您创建以下实例时VeryBasicJava
:
VeryBasicJava vbj = new VeryBasicJava();
该实例有自己的变量a
and b
,可以在任何非static
方法中使用:
public void print() {
System.out.println("a is " + a);
System.out.println("b is " + b);
}
如果您有一个与成员同名的局部变量,那么您必须使用this
显式声明您要引用该成员。这个完整的程序说明了如何声明、使用和区分成员和局部变量。
class VeryBasicJava {
private int a;
private int b;
private int c;
public static void main(String[] args) {
VeryBasicJava vbj = new VeryBasicJava();
vbj.a = 3;
vbj.b = 4;
vbj.c = 5;
vbj.print(1);
}
public void print(int a) {
int b = 2;
System.out.println("a is " + a);
System.out.println("b is " + b);
System.out.println("c is " + c);
System.out.println("this.a is " + this.a);
System.out.println("this.b is " + this.b);
System.out.println("this.c is " + this.c);
}
}
它将产生以下输出:
a is 1
b is 2
c is 5
this.a is 3
this.b is 4
this.c is 5
我希望这些例子和解释是有帮助的。