为什么没有测试。这里没有工作?

时间:2016-06-02 09:21:46

标签: java

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();
  }
}

我刚学会了这个'关键字,并试图更好地理解它,我写下这个代码的印象是它将输出为: -

  • 10
  • 15

我的理解是main调用method1和method2方法,而这些方法又依次调用printMyNo方法;如果我在printMyNo方法中打印this.no,它将打印无变量值的任何方法。因此,由于method1和method2都调用printMyNo,它应该打印方法的变量值。但显然它并没有发生。请帮助我理解我错过或可能误解了这个关键字? :/

4 个答案:

答案 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将始终覆盖现有变量。

如果您不希望nostatic,则必须更改方法,特别是将它们设置为非静态方法。这很简单(例如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在本地更改值。

请注意,如果您更改了任何方法,则还必须更改其他方法,以确保它们也能正常工作。希望这很有用,可以帮助您了解实例和类变量和方法的工作原理!