先看下面这个代码:
interface Monster {
void menace();
}
interface DangerousMonster extends Monster {
void destroy();
}
interface Lethal {
void kill();
}
interface Vampire extends DangerousMonster, Lethal {
void drinkBlood();
}
class DragonZilla {
public DangerousMonster getDangerousMonster() {
return new DangerousMonster(){//匿名类实现DangerousMonster接口
public void menace() {
System.out .println("DangerousMonster.menace");
}
public void destroy() {
System.out .println("DangerousMonster.destroy");
}
};
}
}class VeryBadVampire {
public Vampire getVampire(){
return new Vampire(){//匿名类实现Vampire接口 public void drinkBlood() {
System.out .println("Vampire.drinkBlood");
}
public void destroy() {
System.out .println("Vampire.destroy");
}
public void menace() {
System.out .println("Vampire.menace");
}
public void kill() {
System.out .println("Vampire.kill");
} };
}
}public class HorrorShow {
static void u(Monster b) { b.menace(); }
static void v(DangerousMonster d) {
d.menace();
d.destroy();
}
static void w(Lethal l) { l.kill(); }
public static void main(String[] args) {
DragonZilla dz = new DragonZilla();
DangerousMonster barney=dz.getDangerousMonster();
u(barney);
v(barney);
VeryBadVampire vampire = new VeryBadVampire();
Vampire vlad=vampire.getVampire();
u(vlad);
v(vlad);
w(vlad);
}
}
我用两个匿名类实现两个接口,我编译运行都没问题,
现在你按我说的去做会发现一个问题,
1先编译上面的代码->2把代码变成如下:
interface Monster {
void menace();
}
//interface DangerousMonster extends Monster {
//void destroy();
//}
interface Lethal {
void kill();
}
//interface Vampire extends DangerousMonster, Lethal {
//void drinkBlood();
//}
class DragonZilla {
public DangerousMonster getDangerousMonster() {
return new DangerousMonster(){//匿名类实现DangerousMonster接口
public void menace() {
System.out .println("DangerousMonster.menace");
}
public void destroy() {
System.out .println("DangerousMonster.destroy");
}
};
}
}class VeryBadVampire {
public Vampire getVampire(){
return new Vampire(){//匿名类实现Vampire接口 public void drinkBlood() {
System.out .println("Vampire.drinkBlood");
}
public void destroy() {
System.out .println("Vampire.destroy");
}
public void menace() {
System.out .println("Vampire.menace");
}
public void kill() {
System.out .println("Vampire.kill");
} };
}
}public class HorrorShow {
static void u(Monster b) { b.menace(); }
static void v(DangerousMonster d) {
d.menace();
d.destroy();
}
static void w(Lethal l) { l.kill(); }
public static void main(String[] args) {
DragonZilla dz = new DragonZilla();
DangerousMonster barney=dz.getDangerousMonster();
u(barney);
v(barney);
VeryBadVampire vampire = new VeryBadVampire();
Vampire vlad=vampire.getVampire();
u(vlad);
v(vlad);
w(vlad);
}
}
编译这段代码,你发现依然可以,但是,现在你把修改后(注释后的代码放到)代码文件放到另外一个新的文件夹下编译,你会发现不能通过,从出错的地方来看是缺少类DangerousMonster.class和Vampire.class类,
我也不知道自己想问什么,原来觉得,匿名类实现接口本来意义是做检测,以为没有接口依然可以,现在..去掉了就不是匿名类了,象是一个new对象的过程,但是new()后面有{方法()} 这又不好解释是new对象,因此,修改成注释后还能编译成功我很郁闷.

解决方案 »

  1.   

    因为编译的时候会从classpath上查找相关类呀,你注释掉DangerousMonster接口和Vampire接口,但在classpath上还是能找到这些类,所以编译的时候肯定没问题了,你放到另一个文件夹下,当然就找不到了,因为classpath一般都是包含当前文件夹的。这个很正常的,这个相当于你把每个接口、每个类都分别写到相应的文件下,第一个全编译,第二次只编译部分,呵呵,仔细想想就明白了
      

  2.   

    谢谢,明白了一些,我刚开始学java在做thinking in java 作业时自己弄出来这个问题,呵呵