抽象类的概念
定义
定义:随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更加一般,更通用。类得设计应该保证父类和子类能够共享特征。有时候将父类设计的非常抽象,以至于没有设计具体的实例。
所修饰的类型
关键字 :abstract(抽象)
抽象类
抽象类:用关键字abstract来修饰一个类时,这个类就叫做抽象类。
abstract :抽象的,可以用来修饰类和方法。
抽象类不能被实例化。抽象类是用来被继承的,抽象类的子类必须重写父类的抽象方法,并提供方法体。若没有重写全部的抽象方法,仍未抽象类。
代码展示:
——父类`
abstract class Person{
String name;
public abstract void eat();
public abstract void walk();
}`
——子类
class Student extends Person {
@Override
public void eat() {
System.out.println("student is eating.");
}
@Override
public void walk() {
System.out.println("student is walking.");
}
抽象类有构造方法,类需要有被实例化的过程
public Person() {
System.out.println("无参构造");// 无参构造
}
public Person(String name) {
this.name = name;// 有参构造
}
抽象方法
抽象方法:用关键字abstract修饰的一个方法时,该方法叫做抽象方法
抽象类中可以没有抽象方法。
abstract class A{
public void B() {
System.out.println("这里是非抽象方法!");
}
}
注意:1)抽象方法:只是方法的声明,没有方法的实现。以分号结束。如:public abstract void eat();
或者abstract void eat();
2)含抽象方法的类必须被声明为抽象类。
3)abstract 不能用来修饰属性、构造器、private、 final、static。这几种注释的代码都报错
class A {
// private abstract int id;
//因为构造器不能被重写
// public abstract A() {
//
// }
//子类不能覆盖(重写)声明为private的方法的。
// private abstract void method();
// public abstract final void method();
// public abstract static void method();
}
抽象类的应用
概念
抽象类是用来模型化那些分类无法确定全部实现,而是有其子类提供具体实现的对象的类。
例题讲解
例题:
在航空公司系统中,有Vehicle类需要定义两个方法分别计算运输工具的燃料效率和行驶距离。卡车(Truck)和驳船(RiverBarge)的燃料效率和行驶距离的计算方法完全不同。Vehicle类不能提供计算方法,但子类可以。
解决方案的代码参考
package Demo10;
public abstract class Vehicle {
public abstract double calcFueIEffciency();// 计算燃料效率的抽象方法
public abstract double calcTripDistance();// 计算行驶距离的抽象方法
}
class Truck extends Vehicle {
@Override
public double calcFueIEffciency() {
// 写出计算卡车的燃料效率的具体方法
return 0;
}
@Override
public double calcTripDistance() {
// 写出计算卡车行驶距离的具体方法
return 0;
}
}
class RiverBarge extends Vehicle {
@Override
public double calcFueIEffciency() {
// 写出计算驳船的燃料效率的具体方法
return 0;
}
@Override
public double calcTripDistance() {
// 写出计算驳船行驶距离的具体方法
return 0;
}
}
注意:抽象类不能实例化,new Vehicle()是非法的
模板方法设计模式
抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,大子类总体上会保留抽象类的行为方式.
解决的问题:
1)当功能内部一部分实现是确定,一部分实现是不确定的。这是可以把不确定的部分暴露出来,让子类去实现。
代码理解
abstract class Template {
// 不确定的实现
abstract void code();
// 确定的实现
public void spendTime() {
long start = System.currentTimeMillis();
code();
long end = System.currentTimeMillis();
System.out.println("花费的时间为:" + (end + start));
}
}
2)编写一个抽象父类,父类提供了多个子类的通用方法,并把一个或多个方法留给其子类实现,就是一种模板模式。
代码理解
class Student extends Person {
@Override
public void eat() {
System.out.println("student is eating.");
}
@Override
public void walk() {
System.out.println("student is walking.");
}
@Override
void bearth() {
System.out.println("student isn't pollution air.");
}
}
抽象类的总结
1.抽象方法
- abstract :抽象的,可以用来修饰类,方法
- 1.abstract修饰类,抽象类
- 1)不可被实例化
- 2)有构造器并且可以被定义(凡是类都有构造器)
- 3)抽象方法所在的类,此类一定是抽象类。
- 4)抽象类中可以没有抽象方法。
2.抽象方法
2.abstract修饰方法,抽象方法
- 1)格式,没有具体的方法体,包括{} 如:public abstract void eat();
- 2)抽象方法只能保留方法的工作,具体的行为功能,交给了有继承关系的子类,有子类重写此抽象方法。
- 3)若子类继承抽象类,并重写了所有的抽象方法,则此类时候一个“实例化”,即可以实例化
- 4)若子类继承抽象类,没有重写所有的抽象方法,意味着此类中仍有抽象方法,则此类必须声明为抽象类!