抽象方法不能使用的修饰符
private
private 修饰的方法不能被子类继承, 而抽象方法要求必须由子类实现, 因此互相矛盾.
final
final 修饰的方法不能被子类重写, 而抽象方法必须由子类实现, 互相矛盾.
static
如果一个方法既是 abstract 又是 static,则意味着这个方法应该在类层级上存在(因为是 static),同时还必须由具体子类实现(因为是 abstract)。这在逻辑上是矛盾的:静态方法不需要依赖实例,抽象方法却需要通过实例来实现,这就导致冲突。
private
注意点
private
修饰的函数无法被子类重写, 如果子类中有同名函数, 则这两个函数不是各自独立的, 不是重写关系.
(1)
public class Test {
public static void main(String[] args) {
BB b=new BB();
b.callT1();
}
}
class AA {
private void t1(){
System.out.println("AA:t1");
}
public void callT1(){
t1();
}
}
class BB extends AA{
public void t1(){
System.out.println("BB:t1");
}
}
输出:
AA:t1
(2)
public class Test {
public static void main(String[] args) {
BB b=new BB();
b.callT1();
}
}
class AA {
public void t1(){
System.out.println("AA:t1");
}
public void callT1(){
t1();
}
}
class BB extends AA{
public void t1(){
System.out.println("BB:t1");
}
}
输出:
BB:t1
两份代码只是AA
类中t1()
的修饰符private改为public, 根据动态绑定机制可知, 在(1)中如果BB
中有重写AA
类的t1()
的话, 那么就应该调用BB
的t1()
, 但是, (1)中调用的是AA
的t1()
, 说明BB
中的t1()
并不是对AA
的t1()
的重写.