public class AbstractMethodError extends IncompatibleClassChangeError当应用程序试图调用一个抽象方法时,抛出此错误。通常由编译器捕获此错误;如果某个类的定义自当前执行方法最后一次编译以后作了不兼容的更改,则此错误只可能在运行时发生。
就像火龙果说的,编译之后再修改类就只能在运行时抛出该异常了Thrown when an application tries to call an abstract method. Normally, this error is caught by the compiler; this error can only occur at run time if the definition of some class has incompatibly changed since the currently executing method was last compiled.
按照我的步骤做:1建立两个包pack1和pack22在pack1包下建立类A
代码:
package pack1;public abstract class A {
abstract void set();
}3在pack2包下建立类B
代码:
package pack1;public abstract class A {
abstract void set();
}4在pack1包下建立类C
代码
package pack1;import pack2.B;public class C extends B {
public static void main(String[] args) {
A the=new C();
the.set();
}
}5运行类C中的测试代码
你们试一试也许是我的编译器的问题
package pack2;import pack1.A;public abstract class B extends A { protected String set() {
return null;
}}
按照我的步骤做:1建立两个包pack1和pack22在pack1包下建立类A
代码:
package pack1;public abstract class A {
abstract void set();
}3在pack2包下建立类B
代码:
package pack2; import pack1.A; public abstract class B extends A { protected String set() {
return null;
} } 4在pack1包下建立类C
代码
package pack1;import pack2.B;public class C extends B {
public static void main(String[] args) {
A the=new C();
the.set();
}
}5运行类C中的测试代码
你们试一试也许是我的编译器的问题
到C类继承B类的时候,自然将B类上定义的方法继承过来了(因为B的set方法是protected可视的)。竟然骗过了编译器。
但执行的时候到底发现有问题了,来自于B的这个set方法不是A的set方法,遂抛异常。LZ怎么发现的?
当时我想这个问题的时候.是从代码覆盖时权限角度出发考虑的.当时说private方法不能被继承和覆盖,我想是和权限有关.我想如果一个父类的方法子类如果没有权限访问,那么能否覆盖?如果覆盖了是不是破坏了封装性.经过尝试发现子类如果无法访问父类方法则不能覆盖,而且可以定义,并且不受影响,只是运行时不能覆盖父类方法,这样在继承链中就会有两个不同版本的方法描述.那么子类编译根据那个运行,我以为会因为矛盾编译不过,但是测试结果却是这样顺便说一下:我也不是为了吊大家的胃口,而是我这个代码是在公司的电脑上做的,公司不让拷贝代码.既公司内部网络与外界隔离.无法及时上传代码.而我发帖是利用公司的公共电脑发的,那个电脑上没有eclipse和jdk,公司估计也不让装,所以无法重现代码.后来的代码是我在家里做的
编译器存在bug也不稀奇
顺便说一下CSDN论坛有时登陆之后没反应但是已经登陆,重新刷新页面即可。软件真的经常迷惑人
B 中的 set() 无法覆盖 A 中的 set();正在尝试使用不兼容的返回类型
我用的编译通过的是1.6.0_23