-1
interface I1 {
    int i = 10;
    void add();
    void sub();
    void del();
}
interface I2 {
    void disp();
}
class A implements I1,I2 {
    void add(){...}
    void sub(){...}
    void del(){...}
    void disp(){
        System.out.println(i);
    }
} 

此代码给出编译时错误。我不知道这段代码有什么问题。

4

6 回答 6

9

隐含地,I1.add()等人是公开的。因此,在您的课堂上,您还必须将它们公开:

public void add(){...}
public void sub(){...}
public void del(){...}
public void disp(){
    System.out.printf(i);
}

否则你会得到

Cannot reduce the visibility of the inherited method from test.I1

此外,调用printf()需要更改为:

System.out.printf("%d", i);

(第一个参数是格式字符串。)

于 2013-07-18T05:46:31.750 回答
4

不能像@NPE 提到的那样缩小可见性和

i默认情况public static final下,因此访问它

I1.i
于 2013-07-18T05:47:52.853 回答
2

接口中的所有方法默认为 public。

请参阅Java 语言规范 6.6.1,其中指出

All members of interfaces are implicitly public.

并且您不能在覆盖它们时降低方法的可见性。您需要将它们公开。

于 2013-07-18T05:51:42.523 回答
0

不使用格式就不能使用 printf 。

System.out.printf("%i", i);

很可能会允许您这样做,但如果没有格式,它可能并不总是有效。

于 2013-07-18T05:47:14.127 回答
0

添加到 Jigar Joshi 答案中,

为什么接口变量默认是静态的和最终的?

如果你使用 JDK 1.4 以上,

您可以使用静态导入;例如

  import static packagename.I1.*;

http://javarevisited.blogspot.in/2012/10/what-is-static-import-in-java-5-example-tutorial.html

于 2013-07-18T05:49:48.090 回答
0

您不能降低继承方法的可见性。在接口内部,所有变量和方法都是默认的public

interface I1 {
    int i = 10;
    void add();
    void sub();
    void del();
}

interface I2 {
    void disp();
}

public class B implements I1,I2 {
    public void add(){}
    public void sub(){}
    public void del(){}
    public void disp(){
         System.out.println(i);
    }
}
于 2013-07-23T15:47:19.907 回答