前言:
本篇博客将带大家了解Java中关于抽象类的相关知识。
目录
何为抽象类
在面向对象的概念中,所有的对象都是通过类来描绘的。但是并不是所有的类都是用来描绘对象的。如果一个类中没有包含足够的信息来描绘一个具体的对象,那就把这种类称为抽象类。
如:
abstract class Shape{//抽象类
public void draw(){
System.out.println("画图形!");
}
}
Shape类只是将draw方法描绘了个大概,并未做出更进一步的描述。
abstract class Shape{
abstract public void draw();//抽象方法,没有方法体
}
class Rect extends Shape{
@Override
public void draw() {//对draw方法做出了更加具体的描述
System.out.println("◻");
}
}
class Cycle extends Shape{
@Override
public void draw() {//对draw方法做出了更加具体的描述
System.out.println("⚪");
}
}
class Flower extends Shape{
@Override
public void draw() {//对draw方法做出了更加具体的描述
System.out.println("❀");
}
}
通过上面的第一段代码,我们可以发现,Shape类里面的draw方法并未有实际的操作,因此我们可以将其设计成抽象方法(如第二段代码,方法被abstract修饰),含有抽象方法的类我们将其叫做抽象类。
抽象类的特点
- 一个类被abstract修饰,这个类被称为抽象类;一个方法被abstract修饰,这个方法被称为抽象方法。抽象方法不用给出具体的实现(如上面的Shape类里面的draw方法)。
- 抽象类也是类,内部可以包含普通方法和属性,甚至可以包含构造方法。
- 抽象类不能直接实例化对象。
- 要想使用抽象类,只能创建该抽象类的子类,然后让子类重写抽象类中的方法。这种语法可以帮助我们预防出错。当我们不小心对抽象类实例化的时候,编译器会进行报错。
- 抽象方法不能被private修饰
- 抽象方法不能被final和static修饰,因为抽象方法要被子类重写
- 抽象类必须被继承,并且继承抽象类的类必须要重写父类里面的抽象方法,否则子类也是抽象方法,必须要被abstract修饰。而且即使子类变成了抽象类,那么当其他的类来继承该子类的时候,如果这个其他类不想变成抽象类的话,这个其他类不光要重写子类里面的抽象方法,还要重写父类的抽象方法。
abstract class Shape{ abstract public void draw(); } abstract class Rect extends Shape{ abstract public void write(); } class B extends Rect{ public void write(){ //…… } public void draw(){ //…… } }