java抽象类中能有几个抽象方法?

答案是:一个抽象类可以有任意数量的抽象方法,包括零个、一个或多个。

这听起来可能有点反直觉,特别是“零个抽象方法”的情况。

1. 拥有一个或多个抽象方法

这是最常见、最容易理解的情况。就像我们之前Shape的例子,抽象类定义了一个或多个子类必须实现的“行为契约”。

  • 例子:假设我们设计一个更复杂的Animal抽象类。
public abstract class Animal {
    
    // 具体方法,代码复用
    public void breathe() {
        System.out.println("正在呼吸...");
    }

    // 第一个抽象方法:定义“吃”的行为规范
    public abstract void eat();

    // 第二个抽象方法:定义“移动”的行为规范
    public abstract void move();

    // 第三个抽象方法:定义“发出声音”的行为规范
    public abstract void makeSound();
}

在这个例子中,Animal抽象类有三个抽象方法。任何想要成为Animal子类的具体类(比如Dog, Fish, Bird),都必须同时实现eat(), move()makeSound() 这三个方法。

  • Dog 会用跑的(move)、吃狗粮(eat)、汪汪叫(makeSound)。
  • Fish 会用游的(move)、吃鱼食(eat)、吐泡泡(makeSound)。

这里的多个抽象方法共同构成了一个完整的“动物”行为模板。

2. 拥有零个抽象方法

这是个非常有趣且实用的设计技巧。一个类可以被声明为abstract,即使它内部没有任何abstract方法。

问:那为什么还要把它声明为抽象类呢?

答:主要目的是为了“禁止被实例化”。

当你将一个类声明为abstract时,Java语法规定你不能使用new关键字来创建这个类的对象。即使这个类提供了所有方法的具体实现。

这样做的设计意图是:这个类本身在逻辑上是一个不完整的概念,它仅仅是作为其他类的“基类”或“父类”而存在,不应该被单独创建出来使用。

  • 例子:假设我们正在开发一个Web框架,需要一个所有HTTP请求处理器的基类BaseController
// 这个抽象类里没有抽象方法
public abstract class BaseController {

    // 提供一个具体的方法,用于获取当前登录用户的信息
    protected User getCurrentUser() {
        // ...这里是复杂的、通用的逻辑,用于从Session或Token中获取用户信息
        System.out.println("从Session中获取当前用户...");
        return new User("Admin"); 
    }

    // 提供一个具体的方法,用于重定向到另一个页面
    protected void redirect(String url) {
        System.out.println("页面重定向到: " + url);
        // ...这里是具体的重定向实现
    }

    // 还有很多其他的辅助方法...
}

class User { String name; User(String name){ this.name = name; } }

在这个例子中,BaseController提供了很多非常有用的、具体的功能(如getCurrentUser, redirect)。但是,一个BaseController本身代表什么呢?它不代表任何具体的业务,比如“用户管理”或“订单管理”。它只是一个工具集和模板

因此,我们不希望有开发者写出 new BaseController() 这样的代码,因为这在业务上毫无意义。通过将其声明为abstract,我们就从语法层面强制了这一点。

开发者必须创建一个具体的子类来使用它:

public class UserController extends BaseController {

    public void displayUserPage() {
        // 直接使用从父类继承来的具体方法
        User user = getCurrentUser(); 
        System.out.println("正在为用户 " + user.name + " 显示页面。");
        
        if (user.name.equals("Guest")) {
            redirect("/login");
        }
    }
}

这样,BaseController就完美地扮演了它的角色:一个不能被实例化的、专门用于被继承的、提供通用功能的基类。

总结

抽象方法数量主要设计目的
一个或多个定义模板和行为规范:强制子类必须实现某些特定的、因类而异的功能(如 calculateArea)。这是抽象类的核心用途。
零个禁止实例化:这个类在逻辑上是抽象的,仅作为基类存在,提供通用的功能实现,但不应该被直接创建对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值