10

我的问题是如何在接口中编写 setter/getter 方法和静态字段并在另一个类中实现它。

一个例子:

public interface MyInterface {
int number = 0;

public int setNumber(int num);{

 }
}

// Use it

public MyClass implements MyInterface{

 ...

public int setNumber(int num) {
   number = num;   // Error, Why?
 }
}

我收到错误,number = numsetName(...)方法没有错误!

4

5 回答 5

24

您不能在接口中定义实例字段(除非它们是常量 -static final值,感谢Jon),因为它们只是实现的一部分。因此,只有getter 和 setter在接口中,而字段在实现中出现。

并且setNumber应该返回 avoid而不是int. 为了得到我建议你添加int getNumber().

public interface MyInterface {
  void setNumber(int num); // public is implicit in interfaces
  int getNumber();         // obviously
}

public class MyClass implements MyInterface {
  private int number = 0;
  
  public void setNumber(int num) { this.number = num; }
  public int getNumber() { return this.number; }
}

如您所见, onlysetNumber是 的一部分MyInterface。消费者不需要知道数字是如何存储的,因此它是一个实现细节。

此外,在 Java 中,您将类和接口命名为PascalCase而不是camelCase.

于 2012-12-14T12:13:47.383 回答
9

当您在接口中定义一个值时,它是隐式public static final 的,即它是不可变的,而不是实例字段。

接口用于定义契约,而不是行为,因此坚持所有实现都具有此字段是没有意义的。

顺便说一句,如果你有一个abstract classas well as 或 instead of aninterface

于 2012-12-14T12:15:35.537 回答
4

您无法更改接口中声明的字段,因为它们是由 deafulat 声明的public static final

您会看到final,一旦初始化,它们就无法更改。

而且在接口中,您不能像在代码中那样实现方法。

只是放在;方法签名之后而不是{}(甚至不是空的{}):

public int setNumber(int num);
于 2012-12-14T12:15:31.290 回答
3

接口不能包含方法体定义和字段 are ,public默认情况下通常用于常量声明。它将在您要实现此接口的位置进行定义。finalstatic

在 Java 编程语言中,接口是一种引用类型,类似于类,只能包含常量、方法签名和嵌套类型。没有方法体。接口不能被实例化——它们只能由类实现或由其他接口扩展。

参考

abstract class可以包含具体方法以及抽象方法。

于 2012-12-14T12:14:15.863 回答
3

interface默认情况下,其中的字段是public static final即常量。请记住,您已经在您的实现类中进行了初始化numberinterface并试图在您的实现类中更改其值,这违反了最终变量的法则。

来自JLS

变量可以声明为final。最终变量只能分配一次。声明一个变量 final 可以作为有用的文档,说明它的值不会改变,并且可以帮助避免编程错误。

如果最终变量被分配给它是一个编译时错误,除非它在分配之前立即被明确地未分配(第 16 节)。

默认情况下,接口中的方法也是公共抽象的。我不明白您界面中的方法签名。它应该如下所示。

public void method();
于 2012-12-14T12:16:23.420 回答