接口和抽象类的区别:
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
}