一次学会Java抽象类,事半功倍编写代码

Java抽象类入门指南

欢迎进入Java的世界!今天我们要探讨的是Java中一个非常重要但初学者可能会觉得有点抽象的概念——抽象类(Abstract Classes)。通过本文,你将了解什么是抽象类,它们是如何工作的,以及如何在你的Java程序中有效地使用它们。

什么是抽象类?

在Java中,抽象类是一种不能被实例化的类。换句话说,你不能直接创建一个抽象类的对象。那么,抽象类有什么用呢?主要是用来作为其他类的基类(父类)。抽象类可以包含抽象方法(没有具体实现的方法),这些方法必须由抽象类的子类(如果不是抽象的话)实现

ps:如果抽象类的子类还是抽象类的话,那么继承抽象类的抽象类还需要被一个实体类来继承,才能创建对象,即抽象类可以被抽象类继承,方法必须由抽象类的子类(这个子类为一个非抽象类的类)来实现,总的来说,抽象类可以多级(不是一次继承多个继承,但是最后一定需要一个非抽象类来继承抽象类,并且需要实现抽象类的所有抽象方法

为什么需要抽象类?

抽象类的主要目的是提供一个通用的模板,让其他类可以继承并实现具体的功能。这是一种很好的方式来强制确保某些方法在任何派生类中都有自己的实现,特别是在多个类共有相同行为但各自实现细节不同的情况下。

如何定义一个抽象类?

在Java中,使用abstract关键字来定义一个抽象类。如果一个类包含一个或多个抽象方法,那么这个类必须被声明为抽象的。下面是一个简单的例子:


abstract class Animal {
    abstract void eat();
    void breathe() {
        System.out.println("Breathing...");
    }
}

在这个例子中,`Animal`是一个抽象类,它有一个抽象方法eat()和一个非抽象方法breathe()。eat()方法没有具体的实现,这意味着继承`Animal`的非抽象子类必须提供`eat()`方法的实现。

ps:抽象类也是类可以存在构造方法属性普通方法抽象方法(被abstract修饰的方法),抽象方法没有方法体

普通方法需要实现方法体

实现抽象类

当一个非抽象类继承自抽象类时,它必须实现抽象类中的所有抽象方法。下面是如何实现上面`Animal`类的一个例子:


class Dog extends Animal {
    void eat() {
        System.out.println("Dog is eating.");
    }
}

这里,`Dog`类实现了`Animal`类的抽象方法`eat()`。现在,你可以创建`Dog`类的实例,并调用`eat()`和`breathe()`方法。

抽象类的限制和特点

1. 不能实例化

你不能创建一个抽象类的实例,但你可以有一个指向子类对象的引用变量,其类型为抽象类。

2. 构造器:

虽然抽象类不能被实例化,但它们可以有构造器。这些构造器不是用来直接创建对象的,而是在子类对象创建时被调用(通常通过super()来调用),用于初始化子类对象的某些属性。

如下代码:

abstract class Animal {
    protected String type;

    public Animal(String type) {
        this.type = type;
        System.out.println("Animal of type " + type + " created");
    }

    abstract void eat();
}

class Dog extends Animal {
    public Dog() {
        super("Dog");  // 调用抽象父类的构造器
    }

    void eat() {
        System.out.println("Dog is eating.");
    }
}

在这个例子中,抽象类Animal有一个接收type参数的构造器。当创建Dog类的实例时,Dog的构造器通过调用super("Dog")来调用Animal的构造器,这样每个Dog对象都会在创建时自动设置其type属性,并打印一条消息。

抽象类构造器的作用
  1. 初始化继承结构中的共享属性:抽象类通常作为多个子类的父类,这些子类可能会有一些共同的属性。通过在抽象类的构造器中初始化这些属性,可以确保所有子类都会正确地初始化这些共享属性。

  2. 执行必要的初始化逻辑:在某些情况下,可能需要在创建对象时执行一些初始化逻辑,这些逻辑对所有子类都是通用的。通过抽象类的构造器,可以保证这种初始化逻辑在任何子类创建实例时都会执行。

抽象类构造器的特点
  • 不用于直接创建对象:抽象类的构造器不能用于直接实例化对象,但它们是子类对象创建过程中的一部分。
  • 可以被重载:抽象类中可以有多个构造器,这样子类就可以根据需要调用不同的父类构造器。
  • 调用顺序:在创建子类的对象时,抽象类的构造器总是在子类的任何构造器逻辑之前被调用。

3. 抽象方法

抽象类中可以有抽象方法,也可以没有,但包含抽象方法的类必须声明为抽象的。

4.抽象方法不能是被private修饰:

因为被修饰之后即该方法只能在父类中使用,导致无法继承,所以编译前编译器就会报错无法运行

5.抽象方法不能被finalstatic修饰,因为抽象方法要被子类重写。

有读者可能有这样的问题:

普通的类也可以被继承呀, 普通的方法也可以被重写呀, 为啥非得用抽象类和抽象方法
呢?
答:
确实如此 . 但是使用抽象类相当于多了一重编译器的校验.
在实际工作 不应该由父类完成, 而应由子类完成 . 那么此时如果不小心误用成父类
, 使用普通类编译器是不会报错的 . 但是父类是抽象类就会在实例化的时候提示错误 , 让我们尽早发现问题.
很多语法存在的意义都是为了 "预防出错", 例如我们曾经用过的 final 也是类似. 创建的变量用户不去修改, 不
就相当于常量嘛? 但是加上 final 能够在不小心误修改的时候, 让编译器及时提醒我们.
充分利用编译器的校验, 在实际开发中是非常有意义的

总结

抽象类是Java面向对象编程中一个强大的特性,它允许你定义将由多个子类共享的模板。通过抽象类,你可以定义一套方法,强制子类遵循一定的设计框架,这有助于减少代码冗余并提高可维护性。


感谢您耐心阅读这篇关于Java抽象类的文章!如果这些内容对您有所启发,或者您有更多的见解和疑问,欢迎在下方评论区留言分享您的想法。交流和讨论可以帮助我们共同进步!

如果您喜欢这篇文章,请不要吝啬您的点赞👍,您的每一个赞都是对我写作的最大鼓励。同时,您可以收藏🌟这篇博客,方便日后查阅或与朋友分享。

再次感谢您的阅读与支持!期待在评论区与您的精彩互动!💬

  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值