Java零基础入门-抽象类

举报
喵手 发表于 2025/01/31 23:39:36 2025/01/31
【摘要】 ​ 一、概述        我们熟知在面向对象编制中,所有的对象都是通过类来描述的,但是,并不是所有的类都是此作用(描述对象),存在一种类中不包含足够信息来描述一个具体对象,像这种它就被称之为抽象类。今天我们不为别的,就是想带着大家来学习一下抽象类,希望大家都能有个好的理解方式。二、本期教学目标掌握抽象类概念抽象类使用原则抽象类使用限制抽象类特点抽象类实例演示总结三、正文1️⃣概念     ...

 一、概述

        我们熟知在面向对象编制中,所有的对象都是通过类来描述的,但是,并不是所有的类都是此作用(描述对象),存在一种类中不包含足够信息来描述一个具体对象,像这种它就被称之为抽象类。今天我们不为别的,就是想带着大家来学习一下抽象类,希望大家都能有个好的理解方式。

二、本期教学目标

  • 掌握抽象类概念
  • 抽象类使用原则
  • 抽象类使用限制
  • 抽象类特点
  • 抽象类实例演示
  • 总结

三、正文

1️⃣概念

        虽然前言可以大致介绍了抽象类的基础概念,但是描述的不是很全面,这里着重再给大家普及一下,抽象类:是一种在普通类的结构里增加抽象方法的组成部分。而且在java中若一个没有方法体的方法则得被定义为抽象方法,若一个类中存在抽象方法,那此类必定为抽象类。

具体定义比如如下:

public abstract class AbstractDemo { }

2️⃣使用原则

        针对抽象类,它不能被实例化,为什么呢?因为抽象类里的抽象方法是没有抽象方法体的,如果能被实例化,那意味着这个类有方法有属性,而恰恰抽象类是不带有的。

        其次抽象类必须要用abstract关键字修饰,且抽象方法必须为public或者protected,如果定义为私有的,那么该类被子类继承,私有方法则不允许重写。默认是public。

        对于抽象类,必须要有子类,用extends继承,一个类只能继承一个抽象类。对于子类不是抽象类的话,必须重写抽象类中的所有方法。

如下我给大家实例演示一下,你们就能理解了。

父类:AbstractDemo.java

public abstract class AbstractDemo {


    public void eat(){
        System.out.println("我会吃!");
    }

    public abstract void run();

    public abstract void dump();
}

        若子类是个普通类继承AbstractDemo,则必选实现所有父类抽象方法。

子类1:AbstractDemo1.java

public class AbstractDemo1 extends AbstractDemo {


    //重写父类的抽象方法
    @Override
    public void run() {
        System.out.println("我会跑!");
    }

    @Override
    public void dump() {
        System.out.println("我会跳!");
    }
}

        如果子类依旧是个抽象类,那么如果一个方法只重写一个方法,另外方法则必须要用abstract修饰,因为子类2有抽象方法,则子类2也不能被实例化。

子类2:AbstractDemo2.java 

public abstract class AbstractDemo2 extends AbstractDemo {

    //重写父类的抽象方法
    @Override
    public void run() {
        System.out.println("我会跑!");
    }

    public abstract void dump();

}

3️⃣使用限制

        考大家一个问题,抽象类它有构造方法吗?这个是有的,因为抽象类中有属性,抽象类与普通类的区别只是有抽象类有抽象方法,而普通类没有,所以这些属性一开始就得被初始化。

给大家举个实例演示一下:

public abstract class AbstractDemo {


    public AbstractDemo(){
        System.out.println("这是抽象类的构造方法");
    }

    public abstract void run();

    public abstract void dump();
}

        接下来定义一个子类继承父类抽象类,大家请看。

public class AbstractDemo1 extends AbstractDemo {

    public AbstractDemo1(){
        System.out.println("这是子类的构造方法");
    }


    //重写父类的抽象方法
    @Override
    public void run() {
        System.out.println("我会跑!");
    }

    @Override
    public void dump() {
        System.out.println("我会跳!");
    }
}

        如上,是完全可以定义构造方法的,那接下来我们定一个main主函数,实例化AbstractDemo1,我们来看看,它会执行那些步骤?

大家请看:如下截图

        发现父类及子类构造方法都执行了,这就说明抽象类中的构造方法就是用来初始化的。 

注意: 抽象类不能被final关键字修饰,

4️⃣特点

        对于抽象类,我们来总结下它有何特点吧。

  • 抽象类和抽象方法必须被[ abstract ]关键字修饰。
  • 抽象类中不一定只有抽象方法,带有抽象方法的类一定是抽象类。
  • 对于抽象类不能实例化这个特点,抽象类应该按照多态通过子类对象进行实例化,这就叫做抽象类多态。
  • 对于抽象类的子类:第一:要么子类是抽象类。第二:要么重写掉抽象类中所有的抽象方法;(任何子类必须重写父类的抽象方法,或者声明自身为抽象类)

6️⃣总结

        基本的概念及实例演示,我都在上边给大家做了讲解及演示,接着我就为此进行一个完整的复盘吧,也希望你们在看完这篇过后,能有个基本的理解,更多的还是得要日常实践中,去摸索。

  1. 对于抽象类,不能被实例化,如果强行实例化,一定报错,编译是无法通过的。只要非抽象类的子类可以实例化创建对象。
  2. 抽象类中不一定包含抽象方法,但带有抽象方法的类它一定是一个抽象类。
  3. 对于抽象类中的抽象方法只是为了声明,不包含方法体,意思就是不给出具体的方法实现功能。
  4. 构造方法,类方法不能被声明为抽象方法。
  5. 抽象方法的子类必须给出抽象类的抽象方法的具体实现(也就是重写父类抽象方法),除非该子类也是抽象类。



【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。