abstract抽象类
abstract抽象类
用法:
加上abstract关键字
在父类中声明
public abstract class Action {
//约束,有人帮我们实现
//abstract抽象方法,只有方法名字,没有方法的实现
public abstract void doSomething();//相当于只在这里用abstract关键字声明一下,在子类中实现
}
在子类中重写
public class A extends Action{
@Override
public void doSomething() {
}
}
注意:
- 不能new这个抽象类的对象,只能靠子类去实现它,即抽象类无法实例化 ”约束“!
- 抽象类可以写普通方法
- 但是抽象方法只能在抽象类中
- 抽象的抽象
抽象类的构造器
Java中的抽象类确实可以存在构造器,不过抽象类的构造器作用与普通类的构造器略有不同。
通常来说,抽象类不能被实例化,因此抽象类的构造器只能用来被子类调用,也就是为子类提供构造函数进行初始化操作,同时也可以在抽象类中实现一些公共的初始化逻辑。在子类中调用抽象类的构造器时,需要使用super关键字来调用父类的构造器。
需要注意的是,当抽象类存在抽象方法时,子类在继承时必须实现抽象方法,否则子类也得变成抽象类。因此,在抽象类的构造器中不能调用抽象方法,否则会导致异常。实际上,抽象类的构造器只能调用非抽象方法或已经实现的抽象方法。
以下是一个示例代码,说明抽象类中存在构造器的使用方法:
//抽象父类
abstract class Shape {
int x, y;
public Shape(int x, int y) {
this.x = x;
this.y = y;
// 实现一些公共的初始化逻辑
}
// 其他非抽象方法可以在这里定义
// 抽象方法必须在子类中实现
public abstract void draw();
}
//子类
class Circle extends Shape {
int radius;
public Circle(int x, int y, int radius) {
super(x, y); // 调用父类的构造器
this.radius = radius;
}
// 实现抽象方法
public void draw() {
System.out.println("Drawing circle with radius = " + radius + " at (" + x + ", " + y + ")");
}
}
//主类
public class Test {
public static void main(String[] args) {
Circle c = new Circle(10, 20, 30);
c.draw(); // 输出:Drawing circle with radius = 30 at (10, 20)
}
}
在上面的代码中,抽象类Shape存在构造器,子类Circle在继承时调用了父类的构造器,并实现了抽象方法draw()。最终输出结果是Drawing circle with radius = 30 at (10, 20),说明抽象类中的构造器可以被子类调用,并且实现了父类的初始化操作。
抽象类存在的意义
Java中抽象类存在的意义可以从以下几点来解释:
-
限制类的实例化:抽象类不能被实例化,只能被继承,这样可以限制对该类的直接调用,强制程序员使用其具体的子类。
-
提供代码复用:抽象类可以包含抽象方法和普通方法,其中抽象方法定义了一个方法的接口,具体的实现由子类去完成。使用抽象类可以避免重复的代码实现,提高了代码复用的效率。因为父类不用在写重复的代码,交给子类去完成
-
规范代码结构:抽象类提供了一个代码结构的规范,使得所有子类都遵循了相同的编码规则和风格,有利于程序员进行代码维护和开发。
-
支持多态性:通过继承抽象类和实现其抽象方法,同一个方法可以拥有不同的实现方式,这就是多态的体现。简单地说,通过抽象类,程序员可以定义一组具有相同接口的类,从而实现程序的可扩展性和维护性。
总之,抽象类存在的意义在于可以限制类的实例化,提供代码复用,规范代码结构,支持多态性等。Java中的抽象类是一个十分重要的概念,尤其是在面向对象编程中,常常用于封装一组相关的操作方法,并为子类提供统一的接口,以达到代码重用和可扩展性的目的。
浙公网安备 33010602011771号