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中抽象类存在的意义可以从以下几点来解释:

  1. 限制类的实例化:抽象类不能被实例化,只能被继承,这样可以限制对该类的直接调用,强制程序员使用其具体的子类。

  2. 提供代码复用:抽象类可以包含抽象方法和普通方法,其中抽象方法定义了一个方法的接口具体的实现由子类去完成。使用抽象类可以避免重复的代码实现,提高了代码复用的效率。因为父类不用在写重复的代码,交给子类去完成

  3. 规范代码结构:抽象类提供了一个代码结构的规范,使得所有子类都遵循了相同的编码规则和风格,有利于程序员进行代码维护和开发。

  4. 支持多态性:通过继承抽象类和实现其抽象方法,同一个方法可以拥有不同的实现方式,这就是多态的体现。简单地说,通过抽象类,程序员可以定义一组具有相同接口的类,从而实现程序的可扩展性和维护性。

总之,抽象类存在的意义在于可以限制类的实例化,提供代码复用,规范代码结构,支持多态性等。Java中的抽象类是一个十分重要的概念,尤其是在面向对象编程中,常常用于封装一组相关的操作方法,并为子类提供统一的接口,以达到代码重用和可扩展性的目的。

posted @ 2023-07-01 08:58  晚枫zz  阅读(8)  评论(0)    收藏  举报