如题,下面是接口I的定义:
interface I {
void setValue(int val);
int getValue();
}
这句代码编译时不能通过,这是书中的一道题目,但是我不知道为什么不能通过?各位大拿给分析下
书中有句话:当类实现了某个接口时,它必须实现接口中所有的抽象方法,否则这个类必须被定义为抽象类。
我的理解是下面这个class C已经被定义成abstract类了,那它只实现了I的getValue方法,应该没错啊。想不通啊……
abstract class C implements I {
int getValue() { return 0; }
abstract void increment();
}

解决方案 »

  1.   

    怎么没人回答,~~~~(>_<)~~~~ ,急求,不知道心里不踏实,或者答案错了?
      

  2.   

    接口定义是没错的,主要是下面的代码不能编译通过:
    abstract class C implements I {
    int getValue() { return 0; }
    abstract void increment();
    }
      

  3.   

    因为你在实现接口中void setValue(int val);个方法时,不加访问修饰符的缘故
      

  4.   

    我知道了,仔细想想还是我理解错了,原来抽象类不是要“实现”所有的方法,至少要“声明”所有的方法,abstract class C implements I {
    void setValue(int val);
    int getValue() { return 0; }
    abstract void increment();
    }这样就对了。
      

  5.   

    因为你的方法他默认的访问修饰符是private
      

  6.   

    不是的,接口默认的方法只有public和abstract。如果是private,那样的话子类就没法访问它了。
      

  7.   

    接口默认的方法都是public和abstract。
      

  8.   

    类中默认的是default,不是protected的
      

  9.   

    顶一下吧,接口不加修饰符的getValue方法里默认的是public,如果加上private会报下面的错
    Illegal modifier for the interface method I.setValue(); only public & abstract 
     are permitted
    implements这个接口后,getValue方法不加修饰符默认是default,降低了所实现接口的原访问级别,报下面的错:
    Cannot reduce the visibility of the inherited method from I
      

  10.   

    Cannot reduce the visibility of the inherited method from I
    我英文很烂,勉强翻译过来:不能降低从I继承的方法的“能见度”(这个词翻译的真是别扭),应该是可见性。
      

  11.   

    简单的说,从接口继承的方法必须声明称public的!!!!!!!!
      

  12.   

    接口中的方法必须是public的,不然从接口就没法继承方法了(因为方法不可见)。当抽象继承了接口之后,必须是要实现接口中的方法的,最起码要有这个方法。
      

  13.   

    都什么乱七八糟的回答,不要误导别人
    只是他的接口上声明了一个set和一个get
    而抽象类只实现了get方法,并没有set方法而已实现接口的类必须显示实现此接口上的所有函数
    如果是抽象类,可以将这个函数声明为abstract
      

  14.   

    在讨论接口访问规则的朋友们
    接口常识:所有接口方法都是固定public域的,可以不写,但不可以换成其他的域
    所有接口变量都是固定public static final 的
      

  15.   

    interface I {
    void setValue(int val);
    int getValue();
    }
    单单说这段代码的话是可以编译通过的。abstract class C implements I {
    int getValue() { return 0; }
    abstract void increment();
    }
    加上这段代码就不能通过了,因为你实现接口的方法必须显示地声明方法是public的,因为接口中的所有方法都必须是public的
      

  16.   


    abstract class C implements I {
    int getValue() { return 0; }
    abstract void increment();
    abstract void setValue(int val);
    }
      

  17.   


    public int getValue() { 
      return 0; 
    }实现方法权限小于 父类方法的权限
     
      

  18.   

    我日 你们都被楼主耍了
    其实什么都没必要
    abstract class C implements I {
    [color=#FFFF00]public int getValue() { return 0; }[/color]
    abstract void increment();
    }
    直接写成这样都不会有错:
    abstract class C implements I {
    }}
      

  19.   

    没有set方法又如何?33楼说的对,就算是写个空的抽象类去实现接口都不会报错,凭什么只实现一个就报错啊?明明报的错恰恰就是实现的get方法上,你不要误导别人好不好?
    接口固定是public域的是没错,你有没有想过抽象类默认的不是public域的?
      

  20.   


    接口方法的修饰符有abstract吗?在接口里的方法本来就时抽象方法
      

  21.   

    1.少实现了一个方法。
    2.实现接口的方法的访问修饰符必须大于接口中的级别。所以应该加上public