【Java】抽象类与抽象方法

一、 抽象类的定义

抽象类是用 abstract 关键字修饰的类。它不能被实例化,通常作为其他类的基类(父类)。

[访问修饰符] abstract class 类名 {
    // 类体
}

示例

public abstract class Animal {
    // 抽象类可以包含普通方法、抽象方法、属性等
    public void sleep() {
        System.out.println("Animal is sleeping");
    }

    // 抽象方法
    public abstract void makeSound();
}

1.1 抽象类的特点

  • 抽象类不能实例化
    抽象类不能直接创建对象,只能通过子类来实例化。

    Animal animal = new Animal(); // 错误:抽象类不能实例化
    Animal dog = new Dog();       // 正确:通过子类实例化
    
  • 抽象类可以有任意成员
    抽象类可以包含:普通方法(非抽象方法)、构造器、静态属性和抽象方法

    public abstract class Animal {
        // 普通方法
        public void sleep() {
            System.out.println("Animal is sleeping");
        }
    
        // 构造器
        public Animal() {
            System.out.println("Animal constructor");
        }
    
        // 静态属性
        public static String type = "Mammal";
    
        // 抽象方法
        public abstract void makeSound();
    }
    

二、 抽象方法的定义

抽象方法是用 abstract 关键字修饰的方法。它没有方法体(即没有实现),必须由子类重写

[访问修饰符] abstract 返回类型 方法名(参数列表);
public abstract void makeSound(); // 抽象方法,没有方法体

2.1 抽象方法的特点

  • 抽象方法不能有主体
    抽象方法只有声明,没有实现(即没有方法体)。

    public abstract void makeSound(); // 正确
    public abstract void makeSound() { } // 错误:抽象方法不能有主体
    
  • 抽象方法不能用 finalprivatestatic 修饰

    • final:抽象方法需要被子类重写,而 final 方法不能被重写。
    • private:抽象方法需要被子类访问和实现,而 private 方法不能被子类访问。
    • static:抽象方法依赖于实例,而 static 方法不依赖于实例。
    public abstract class Animal {
        // 以下写法都是错误的
        public final abstract void makeSound(); // 错误:final 不能修饰抽象方法
        private abstract void makeSound();      // 错误:private 不能修饰抽象方法
        public static abstract void makeSound();// 错误:static 不能修饰抽象方法
    }
    

三、 抽象方法与抽象类的关系

  • 类中有抽象方法,该类一定是抽象类
    如果一个类包含抽象方法,那么这个类必须声明为抽象类。因为如果一个类包含抽象方法,那么这个类无法提供完整的实现,因此不能直接实例化,而class Animal的意思是可以实例化。

    public abstract class Animal {
        public abstract void makeSound(); // 抽象方法
    }
    
  • 抽象类中可以没有抽象方法
    抽象类可以不包含抽象方法,但仍然不能实例化。

    public abstract class Animal {
        public void sleep() {
            System.out.println("Animal is sleeping");
        }
    }
    

四、继承抽象类

当一个类继承抽象类时,它必须实现抽象类中的所有抽象方法,或者将自己也声明为抽象类。

  • 实现所有抽象方法
    子类必须实现父类中的所有抽象方法。

    public abstract class Animal {
        public abstract void makeSound();
    }
    
    public class Dog extends Animal {
        @Override
        public void makeSound() {
            System.out.println("Woof!");
        }
    }
    
  • 声明为抽象类
    如果子类没有实现父类的所有抽象方法,那么子类也必须声明为抽象类。

    public abstract class Animal {
        public abstract void makeSound();
    }
    
    public abstract class Bird extends Animal {
        // 没有实现 makeSound(),所以 Bird 必须是抽象类
    }
    

五、 抽象类 vs 接口

特性抽象类接口
关键字abstract classinterface
实例化不能实例化不能实例化
方法实现可以包含普通方法和抽象方法Java 8 之前只能包含抽象方法
多继承不支持(单继承)支持(多实现)
构造器可以有构造器不能有构造器
成员变量可以是普通变量只能是常量(public static final
设计目的代码复用和层次化设计定义规范和扩展功能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XiYang077

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值