(8)抽象类的意义

一、抽象类的概念和作用
1.抽象的定义
    抽象是把多个事物的共性的内容抽取出来,本质就是把我们关注的内容抽取出来。(比如:宝马、奔驰都属于汽车,汽车是抽象出来的概念)
2.抽象类
    Java中可以定义没有方法体的方法,该方法由其子类来具体的实现。该没有方法体的方法我们称之为抽象方法,含有抽象方法的类我们称之为抽象类。
3.抽象方法的特点
    (1)只有方法头没有方法体的方法称之为抽象方法。(即只有方法的声明,没有方法的实现)
    (2)抽象方法用abstract关键字来修饰。
    (3)抽象方法代表一种不确定的操作或行为。(由子类去具体实现)
    (4)抽象方法不能被调用。
4.抽象类的特点
    (1)定义中含有抽象方法的类叫做抽象类。
    (2)抽象类用abstract关键字来修饰。
    (3)抽象类代表一种抽象的对象类型。
    (4)抽象类不能实例化。
    (5)抽象类中可以有具体方法,可以没有抽象方法。(也就是说一个类中只要有一个方法是抽象方法那么这个类一定是抽象类,反过来,一个抽象类中可以没有抽象方法,可以带有具体
    实现的方法)
    (6)一旦一个类中有抽象方法,那么这个类必须也要用abstract来修饰,代表这个类是抽象类,它是不能被实例化的。
如:
    ① A是一个抽象类
    public abstract class A{
        public void methodA(){
            System.out.println("test");
        }
    }
    ② public abstract void methodB();
    用abstract来修饰的方法称之为抽象方法,抽象方法的特点就是只有方法的声明,没有方法的实现。这里不能这样写:public abstract void methodB(){},因为写了大括号就代表有
方法的实现,只不过这是一个空实现,即没有大括号的才称为方法的声明。

public abstract class Employee {
private int number;
private String name;
private double salary;

public Employee(int number, String name, double salary) {
this.number = number;
this.name = name;
this.salary = salary;
}

// 抽象方法的声明(抽象类中不推荐放具体实现的方法)
public abstract void work();
}
// 一旦一个类继承了抽象类,那么这个类要么实现抽象类中的抽象方法,要么继续抽象下去。
public class JavaTeacher extends Employee {


public JavaTeacher(int number, String name, double salary) {
super(number, name, salary);
}

@Override
public void work() {
System.out.println("上java课");
}

}
public class Leader extends Employee {
private double allowance;

public Leader(int number, String name, double salary, double allowance) {
super(number, name, salary);
this.allowance = allowance;
}

@Override
public void work() {
System.out.println("培训新员工");
System.out.println("设计课程体系");
}

}
public class EmployeeDemo {
public static void main(String[] args) {
JavaTeacher javaTeacher = new JavaTeacher(1001, "张三", 10000);
// 父类的引用变量可以引用其子类对象(这里抽象类Employee也是一个父类,通过父类的引用变量引用值实现多态),所以也可以这么写:
// Employee javaTeacher = new JavaTeacher(1001, "张三", 10000);下同。
javaTeacher.work();

Leader leader = new Leader(101, "李四", 20000, 50000);
leader.work();

// 抽象类不能实例化
// Employee employee = new Employee(1,"小王",2000,50000);
}

}

备注:抽象类为什么不能实例化?

首先抽象类不能实例化是一个java的语法规范。

抽象类中是可以包含抽象方法,不是必须。如果一个抽象类没有一个抽象方法,那么他和一个普通java类就没有任何区别了,也就是说,在这种情况下没有abstract修饰都是一样的。定义了一个包含抽象方法的抽象类,其子类在继承自该抽象类的时候,子类就必须实现父类的所有抽象方法。之所以在java中存在这样一个语法规范,就是为了定义这种类型结构来解决生活中这样的一些实际问题。

你看过周星驰的电影没,就是那个去水果店,揪住老板说要一斤水果!老板问他你要什么水果,他说他就要水果!这个水果就是抽象类,你如果能在水果店买到一斤叫水果的水果,那就能实例化一个抽象类。要跟现实生活联系起来。

5.模板方法模式

(1)定义:一个模板方法用一些抽象的操作定义一个算法,而子类将重定义这些操作以提供具体行为。

(2)意图:定义了在一个操作中的一个算法框架,把一些步骤推迟到子类去实现。模板方法模式让子类不需要改变算法结构而重新定义特定的算法步骤。

public class TemplateDemo {
    public static void main(String[] args) {
        DBTeacher dbTeacher = new DBTeacher();
        dbTeacher.work();
        System.out.println("===========我是一道闪电=========");
        CTeacher cTeacher = new CTeacher();
        cTeacher.work();
    }
}

abstract class Teacher{
    // 老师工作的方法是一个流程,也可以认为是一个模板方法(即模板方法中的每一个步骤是固定的,老师授课按这个模板方法执行就可以了)
    public void prepared() {
        System.out.println("准备好白板笔");
        System.out.println("打开投影仪");
    }
    
    public void end() {
        System.out.println("关闭投影仪");
        System.out.println("锁教室门");
    }
    
    /**
     * 这是一个抽象方法由其子类去实现
     */
    public abstract void teaching();
    
