通过对象在静态方法中使用非静态变量?Java

4

由于我们不能在静态方法中使用this,也不能使用非静态变量,那么为什么我们可以在静态方法中使用使用非静态变量的对象呢?

这就是我的意思:

public int x;
public int y;

public Account(int a, int b) {
    this.x = a;
    this.y = b;
}

public static void Swap(Account acc) {
    int holder;
    holder = acc.x;
    acc.x = acc.y;
    acc.y = holder;
}

所以Swap()可以正常工作,即使对象内的变量不是静态的。我不明白这部分内容。希望能得到一些帮助。TIA!

我能想到的一个潜在原因是,只有最初的输入才是重要的,所以如果参数是一个对象,并且基本上“通过”了第一个检查(静态/非静态),那么其余部分就不重要了。再次强调,不确定,这也是我问的原因。 - Tom
4
想一想:访问x和访问acc.x有什么区别?如果Java不是静态的,Java会阻止你引用哪个变量?acc是静态的吗? - ernest_k
2个回答

7

static方法无法访问当前(this)实例的实例变量,因为在它们的上下文中不存在这样的实例。

但是,如果你向它们传递一个实例的引用,它们就可以访问任何对它们可见的实例变量和方法。

对于您的swap示例,如果该方法不是static,您可以删除acc参数并操作this的实例变量:

public void swap() {
    int holder;
    holder = this.x;
    this.x = this.y;
    this.y = holder;
}

谢谢Eran,那么我的假设是正确的吗?它本质上“检查”输入是否为静态/非静态原始类型,如果不是,则只要它是引用类型,就会运行。然后引用到非静态属性。讲师解释说,将swap实现为静态的是一种惯例,因为它实际上并没有在对象内部存储任何东西。 - Tom
如果您所说的“输入”是指您的交换方法的参数,那么该参数不能是静态的(根据定义,它始终是局部变量),因此没有什么可以检查的。只要它是引用类型(即不是原始类型),您就可以访问其所有可见的实例变量和方法。 - Eran
明白了。谢谢伙计! - Tom

1

在静态方法中,您不能使用this,因为Java不知道您指的是哪个实例(哪个this)。

您可以将对象的引用作为参数acc传递给静态方法,因为调用者指定要传递哪个实例。

当您的静态方法引用acc时,Java知道您指的是哪个实例。因此,您可以使用acc的任何可访问字段或方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接