【java】java中函数加与不加abstract 的区别

在 Java 中,函数是否加 abstract 会影响其行为和所在类的设计方式。具体来说,abstract 关键字的使用决定了方法的实现方式和类的继承关系。下面是详细的解释:

1. 不加 abstract 的方法

  • 普通方法: 如果一个方法没有 abstract 关键字,它就是一个普通方法 。普通方法要么是已经实现的方法(即方法体已给出实现),要么是没有 abstract 的普通方法。

  • 可以在类中提供实现: 当你定义一个普通方法时,你为该方法提供了具体的实现。其他类可以继承这个方法并直接使用,或者重写它(如果是实例方法)。

    java 复制代码
    class Animal {
        void sound() {
            System.out.println("Animal sound");
        }
    }
    
    class Dog extends Animal {
        @Override
        void sound() {
            System.out.println("Bark");
        }
    }

    在这个例子中,sound() 是一个普通的已实现方法,Dog 类可以继承并重写该方法。

  • 可以被调用: 不加 abstract 的方法是可以直接被调用的,无需在子类中实现。

2. abstract 的方法

  • 抽象方法: 如果一个方法加了 abstract,那么它就是一个抽象方法。抽象方法没有方法体,也就是说,它只是方法的声明,表示这个方法的具体实现应该由子类来提供。

  • 必须在抽象类中定义: 抽象方法必须位于抽象类中。抽象类本身不能直接被实例化,它需要被子类继承,子类必须实现抽象类中的所有抽象方法,除非子类也是抽象类。

  • 没有方法体: 抽象方法没有具体的实现,它只定义了方法的签名(方法名、参数列表等),其具体行为(方法体)留给子类去实现。

    java 复制代码
    abstract class Animal {
        abstract void sound();  // 抽象方法,没有方法体
    }
    
    class Dog extends Animal {
        @Override
        void sound() {
            System.out.println("Bark");
        }
    }

    在这个例子中,sound() 是一个抽象方法,Dog 类必须实现它。

  • 强制要求子类实现: 如果一个子类继承了一个抽象类,那么子类必须实现所有继承自抽象类的抽象方法,除非子类本身也是抽象类。

3. abstract 与不加 abstract 的区别

特性 不加 abstract abstract
方法体 有方法体,即有具体实现 没有方法体,只声明方法签名(没有实现)
所在类 可以在普通类中,普通类可以被实例化 必须在抽象类中,抽象类不能直接实例化
子类的责任 子类可以继承或重写,非强制 子类必须实现该方法,除非子类本身是抽象类
是否可以直接调用 可以直接调用方法 不能直接调用,必须由子类实现后调用

4. 实例代码对比

普通方法示例:
java 复制代码
class Animal {
    void sound() {  // 普通方法
        System.out.println("Animal sound");
    }
}

class Dog extends Animal {
    @Override
    void sound() {  // 重写方法
        System.out.println("Bark");
    }
}

public class Test {
    public static void main(String[] args) {
        Animal animal = new Dog();
        animal.sound();  // 输出 "Bark"
    }
}

在这个例子中,sound() 是一个普通方法,它已经有了具体的实现。子类 Dog 可以选择重写它。

抽象方法示例:
java 复制代码
abstract class Animal {
    abstract void sound();  // 抽象方法,没有实现
}

class Dog extends Animal {
    @Override
    void sound() {  // 必须重写抽象方法
        System.out.println("Bark");
    }
}

public class Test {
    public static void main(String[] args) {
        Animal animal = new Dog();
        animal.sound();  // 输出 "Bark"
    }
}

在这个例子中,sound() 是一个抽象方法,Dog 类必须实现它。如果 Dog 不实现 sound(),编译时会出错。

5. 为什么使用抽象方法?

  • 定义模板方法: 抽象方法用于定义子类必须实现的行为,但是不指定具体的实现。它提供了一个"模板",子类根据自己的需求来完成方法的具体实现。

  • 强制子类实现: 使用抽象方法可以强制子类去实现某些方法,确保所有子类都具备这些方法的实现。

  • 实现多态: 通过抽象类和抽象方法,可以实现多态的设计,让不同的子类有不同的实现,符合面向对象的设计原则。


总结

  • 普通方法: 提供了具体的实现,可以直接调用。
  • 抽象方法: 没有实现,只是声明,强制子类提供具体实现。它们只能在抽象类中定义,子类必须重写它们。

希望这个解释清楚了两者的区别!如果还有疑问,欢迎继续提问!

相关推荐
Scott9999HH9 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
腻害兔10 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社11 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海11 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖11 小时前
JDK 26 新特性详解
java·开发语言
马优晨12 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区14 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大14 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai15 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
维天说15 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json