java 接口和抽象类的区别

接口和抽象类的区别:
A:成员区别
        抽象类:
                   成员变量:可以变量/也可以常量
                   构造方法:有
                   成员方法:可以抽象也可以非抽象(有方法体)
        接  口:
                   成员变量:只能是常量,并且是静态的/默认修饰符:public final static/建议手动给出
                   成员方法:只可以抽象(不能有实现方法,只有方法声明(即没有方法体))
B:关系区别
        类与抽象类:继承,单继承
        类与  接口 :实现,单实现,多实现
        接口与接口:继承,单继承,多继承

C:设计理念区别
           抽象类:is a  (对根源的抽象,比如:人是动物(抽象类))
           接口   :like a(对动作/行为的抽象,所以,可以实现多个接口,但只能继承一个父类)
              
另外:接口定义的方法需要全部被实现,抽象类不是

详解:
1,java中一个没有抽象体的方法,定义为抽象方法(抽象方法不能有方法体)
     public abstract void method1(){} //错误
2,抽象类中不一定有抽象方法 ,但是类中如果有抽象方法,该类必须定义为抽象类
3,抽象类不能实例化,应为他不是具体的
4,但是,抽象类其实是可以被实例化的,只是通过其子类被实例化
5, 抽象类里的
     抽象方法:强制要求子类做的事情
     非抽象方法:子类继承的事情,提高代码复用性

举例
abstract class Animal{
    public abstract void eat();
}
class Cat extends Animal{
    public void eat(){
        System.out.println("猫吃鱼");
    }
}
class AbstractDemo{
    public static void main(String[] args){
        // 通过多态的方式实例化抽象类
        Animal a = new cat();
        a.eat();
    }
}
6,一个类如果没有抽象方法,可不可以定义为抽象类?意义?
     可以,不让创建对象,通过子类来访问
7,abstract和哪些关键字不能共存?
     private、final :冲突
     static:无意义
abstract aa {
     static abstract void method();     //aa.method();因为没有方法体,所以没有意义(静态方法可以通过类名调用)
     public static void method1(){...}  //OK
}
原文地址:https://www.cnblogs.com/ysloong/p/6389312.html