Java的Abstraction抽象类/方法-笔记

来源:互联网 发布:电脑管家数据恢复收费? 编辑:程序博客网 时间:2024/06/16 19:38

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}

0 0