如题,下面是接口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();
}
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();
}
abstract class C implements I {
int getValue() { return 0; }
abstract void increment();
}
void setValue(int val);
int getValue() { return 0; }
abstract void increment();
}这样就对了。
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
我英文很烂,勉强翻译过来:不能降低从I继承的方法的“能见度”(这个词翻译的真是别扭),应该是可见性。
只是他的接口上声明了一个set和一个get
而抽象类只实现了get方法,并没有set方法而已实现接口的类必须显示实现此接口上的所有函数
如果是抽象类,可以将这个函数声明为abstract
接口常识:所有接口方法都是固定public域的,可以不写,但不可以换成其他的域
所有接口变量都是固定public static final 的
void setValue(int val);
int getValue();
}
单单说这段代码的话是可以编译通过的。abstract class C implements I {
int getValue() { return 0; }
abstract void increment();
}
加上这段代码就不能通过了,因为你实现接口的方法必须显示地声明方法是public的,因为接口中的所有方法都必须是public的
abstract class C implements I {
int getValue() { return 0; }
abstract void increment();
abstract void setValue(int val);
}
public int getValue() {
return 0;
}实现方法权限小于 父类方法的权限
其实什么都没必要
abstract class C implements I {
[color=#FFFF00]public int getValue() { return 0; }[/color]
abstract void increment();
}
直接写成这样都不会有错:
abstract class C implements I {
}}
接口固定是public域的是没错,你有没有想过抽象类默认的不是public域的?
接口方法的修饰符有abstract吗?在接口里的方法本来就时抽象方法
2.实现接口的方法的访问修饰符必须大于接口中的级别。所以应该加上public