抽象类:
如果一个类中,有方法没有方法体,那么这个方法就是抽象方法
即,方法只有声明,没有方法体
如果一个类中,只要有抽象方法,那么这个类就是抽象类
说明这个类不具体
抽象类也是类,有类就可以放属性和方法(带方法体,不带方法体)
抽象类中可以放置属性,属性使用来存储数据的
抽象类中可以放置有方法体的方法,此方法能够完成某个功能
抽象类中可以放置没有方法体的方法,这个方法就是抽象方法
只要类中有一个抽象方法,这个类就是抽象类
抽象类是不能实例化对象,因为抽象类有抽象方法
程序员不能实例化,并不等于jvm不能实例化对象
抽象类只能当父类,
如果在子类中把所有的抽象方法都补上方法体,
那么这个子类就不是抽象类了,就可以实例化对象了
同时也可以调用方法了.
如果在子类中没有把所有的抽象方法给补上方法体
那么这个类还是抽象类,满足抽象类的用法.
抽象方法不能用static ,final,private修饰
抽象类的应用场景:
-
在父类中有一些方法没有方法体,或者没有必要给上方法体
此时把方法做成抽象方法,那么此类就变成抽象类
比如:Shap形状类中有一个方法叫做draw()绘制图形的方法
Triangle继承自Shap类,draw()方法就可以绘制三角形
Retangle继承自Shap类,draw()方法就可以绘制矩形Shap类中的draw方法就应该是抽象方法,因为Shap
不代表具体形状.所以没办法复制
把抽象类抽象到极致,所有的方法都没有方法体,
此情况不建议做成类,建议做成接口
接口:
接口中的所有的方法都是抽象方法,即没有方法体,接口方法
接口中可以放属性,但属性默认是public static final的
接口不适合存储数据,更适合做功能
而类适合存储数据
接口的特点:
- 接口中的方法和属性都是公有
- 接口是不能实例化对象的
- 必须由子类实现接口,且子类可以实现多个接口,解决java的单继承问题,多个接口用逗号间隔
- 子类实现接口的关键字implements, 直到子类把接口中的所有的方法都实现了,才可以实例化子类对象
否则子类就是抽象类 - 接口中可以有属性,但默认的是public static final,不适合存储数据
- 接口中可以有方法,方法必须都是没有方法体的,且是公有,public可以省略
- 定义接口的关键字interface
- 接口不能实现接口,但接口可以继承接口,而且还可以多继承, 即接口extends接口1,接口2…
- 接口中没有构造方法
结论: 接口更适合放置方法,而不适合存数据 类适合存数据,抽象类和普通类 接口就是对子类功能的规范,子类必须全部实现接口中的方法
接口的案例:
Person接口:{
study()
eat();
}
abstract CommonPerson类 实现了Person接口
public abstract CommonPerson{
String name;
int age
abstract study();
abstract eat();
sleep()
}
Student类 继承自CommonPerson
public class Student{
String stuNo;
//重写:是学生的学习方式和吃的方式
study(){}
eat(){}
//自己的方法
homework(){}
}
Teacher类 继承自CommonPerson
public class Student{
//重写:是老师的学习方式和吃的方式
study(){}
eat(){}
//自己的方法
tech(){}
}
为什么要使用接口?
- 用接口可以限定子类,必须实现接口规定的所有方法
以保证项目功能的完整性 - 用接口实现多态,有接口就一定有继承,而多态是以继承作为基础的