接口
接口用来描述类应该做什么,而不是指定它们具体应该如何做 主要用于定义规范
一个类可以实现多个接口
接口中所有方法自动是public abstract 不必显示声明
接口不会有实例字段,字段默认添加 public static final 修饰 即常量
接口不能有初始化块、构造器
子类实现接口方法需要显示声明方法的访问属性为public,类的默认访问属性是包可见的,子类如不是抽象类,需要实现接口中全部抽象方法
接口可以继承接口 多继承,不能继承类,级别比类高
jdk8以前,接口不会有实现方法
jdk8以后可以有default修饰的普通实现方法,通过对象调用,重写不需要添加@overwrite,可以有静态的实现方法,通过接口名调用
父接口的子类实例不能向无关的子接口强转 视为两个不同分支
eg:接口A的实现类是D,接口E继承A,D的实例仍然不能转换为E的实例,报运行时错误
抽象类
主要用于代码重用
定义:
修饰符 abstract 类名{ //类体 修饰符 abstract 返回值类型 方法名(参数列表) }关键字为abstract 抽象类的抽象方法没有方法体:public abstract void test(); 不用被实现,必须由子类重写实现且是重写全部抽象方法(强制性要求,普通类不能继承抽象方法,必须重写),如果子类是抽象类则不用强制,因为抽象类中允许出现抽象方法 抽象类中的普通方法可以有方法体:
public void test(){xxx};
抽象类必须被继承使用,不能被直接实例化
抽象类可以有成员变量、构造方法、成员方法,可以用构造方法来初始化属性
允许包含抽象成员
有构造方法却不能被实例化?
在抽象类中可以有构造方法,只是不能直接new 抽象类的实例对象,但实例化子类的时候,就会初始化父类,不管父类是不是抽象类都会调用父类的构造方法,初始化一个类会先初始化父类。java中构造器是用来初始化的,不是用来实例化对象的。抽象类中的构造器是用来给成员变量赋值的,供子类使用。
异同
不同点:
目的不同:接口定义一组类的执行规范,抽象类为了代码重用
定义关键字不同:接口interface,抽象类abstract
实现或继承的关键字不同:接口用implements来实现,抽象类用extends来继承
访问控制符不同:接口中只能public,抽象类中都可以
允许的组成结构不同:接口中不能有构造方法、静态代码块、实例变量,抽象类可以有 相同点: 都属于引用数据类型,不属于基本数据类型 都不能直接实例化 其中的抽象部分都需要被实现来使用标签:构造方法,子类,接口,实例,抽象类,方法 From: https://www.cnblogs.com/deity-night/p/17341748.html