1. 主页 > 大智慧

Java抽象类中的方法定义与使用实例详解

哎!刚学Java的小伙伴是不是总被"抽象类"这个词整懵了?明明写了方法却非要加个abstract是几个意思?今天咱们就来唠唠这个让新手抓狂的??抽象类中的方法??,保准你听完直拍大腿:"原来这么回事啊!"


一、抽象类到底是个啥玩意儿?

(点根烟)咱先打个比方哈。你见过手机模具不?就是那种带摄像头孔、按键槽的半成品板子。抽象类就跟这模具一样——??它规定了子类必须实现的功能??,但自己又不完全造出具体手机。

举个栗子,咱要写个"动物叫"的功能:

java复制
abstract class Animal {
    // 抽象方法:只有声明没实现
    abstract void shout();
    
    // 普通方法:可以直接用
    void sleep() {
        System.out.println("Zzz...");
    }
}

看到没?这个Animal类里既有带abstract的抽象方法shout(),也有能直接用的普通方法sleep()。说白了,抽象类就是个??半成品模板??,等着子类来填坑呢!


二、抽象方法必须实现吗?不写会咋样?

(敲黑板)这个问题绝对能进Java新手十大迷惑行为!咱们直接上代码验证:

java复制
class Cat extends Animal {
    // 不实现shout()方法试试?
}

这时候编译器立马翻脸报错:"Cat不是抽象的,必须实现shout()"。这说明??子类必须实现所有抽象方法??,否则就得把自己也声明成abstract类——就像老板让你交报告,你说"我还没写完,先交个目录"似的。

但有个例外情况你可能不知道:??抽象类继承抽象类时,可以不实现父类抽象方法??。比如:

java复制
abstract class BigCat extends Animal {
    // 这里可以不实现shout()
}

这种情况就像项目经理接手另一个离职同事的半成品项目,可以暂时不填坑。


三、抽象类VS接口:选哪个更合适?

这题简直是Java界的"甜咸豆腐脑之争"。咱们直接上对比表:

??对比项??抽象类接口
方法类型可有抽象+普通方法全是抽象方法(Java8前)
变量类型任意类型变量默认public static final
继承方式单继承多实现
适用场景同类事物的共性提炼跨类别的能力扩展

举个现实案例:要是做电商系统,用户的"登录验证"功能适合用抽象类(所有用户都有登录行为),而"支付方式"这种需要支持支付宝、微信、银联的,用接口更合适。


四、抽象类里能写构造方法吗?

(扶眼镜)这个问题90%的新手都会答错!直接看代码:

java复制
abstract class Vehicle {
    String type;
    
    // 抽象类的构造方法
    public Vehicle(String type) {
        this.type = type;
    }
}

class Car extends Vehicle {
    public Car() {
        super("汽车"); // 必须调用父类构造
    }
}

惊不惊喜???抽象类完全可以有构造方法??!虽然不能直接new抽象类,但子类创建时一定会调用父类的构造方法。这个特性在初始化公共属性时特别有用,比如给所有交通工具设置默认载客量。


五、那些年我们踩过的坑

刚入坑那会儿,我也被这几个问题坑惨过:

  1. ??忘记实现抽象方法??(编译器报错还算友好)
  2. ??试图用new创建抽象类??(就像试图直接住进毛坯房)
  3. ??混淆抽象类和接口的用法??(把冰箱当洗衣机用)
  4. ??在抽象方法里写实现??(abstract和{}不能共存)

最坑的是这个:

java复制
abstract class Bird {
    abstract void fly() {
        System.out.println("我在飞"); // 编译报错!
    }
}

抽象方法后面跟大括号写实现?这是要逼疯编译器的节奏啊!


个人血泪经验

在Java江湖混了这些年,关于抽象类有几句掏心窝子的话:

  1. ??不要为了抽象而抽象??——就像没必要给煎饼摊搞个米其林标准
  2. ??优先考虑接口??,除非确实需要保存公共状态(这是《Effective Java》说的可不是我瞎编)
  3. ??抽象类适合做中间层??,比如框架中的BaseController、BaseService
  4. ??多用组合少用继承??——这条适用于所有面向对象设计,你品,你细品

最近在带新人时发现,很多小伙伴把抽象类想得太复杂。其实把它看作??带填空题的模板??就简单多了。下次再看到abstract别慌,先问自己三个问题:

  • 这个类需要被直接实例化吗?
  • 子类有没有必须实现的共同行为?
  • 需不需要保存公共属性?

想明白这些,抽象类的使用场景自然就清晰了。编程这事吧,有时候跟学骑自行车似的——看着难,真摔两次就会了!

本文由嘻道妙招独家原创,未经允许,严禁转载