默认方法中的此关键字

时间:2019-07-03 21:50:33

标签: java default-method

我知道我的问题很愚蠢,但是脑海里有些不清楚。我创建了一个具有默认方法的接口,我们将其命名为Dumb()。我想做的是在此方法中的某处使用this.argument,但这没有用。我知道一个接口不能有实例,但是该接口是由一个类实现的,我们将其命名为A。A通过调用我的Dumb()方法(a.Dumb()在main方法中有一个名为a的实例。 )。我的问题是,如果我调用我的方法(毕竟是继承的),为什么不能拥有这个?这不是通过我调用方法对对象的引用吗?而且我也知道接口类型的变量可以引用实现该接口的类的任何对象。

我对这个问题含糊其辞,但明确的解释确实有帮助。预先感谢!

1 个答案:

答案 0 :(得分:0)

我这样解释您的情况:

interface Foo {
  default int Dumb() {
    return 2*this.argument;
  }
}

class A implements Foo {
  int argument = 42;

  public static void main(String[] args) {
    A a = new A();
    System.out.println(a.Dumb());
  }
}

,您的问题为

  

A有一个argument字段,所以为什么会出现此错误:

Foo.java:4: error: cannot find symbol
    return this.argument;
               ^
  symbol: variable argument
1 error

这是因为Java要求接口本身是有效的。即使当前正在实现的所有类都碰巧具有相同名称的字段,它们也不能引用未声明的字段。

这不同于JavaScript,在JavaScript中引用是在运行时解析的;而不同于C ++,C ++中可以使用模板来解析每次使用的引用。

在Java中,您可以改为声明Foo的所有实例都必须通过添加实现类可以提供的(可能是非默认的)方法来获取您感兴趣的参数的方法:< / p>

interface Foo {
  default int Dumb() {
    return 2*getArgument();
  }
  int getArgument();
}

class A implements Foo {
  int argument = 42;

  public int getArgument() {
    return argument;
  }

  public static void main(String[] args) {
    A a = new A();
    System.out.println(a.Dumb());
  }
}