-
抽象类:
-
什么是抽象类?
- 抽象类无法实例化,无法创建对象。类和类之间有共同特征,将这些具有共同特征的类再进一步抽象形成了抽象类。由于类本身是不存在的,所以抽象类无法创建对象。
- 抽象类和抽象类实际上可能还会有共同特征,还可以进一步再抽象
- 类到对象是实例化,对象到类是抽象。
-
抽象类属于什么类型?
- 抽象类也属于引用数据类型。
-
抽象类怎么定义?
[修饰符列表] abstract class 类名{}
-
final
和abstract
不能联合使用,这两个关键字是对立的。final class
无法被继承abstract
要被继承使用
-
抽象类的子类可以是抽象类,也可以是非抽象类
abstract class CreditCard extends BankCard{} abstract class BankCard{}
-
抽象类虽然无法实例化,但是抽象类有构造方法,这个构造方法是提供子类使用的。
使用
super
给父类构造传参public class CreditCard extends BankCard{ public CreditCard(){ super("UpYou"); } }
abstract class BankCard{ public BankCard(String name){ this.name = name; } public String name; }
-
抽象类关联到一个概念:抽象方法。
- 抽象方法: 没有实现的方法,没有方法体的方法
public abstract void doSome();
- 抽象方法特点
- 没有方法体,以分号结尾
- 前面修饰符列表中有
abstract
关键字
-
抽象类中不一定有抽象方法
-
抽象方法只能在抽象类中使用
-
如果子类不是抽象类,那么子类必须重写父类的所有抽象方法。
class CreditCard extends BankCard{ @Override public String getName(){ return "Bank"; } } abstract class BankCard{ public abstract String getName(); }
- 抽象方法: 没有实现的方法,没有方法体的方法
-
非抽象类继承抽象类必须将抽象方法实现
以下程序有没有问题?有什么问题?
abstract class Animal{
public abstract void move();
}
class Bird extends Animal{}
- 抽象类中不一定有抽象方法,抽象方法必须出现在抽象类中
- 分析
Animal
是父类,并且是抽象类Animal
这个抽象类中有一个抽象方法move
Bird
是子类,并且是非抽象的Bird
继承Animal
之后,会将抽象方法继承过来。「抽象方法的概述第7条第4项」
以上程序需要将从父类中继承过来的抽象方法进行覆盖/重写,或者也可以叫做实现
实现
当一个非抽象类继承抽象类的时候,需要将抽象方法重写/实现
abstract class Animal{
public abstract void move();
}
class Bird extends Animal{
@Override
public void move(){
System.out.println("我在移动!");
}
}
以上程序支持多态机制使用,例如
Animal bird = new Bird();// 向上转型
bird.move();
输出:我在移动!
一个非抽象类继承抽象类,必须将抽象类中的抽象方法实现了
面向抽象编程,不要面向具体编程,降低程序的耦合度,提高程序的扩展力。这种编程思想符合OCP原则。
本文由 UpYou 创作,采用 知识共享署名4.0
国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: May 21,2020