【问题标题】:Using a non static variable on a static method through an object? Java通过对象在静态方法上使用非静态变量?爪哇
【发布时间】:2019-08-08 11:41:18
【问题描述】:

既然我们不能在静态方法中使用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() 会起作用,即使对象内部的变量不是静态的。我不明白这部分。将不胜感激一些帮助。蒂亚!

【问题讨论】:

  • 我能想到的一个潜在原因是,只有初始输入很重要,所以如果参数是一个对象,并且它基本上“通过”了第一次检查(静态/非静态),则休息不重要。同样,不确定这就是我要问的原因。
  • 想一想:访问x和访问acc.x有什么区别?如果它不是静态的,Java 会阻止你引用的变量是什么? acc 是静态的吗?

标签: java object methods static non-static


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢 Eran,所以我的假设是正确的?它本质上“检查”该输入是否为静态/非静态原始类型,如果不是,则只要它是引用类型,它就会运行。然后引用非静态属性。讲师解释说,将交换实现为静态是一种约定,因为它实际上并没有在对象内部存储任何东西。..
  • @user472288 如果“输入”是指交换方法的参数,则该参数不能是静态的(根据定义,它始终是局部变量),因此无需检查。只要它是引用类型(即不是原始类型),您就可以访问其所有可见的实例变量和方法。
  • 知道了。谢谢老兄!
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 2014-11-30
    • 1970-01-01
    • 2012-03-30
    • 2013-02-26
    相关资源
    最近更新 更多