【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. 为什么使用抽象方法?

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

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

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


总结

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

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

相关推荐
weixin_4997715516 分钟前
C++中的组合模式
开发语言·c++·算法
初级代码游戏17 分钟前
套路化编程 C# winform 自适应缩放布局
开发语言·c#·winform·自动布局·自动缩放
_waylau21 分钟前
鸿蒙架构师修炼之道-架构师的职责是什么?
开发语言·华为·harmonyos·鸿蒙
zfoo-framework25 分钟前
帧同步和状态同步
java
charlotte1024102427 分钟前
高并发:关于在等待学校教务系统选课时的碎碎念
java·运维·网络
2的n次方_32 分钟前
CANN Ascend C 编程语言深度解析:异构并行架构、显式存储层级与指令级精细化控制机制
c语言·开发语言·架构
亓才孓32 分钟前
[JDBC]PreparedStatement替代Statement
java·数据库
_F_y1 小时前
C++重点知识总结
java·jvm·c++
打工的小王1 小时前
Spring Boot(三)Spring Boot整合SpringMVC
java·spring boot·后端
毕设源码-赖学姐1 小时前
【开题答辩全过程】以 高校体育场馆管理系统为例,包含答辩的问题和答案
java·spring boot