    public void work() {
        // 授课前准备
        prepared();
        // 进行授课
        teaching();
        // 授课结束
        end();
    }
}

class DBTeacher extends Teacher{
    // 实现父类抽象的方法
    @Override
    public void teaching() {
        System.out.println("打开Oracle软件");
        System.out.println("书写sql指令");
        System.out.println("优化sql指令");
    }
}

class CTeacher extends Teacher {
    // 实现父类的抽象方法
    @Override
    public void teaching() {
        System.out.println("打开VM软件");
        System.out.println("书写C指令");
        System.out.println("调试C程序");
    }
}

转载:https://blog.youkuaiyun.com/weixin_42051619/article/details/80958208 

<think>好的,我现在需要回答用户关于Java中抽象类意义的问题。首先,我要回忆一下抽象类的基本概念,然后思考它在面向对象编程中的作用。用户可能想知道为什么需要抽象类,以及它和普通类、接口的区别在哪里。 首先,抽象类是不能被实例化的,必须通过子类继承才能使用。这点很重要,用户可能容易混淆抽象类和普通类。然后,抽象类可以包含抽象方法,这些方法没有具体的实现,需要子类去重写。这样能强制子类实现某些功能,确保设计的一致性。 接下来,我需要考虑抽象类的主要意义。比如模板方法模式,抽象类可以定义算法的框架,把具体步骤留给子类实现。这样可以提高代码复用,避免重复代码。另外,抽象类还能作为多个子类的共同父类,集中管理公共代码,增强代码的可维护性。 用户可能还会想知道抽象类和接口的区别。这时候我需要提到接口是完全抽象的,不能有实现,而抽象类可以有部分实现的方法。Java 8以后接口可以有默认方法,但抽象类仍然在单继承的情况下有优势,可以包含状态(字段)而接口不能。 还要考虑抽象类如何强制子类实现特定方法。比如,如果有一个图形抽象类,里面有计算面积的抽象方法,那么所有子类如圆形、矩形都必须实现这个方法,确保每个图形都有面积计算的功能,避免遗漏。 另外,可能需要提到抽象类在框架设计中的应用,比如在Spring框架中,模板类常常是抽象类,提供通用的处理逻辑,子类只需关注特定部分。 需要确保语言通俗易懂,结构清晰,分点说明。同时避免使用专业术语过多,或者用例子帮助理解。比如用动物抽象类,子类狗、猫实现抽象方法叫声,这样用户更容易明白抽象类的作用。 最后检查是否覆盖了所有关键点:定义、作用、与接口的区别、使用场景、例子说明。确保没有错误,比如语法正确,逻辑连贯。</think>Java中抽象类意义可分解为以下五个关键点: ### 1. 强制规范约束 通过定义抽象方法(没有方法体的方法),强制要求子类必须实现特定功能: ```java abstract class PaymentGateway { // 强制子类必须实现支付验证 public abstract boolean validatePayment(); // 强制子类必须实现支付执行 public abstract void executePayment(); } ``` 子类如`AlipayGateway`和`PayPalGateway`必须实现这些抽象方法,确保支付流程的完整性。 ### 2. 代码复用机制 抽象类支持包含具体实现方法: ```java abstract class ReportGenerator { // 通用方法(可直接复用) protected String formatHeader() { return "=== REPORT HEADER ==="; } // 抽象方法(需要子类实现) public abstract void generateData(); } ``` 子类通过继承可直接复用`formatHeader()`方法,避免重复编码。 ### 3. 模板方法模式实现 通过定义算法框架,控制子类实现步骤: ```java abstract class Beverage { // 模板方法(算法框架不可修改) public final void prepare() { boilWater(); brew(); pourInCup(); addCondiments(); } // 具体方法 private void boilWater() { System.out.println("Boiling water"); } // 抽象方法(子类差异化实现) protected abstract void brew(); protected abstract void addCondiments(); } ``` 子类如`Coffee`和`Tea`只需关注`brew()`和`addCondiments()`的实现。 ### 4. 类型标识作用 通过抽象类建立类型体系: ```java abstract class Shape { public abstract double calculateArea(); } class Circle extends Shape { private double radius; @Override public double calculateArea() { return Math.PI * radius * radius; } } ``` 所有继承`Shape`的对象都可被统一处理,如放入`List<Shape>`集合进行统一操作。 ### 5. 接口与实现的平衡 与纯接口(Java 8+)的对比: | 特性 | 抽象类 | 接口 | |--------------------|-----------------------|-------------------| | 方法实现 | 允许包含具体方法 | 默认方法(Java 8+) | | 成员变量 | 可包含实例变量 | 仅静态常量 | | 构造方法 | 有 | 无 | | 多继承 | 单继承 | 多实现 | | 状态维护 | 支持 | 不支持 | > 实际开发中:当需要维护对象状态或需要部分方法实现时优先使用抽象类,当需要多重继承或定义行为契约时使用接口。 ### 典型应用场景 - GUI框架:`JComponent`作为抽象类 - 集合框架:`AbstractList`提供列表基础实现 - Spring框架:`AbstractController`提供Web控制器基础功能 - Hibernate:`AbstractEntityPersister`实现ORM核心逻辑 抽象类的本质是面向对象设计中"is-a"关系的具体化,通过部分实现与部分抽象的有机结合,在灵活性和规范性之间取得平衡。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值