抽象类和抽象方法
抽象类:使用abstract修饰的类,就是"抽象类"
语法:访问权限修饰符 abstract class 类名{
//属性
//方法
//1) 普通方法
//2) 静态方法
//3) 抽象方法
}
抽象方法:使用abstract关键字修饰,没有方法体的方法,称之为"抽象方法"
语法:可见性修饰符 abstract 返回值类型 方法名(形参列表);
抽象方法的特点:
-
抽象类中可以有抽象方法,也可以没有抽象方法。
-
抽象类中可以有普通方法和普通属性。
-
若一个类中包含了抽象方法,那么,该类一定是抽象类,反之则不然.(若一个类是抽象类,那么,该类中不一定有抽象方法)
-
若一个普通子类继承了抽象的父类,那么,该普通子类必须重写抽象父亲中所有的抽象方法。
-
若一个抽象的子类继承了抽象的父类,那么,该抽象的子类可以重写抽象父类中的抽象方法,也可以不重写抽象父类中的抽象方法。(因为子类就是一个抽象的,可以重写可以不重写)
-
若一个普通子类继承了一个抽象的父类,该抽象的父类又继承了一个抽象的父类,那么,该普通子类必须得重写其直系抽象父类中所有的抽象方法,而且,还必须得重写抽象父类尚未重写的抽象方法
-
抽象类不能实例化,是专门用来被子类继承的,是为继承而设计的
/**
* 学生类
*/
public abstract class Student {
private String name;//名称
public Student(){
super();
}
public Student(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**
* 学习
*/
public abstract void study();
}
/**
* 中学生
*/
public class MiddleStudent extends Student{
//普通子类继承抽象父类必须要重写父类的抽象方法
@Override
public void study() {
System.out.println("中学生学习.......");
}
}
public abstract class LittleStudent extends Student{
//抽象子类不一定要重写抽象父类的抽象方法
abstract void hello();
}
/**
* 男小学生类
*/
public class BoyLittleStudent extends LittleStudent{
@Override
public void study() {
}
@Override
void hello() {
}
}
抽象类出现的原因:
java语言的设计者,设计抽象类的用意何在?
设计一个类的时候,若该类中一个或者是多个方法,书写方法体没有意义,一定会被子类重写。那么,就将该方法设计为抽象方法,与此同时,将该类设计为抽象类。
案例:设计一个交通工具类,拥有行驶的行为,然后,设计测试类(驾驶人).驾驶人是一个狂热的驾驶爱好者。在其生命中:依次驾驶了:自行车,汽车,公交车,地铁,飞机,轮船等等
运行对于交通工具类 是没有意义的,但是它一定要被继承后去使用
/**
* 交通工具类
*/
public abstract class Vechile {
/**
* 行驶
*/
public abstract void run();
}
/**
* 公交车类
*/
public class Bus extends Vechile{
public void run(){
System.out.println("110路公交车沿着固定的线路行驶着。。。。");
}
}
/**
* 小汽车类
*/
public class Car extends Vechile {
public void run(){
System.out.println("小汽车沿着高速公路...飞驰");
}
}
/**
* 飞机类
*/
public class Plane extends Vechile{
public void run(){
System.out.println("飞机翱翔祖国的蓝天之上");
}
}
/**
* 测试类(驾驶人)
*/
public class Test {
public static void main(String[] args) {
// 案例:设计一个交通工具类,拥有行驶的行为,然后,
// 设计测试类(驾驶人).驾驶人是一个狂热的驾驶爱好者。在其生命中:
// 依次驾驶了:自行车,汽车,公交车,地铁,飞机,轮船等等
//思路:
//1.构建驾驶人的实例
Test driver = new Test();
//2.构建小汽车的实例
Car car = new Car();
//3.驾驶小汽车
driver.driveCar(car);
System.out.println("\n-------------------\n");
//构建公交车的实例
Bus bus = new Bus();
//驾驶公交车
driver.driveBus(bus);
System.out.println("\n-------------------\n");
//构建飞机的案例
Plane plane = new Plane();
//驾驶飞机
driver.drivePlane(plane);
}
/**
* 开小汽车
* @param car
*/
public void driveCar(Car car){
car.run();
}
/**
* 开公交车
* @param bus
*/
public void driveBus(Bus bus){
bus.run();
}
/**
* 开飞机
* @param plane
*/
public void drivePlane(Plane plane){
plane.run();
}
}