Java - Abstraction
本文参考这里
- 抽象类
- 抽象方法
抽象类(Abstract Class)
包含 abstract方法
的类就是抽象类,此时抽象类必须使用 abstract
修饰,来表示它是抽象类。
抽象类,使用
abstract
修饰。抽象类可以包含自己的变量、抽象方法、具体方法等(也就是说,类是抽象的,但对成员是否抽象则没有要求)。实际上,抽象类是类和接口的混合。抽象类不能创建实例。
继承抽象类与继承普通类相同,也使用
extends
关键字。但不同的是,子类必须实现抽象类里的abstract
方法,若不能实现则子类也须申明成abstract
类。
语法格式:
/* abstract关键字,申明抽象类 */
public abstract class AbstractClassName {
// 成员是否抽象,无要求
}
/* 扩展/继承抽象类(Extending Abstract Class) */
public class SubClass extends AbstractClassName {
// 这里必须要对父类中的抽象方法进行实现。否则,SubClass也须申明成abstract的
}
继承抽象方法的例子:
abstract class MyAbstractClass {
public abstract void sayhi();
}
/* 第一种:对所继承父类中的抽象方法必须实现,否则编译时报错 */
class MyClass1 extends MyAbstractClass {
// The type MyClass1 must implement the inherited abstract method MyAbstractClass.sayhi()
@Override
public void sayhi() {
// do something
}
}
/* 第二种:把子类也申明成抽象的,否则编译时报错 */
abstract class MyClass2 extends MyAbstractClass {
}
抽象方法(Abstract Methods)
当我们在类中想要包含一个特定的方法(method),而又暂时不能进行具体实现(implementation)时(例如类Shape里有计算图形面积的方法,但不同的图形其计算公式也不同,就只能将来在具体的类中才去实现),就可以把这个方法申明为 abstract
。
抽象方法没有定义,其函数签名后面直接跟分号,而不是花括号(Abstract method would have no definition, and its signature is followed by a semicolon, not curly braces),即没有函数体。
public abstract class Shape
{
public abstract double computeArea(); // 抽象方法无函数体。该抽象方法,导致所在的类也成为了抽象
// Remainder of class
}
申明抽象方法有两个结果:
1. 导致所在的类也必须为 abstract
:申明一个抽象方法,导致该抽象方法所在的类成为抽象类。
2. 在子类中,要么必须重写(override)(或说实现)这些抽象方法,要么子类也为abstract
(因为继承得来一个抽象方法,该抽象方法导致所在的类也为抽象,见前面第1条)。最终,在某个子孙类中实现对该抽象方法的重写。否则,类就无法进行实例化,只能为抽象。
public class Triangle extends Shape // 三角形
{
double width,height;
public double computeArea() // 对抽象方法进行实现
{
return width * height / 2.0;
}
// Remainder of class
}
public class Rectangle extends Shape // 矩形
{
double width,height;
public double computeArea() // 对抽象方法进行实现
{
return width * height;
}
// Remainder of class
}