本文仅把接口和抽象类的实现与继承情况下各个强制覆盖重写的情况举个例子。
比对1:
接口类 Interface1
接口类Interface2继承抽象类1,并增加抽象方法
结论:抽象类只能继承抽象类,且不会强制重写父类中的方法
比对2:
抽象类Abstract3实现接口类Interface2,并增加抽象方法和普通方法各一个
结论:抽象类实现接口类不会强制重写所有父类以及父类的父类的方法,但是特别的,如果抽象类没有覆盖重写父类的抽象方法,那么子类就需要强制重写,如果抽象类已经重写了父类的抽象方法,则子类无需强制重写父类抽象方法。
!接口类无法直接继承抽象类或者普通类
比对3:
普通类Class4继承抽象类3
结论:强制重写直接父类抽象类的方法,如果抽象类有 implements 其他接口,且未实现抽象方法,那么普通类 Class4 需要强制重写接口中的抽象方法。
对比4:
普通类6继承抽象类6
结论:继承抽象类,且将抽象类作为直接父类,直接父类的抽象方法被强制重写
对比5
普通类实现 抽象接口类-<泛型>
结论:实现 抽象接口类-<泛型>,接口不论是否是抽象的都会被重写
对比6
抽象类a extends 抽象类b
抽象类a 不会被要求覆盖重写抽象类b的抽象方法
超级总结:
抽象类可以 implements 接口,且可以选择是否实现接口的抽象方法。
抽象类的子类如果是抽象类,则不会强制覆盖重写抽象类的抽象方法,或者抽象类 implements 接口中的抽象方法。
抽象类的子类如果是普通类,则会强制覆盖重写抽象类的抽象方法,当抽象类 implements 接口中的抽象方法没有在抽象类中覆盖重写时,抽象类的子类会强制覆盖重写implements 接口中的抽象方法。
此外,类和类不可以被循环继承
现附上代码
1、Interface1
package com.demo.daotest;
public interface Interface1 {
void M1to1();
}
2、Interface2
package com.demo.daotest;
public interface Interface2 extends Interface1 {
void M2to1();
}
3、Abstract3
package com.demo.daotest;
public abstract class Abstract3 implements Interface2 {
public void M2to1() {
// TODO Auto-generated method stub
}
public void M1to1() {
// TODO Auto-generated method stub
}
abstract void M3to1();
void M3to2(){
}
}
4、Class4
package com.demo.daotest;
public class Class4 extends Abstract3 {
@Override
void M3to1() {
// TODO Auto-generated method stub
}
}
5、Abstract5
package com.demo.daotest;
public abstract class Abstract5 {
abstract void M5to1();
abstract void M5to2();
}
6、Class6
package com.demo.daotest;
public class Class6 extends Abstract5 {
@Override
void M5to1() {
// TODO Auto-generated method stub
}
@Override
void M5to2() {
// TODO Auto-generated method stub
}
}
7、AbstractInterface7
package com.demo.daotest;
import java.io.Serializable;
public abstract interface AbstractInterface7<T extends Serializable, PK extends Serializable>{
void M7to1();
abstract void M7to2();
}
8、Class8
package com.demo.daotest;
import java.io.Serializable;
public class Class8<T extends Serializable,PK extends Serializable> implements AbstractInterface7<T, PK> {
public void M7to1() {
// TODO Auto-generated method stub
}
public void M7to2() {
// TODO Auto-generated method stub
}
}
9、Abstract 修饰 interface
AbstractInterface
package com.demo.daotest;
public abstract interface AbstractInterface {
abstract void M10to1();
}