一、抽象类
1、概念:使用abstract来进行修饰的类,就是抽象类
2、语法:访问修饰符 abstract 返回值类型 方法名名称(参数列表)
3、注意:
A.抽象方法必须在抽象类中,抽象方法没有方法体
B.其中可以有成员变量、构造方法、成员方法、静态方法、抽象方法子类必须实现(接口、抽象类)中所有抽象方法,除非子类也是抽象类)
二、接口
1、概念:统一定义了一些规范
2、语法:访问修饰符 interface 接口名称{}
3、注意点:
A.接口编译后也是一个字节码class文.
B.接口中的变量就是静态的常量,默认使用public static final来进行修饰,所以是不可变来的
C.在jdk1.8之前,接口中只能有抽象方法,默认使用public abstract来进行修饰,在jdk1.8之后,可以有默认方法以及静态方法,在jdk1.9之后,可以有私有方法private
D.接口中不能有构造方法,所以必须通过子类来实例化对象
4、注意点:如多个接口中有相同名称的抽象方法,实现类只实现接口中一个方法(但方法的放回值要相同,不然会报错)
总结:
A.一个子类必须实现父类所有的抽象方法,无论是抽象类中的抽象方法还是接口中的
B.在同类(抽象与抽象、抽象与接口、接口与接口)继承中不用都实现其父类的抽象方法
C.如果一个子类想要选择性继承接口或抽象中的抽象方法,通过一个中间的抽象类来继承父类(接口)(全部继承,不然子类也要继承“祖父类”的方法),把它变为普通方法即可
如下:
A .接口——>抽象类——>子类
interface A{
void eat();
void jump();
}
abstract class B implements A{
@Override
public void eat() {
}
@Override
public void jump() {
}
}
class D extends B{
@Override
public void eat() {
super.eat();
}
}
B.抽象——>抽象——>子类
abstract class A{
abstract void eat();
abstract void jump();
}
abstract class B extends A{
@Override
public void eat() {
}
@Override
public void jump() {
}
}
class D extends B{
@Override
public void eat() {
super.eat();
}
}