1、抽象类和接口都不能直接实例化:

// 抽象类无法实例化
abstract class AbstractClass {
    abstract void abstractMethod();
}
// AbstractClass obj = new AbstractClass(); // 编译错误

// 接口无法实例化
interface MyInterface {
    void interfaceMethod();
}
// MyInterface obj = new MyInterface(); // 编译错误

2、抽象类要被子类继承,接口要被类实现:

// 继承抽象类
abstract class AbstractClass {
    abstract void abstractMethod();
}

class ConcreteClass extends AbstractClass {
    @Override
    void abstractMethod() {
        // 实现抽象方法
    }
}

// 实现接口
interface MyInterface {
    void interfaceMethod();
}

class ImplementingClass implements MyInterface {
    @Override
    public void interfaceMethod() {
        // 实现接口方法
    }
}

3、接口只能做方法申明,抽象类中可以做方法申明和实现:

// 接口只能声明方法
interface MyInterface {
    void interfaceMethod(); // 只能声明
    //void implementedMethod() {} // 编译错误,不能有方法体
}

// 抽象类可以声明和实现方法
abstract class AbstractClass {
    abstract void abstractMethod(); // 声明抽象方法

    void implementedMethod() { // 实现普通方法
        // 方法体
    }
}

4、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量:

// 接口中的变量是公共静态常量
interface MyInterface {
    int CONSTANT = 10; // 隐式public static final
    //int variable; // 编译错误
}

// 抽象类中的变量是普通变量
abstract class AbstractClass {
    int variable = 10; // 普通变量
    static final int CONSTANT = 20; // 静态常量
}

5、子类必须实现父类的所有抽象方法,否则子类也必须是抽象类。实现接口时,如果无法实现所有方法,该类也必须是抽象类:

// 子类必须实现父类的所有抽象方法
abstract class AbstractClass {
    abstract void abstractMethod1();
    abstract void abstractMethod2();
}

class ConcreteClass extends AbstractClass {
    @Override
    void abstractMethod1() {
        // 实现方法
    }

    // 如果没有实现abstractMethod2(),那么ConcreteClass也必须是抽象类
}

// 实现接口时,如果无法实现所有方法,该类也必须是抽象类
interface MyInterface {
    void interfaceMethod1();
    void interfaceMethod2();
}

abstract class ImplementingClass implements MyInterface {
    @Override
    public void interfaceMethod1() {
        // 实现方法
    }
    
    // 没有实现interfaceMethod2(),所以ImplementingClass必须是抽象类
}

6、抽象方法只能申明,不能实现。接口是设计的结果,抽象类是重构的结果:

// 抽象方法只能申明,不能实现
abstract class AbstractClass {
    abstract void abstractMethod(); // 只能申明
    //abstract void abstractMethod() {} // 编译错误,不能有方法体
}

// 接口是设计的结果,定义行为规范
interface MyInterface {
    void interfaceMethod(); // 定义行为规范
}

// 抽象类是重构的结果,提取共同的代码和行为
abstract class AbstractClass {
    void commonMethod() {
        // 实现共同的方法
    }
    abstract void abstractMethod(); // 抽象出需要子类实现的方法
}

7、抽象类里可以没有抽象方法:

// 抽象类可以没有抽象方法
abstract class AbstractClass {
    void nonAbstractMethod() {
        // 普通方法实现
    }
}

8、如果一个类里有抽象方法,那么这个类只能是抽象类:

// 如果类中有抽象方法,那么这个类必须是抽象类
abstract class AbstractClass {
    abstract void abstractMethod(); // 抽象方法
}

//class ConcreteClass { // 编译错误,不能有抽象方法
//    abstract void abstractMethod();
//}

9、抽象方法要被实现,所以不能是静态的,也不能是私有的:

// 抽象方法不能是静态的或私有的
abstract class AbstractClass {
    //static abstract void staticAbstractMethod(); // 编译错误
    //private abstract void privateAbstractMethod(); // 编译错误

    abstract void abstractMethod(); // 正确
}

10、接口可继承接口,并可多继承接口,但类只能单根继承:

// 接口可继承接口,并可多继承接口
interface BaseInterface {
    void baseMethod();
}

interface ExtendedInterface extends BaseInterface {
    void extendedMethod();
}

interface MultipleInterface extends BaseInterface, AnotherInterface {
    void multipleMethod();
}

// 类只能单根继承
class BaseClass {
    void baseMethod() {
        // 方法实现
    }
}

class DerivedClass extends BaseClass {
    // 只能继承自一个类
}

//class MultipleInheritanceClass extends BaseClass, AnotherClass { // 编译错误
//    // 类不能多继承
//}

刚学java菜鸡,永劫无间蚀月,王者荣耀王者,金铲铲小铂金,第五人格菜鸡,原神开服玩家,星穹铁道菜鸡,崩坏的菜鸡,闪耀暖暖,和平精英,LOL,CSGO,以及三A大作收集者等等。。。