public class ThisTest {
int no = 1;
public static void main(String[] args) {
method1();
method2();
}
static void printMyNo() {
int no = 2;
System.out.println(this.no);
}
static void method1() {
int no = 10;
printMyNo();
}
static void method2() {
int no = 15;
printMyNo();
}
}
我刚学会了这个'关键字,并试图更好地理解它,我写下这个代码的印象是它将输出为: -
我的理解是main调用method1和method2方法,而这些方法又依次调用printMyNo方法;如果我在printMyNo方法中打印this.no,它将打印无变量值的任何方法。因此,由于method1和method2都调用printMyNo,它应该打印方法的变量值。但显然它并没有发生。请帮助我理解我错过或可能误解了这个关键字? :/
答案 0 :(得分:2)
System.out.println(this.no); // this does not even compile
您需要了解的有关this
的另一件事是它不能在static
方法中使用。
int no = 10; // creates a new variable, does not change outer "no"
您正在声明与实例字段同名的局部变量(无论如何都是不可见的,因为您使用的是静态方法,请参见上文)。当方法结束时,它们会消失,并且对同名的实例或类变量没有影响。
如果您要分配到班级或实例上的no
,只需说no = 10
(不含int
),或者,如果是#34;阴影&# 34;,因为你有这些同名的局部变量this.no = 10
(例如变量)或ThisTest.no = 10
(对于类变量)。
答案 1 :(得分:1)
您不能在静态方法中使用this
。
this
指的是类的当前实例。您在static
方法中没有该类的当前实例,因此使用它是一个编译时错误。
为了让它工作,您需要将类级no
变量设为静态:
static int no = 1;
并将其称为
ThisTest.no
(如果您在范围内有另一个变量no
)或使您的方法非静态,并在main方法中实例化该类:
ThisTest instance = new ThisTest();
instance.method1();
答案 2 :(得分:0)
您永远不会更改this.no
,只需创建从未使用的局部变量。
将参数传递给被调用的方法:
static void method1() {
printMyNo(10);
}
static void printMyNo(int no) {
System.out.println(no);
}
答案 3 :(得分:0)
首先,您的代码中存在一些不一致的内容,包括已完成的工作和可执行的操作。您无法在this
方法中使用static
,因此还有其他选项:将no
变量更改为static
或将您的方法设置为非静态。
假设no
变量是一个类变量(因此static
),您可以在方法中使用它,如下所示(给出method1
的示例):
static void method1() {
no = 10;
printMyNo();
}
这里发生的是no
变量(基于上述假设定义为static
)已经存在,因此您无需重新定义它。实际上,在方法中定义新的int no
将始终覆盖现有变量。
如果您不希望no
为static
,则必须更改方法,特别是将它们设置为非静态方法。这很简单(例如method1
):
void method1() {
this.no = 10;
printMyNo();
}
在这种情况下,您可以访问对象实例的no
变量以进行更改。同样,如上所述,重新定义方法中的变量是不正确的。
最后但并非最不重要的是,您可能希望使用no
变量的值而不会长期更改存储值。如果它是同一类的类或实例变量,您可以这样做:
int no = no; // when it is a static variable and the method is static
int no = this.no; // when the method and variable are instance
这样,您可以使用方法中定义的新变量no
在本地更改值。
请注意,如果您更改了任何方法,则还必须更改其他方法,以确保它们也能正常工作。希望这很有用,可以帮助您了解实例和类变量和方法的工作原理!