JAVA的修饰词(3)----abstract 抽象类

本文详细介绍了抽象类的概念、特点及应用案例,并对比了一般类的区别,同时探讨了抽象类在实际开发中的重要性和如何利用抽象类提高代码的复用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


1.引入概念:


狼和狗,两个类,抽取他们所属的共性:犬科。
犬科都有吼叫行为,具体是汪汪汪还是嗷嗷嗷,是不确定的,需要子类明确。
这些犬科不具体的功能,需要在类中标识出来,通过java中的关键字abstract(抽象)
定义了抽象函数的类也要被abstract修饰,即抽象类。
用法和继承类似。
举例:

abstract class 犬科(){
    abstract void 叫();
    //用abstract修饰抽象函数
}

class Dog extends 犬科{
    void 叫(){
        System.out.println("汪汪汪");
    }   
}

class Wolf extends 犬科{
    void 叫(){
        System.out.println("嗷嗷嗷");
    }
}

2.抽象类的特点


1)抽象类和抽象方法都需要被abstract修饰。抽象方法一定定义在抽象类中。
2)抽象类不可以创建实例,因为调用抽象方法是没有意义的。
3)只有覆盖了抽象类的所有抽象方法后子类才可以实例化,否则这个子类还是一个抽象类。


3.抽象类的常见问题


1)抽象类一定是父类吗?
答:
是的,因为抽象类是不断抽取而来的

2)抽象类有构造函数吗?
答:
有的,虽然能不能给自己的对象初始化,但是可以给自己的子类初始化。

3)抽象类和一般类有什么不同?
答:
抽象类和一般类都是用来描述事物的,并且都可以定义属性和功能,但是:
一般类可以描述具体的描述事物,可以创建对象;
抽象类描述事物的信息不具体,不能创建对象,能够定义抽象函数。

4)抽象类里一定要定义抽象方法吗?
答:
不一定,抽象类的另一个作用就是可以利用抽象类的特性使该类不能创建对象

5)abstract不能哪些关键字一起用?
答:
1 final :最终不能更改,抽象肯定得定义抽象方法
2 private :明显….你都私有了不让别人用还抽象干嘛
3 static : 静态直接能被类名调用,对抽象类来说是没有意义的


4.抽象类简单应用


需求:

公司中程序员有姓名,工号,薪水,工作内容
项目经理有姓名,工号,薪水,工作内容,奖金 进行建模。

解决步骤:
1)寻找涉及的对象

程序员:
    属性:姓名,工号,薪水
    行为:工作内容 
项目经理:
    属性:姓名,工号,薪水,奖金
    行为:工作内容

两个对象具有共性,没有子父类关系。将他们的共性抽取,共同类型:worker

员工:
    属性:姓名,工号,薪水
    行为:工作内容 

员工的工作内容是不具体的,所以是抽象的,应该由子类实现
可以写出员工类:

abstract class Worker{
    private String name;
    private String id;
    private double pay;

    // 构造函数,员工的3个属性
    public worker(String name,String id,double pay){
        this.name = name;
        this.id = id;
        this.pay = pay;
    }

    // 抽象行为:工作
    public abstract void work();
}

写出子类:程序员

class Programmer extends Worker{
    // 构造函数
    public programmer(String name,String id,double pay){
        // 引用父类
        super(name,id,pay);
    }

    // 工作行为:代码
    public void work(){
        System.out.println("I'm coding");
    }
}

写出子类:经理

class Manager extends Worker{
    // 特有属性:奖金
    private double bonus;
    // 构造函数,经理属性
    public Manager(String name,String id,double pay,double bonus){
        super(name,id,pay);
        this.bonus = bonus;
    }
    // 工作行为:管理
    public void work(){
        System.out.println("I'm manageing");
    }
}

5.补充


对于上面3.4问题,举例说明

有一个接口

interface Inter{
    public void show1();
    public void show2();
    public void show3();
}   

现在需要分别单独使用show1和show2

//使用1方法
class InterDemo1 implements Inter{
    public void show1(){
        xxxx;
    }
    // 如果不覆盖其他方法,这就是一个抽象类
    // 所以需要写,即使用不到
    public void show2(){}
    public void show3(){}
}

//同上,使用2
class InterDemo2 implements Inter{
    public void show2(){
        xxxx;
    }
    public void show1(){}
    public void show3(){}
}

这样做的话很费劲,复用性差
所以可以设置一个类,把四个方法覆盖,再让子类继承

class InterImpl implements Inter{
    public void show1();
    public void show2();
    public void show3();
}
// 继承InterImpl中的方法,直接使用show1就行了,简化了很多
class InterDemo1 extends InterImpl{
    public void show1(){
        xxxx;
    }
}
// 同上,使用show2
class InterDemo1 extends InterImpl{
    public void show2(){
        xxxx;
    }
}

可是这样做又出现问题了,这个InterImpl类 创建对象是没有意义的,所以令其抽象化。

// 抽象化
abstract class InterImpl implements Inter{
    public void show1();
    public void show2();
    public void show3();
}

这就是没有抽象方法的抽象类。


思想很重要。之所以使用继承,是为了在对共性类型操作时更为简单。


### Java 中类、继承抽象类的概念及用法 #### 什么是类? 在 Java 中,类是一个模板,用于定义具有相同属性和行为的对象。通过创建类的实例(对象),可以访问这些属性和方法。 #### 继承的基本概念 继承是一种机制,允许一个类(称为子类或派生类)基于另一个类(称为父类或基类)进行扩展。子类会自动拥有父类的所有字段和方法,并可以选择性地覆盖某些方法以提供特定功能。Java 中使用 `extends` 关键字来表示继承关系[^1]。 #### 抽象类的核心特性 抽象类是由 `abstract` 关键字修饰的一类特殊类。它可能包含普通方法以及未实现的方法——即 **抽象方法**。抽象类的主要作用是作为其他具体类的基础结构,强制其子类遵循某种约定并实现必要的逻辑[^3]。 当某个类继承抽象类时,如果未能完全覆写所有的抽象方法,则此新类同样需标记为抽象;只有当所有抽象方法都被实际编写出来之后,才能正常生成可实例化的实体类[^4]。 以下是展示如何正确处理上述情况的一个简单例子: ```java // 定义一个抽象类 Animal abstract class Animal { String name; public abstract void makeSound(); // 这里声明了一个抽象方法 public void sleep() { // 而这里则提供了默认实现 System.out.println(name + " sleeps."); } } class Dog extends Animal { @Override public void makeSound() { System.out.println("Bark"); } public Dog(String n){ this.name=n; } } public class TestAbstractClass{ public static void main (String[] args){ Dog d=new Dog("Rex"); d.makeSound(); d.sleep(); } } ``` 在这个案例中,我们首先构建了名为 `Animal` 的抽象超类型,其中包含了两个成员函数:一个是纯虚形式的发声操作 (`makeSound`) ,另一个是非虚拟版本的休眠动作(`sleep`). 接着,在具体的犬科动物代表—狗(Dog)—那里实现了前者的同时保留后者的行为不变. #### 总结 综上所述,理解并掌握好 Java 编程里的基础组件如常规类别设计原则及其相互间的关系尤为重要。尤其是对于那些希望利用面向对象技术开发复杂应用系统的开发者而言更是如此。合理运用继承与抽象化手段可以帮助简化代码维护工作量同时也增强了程序模块间的耦合度控制能力[^2].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值