Java中的抽象类介绍

news2025/1/10 21:16:35

Java中的抽象类介绍

抽象类可以包含普通类的成员,它可以包含普通的属性、方法和内部类等成员。这些成员既可以被抽象类的子类继承和使用,也可以被抽象类自身使用。抽象类中的非抽象方法必须要有具体实现,否则无法通过编译。抽象类中也可以拥有构造方法,但是抽象类不能被直接实例化,因此对于抽象类而言,构造方法主要用于其子类的初始化。而抽象类除了含有普通类的成员,必须含有抽象方法。

那么什么叫抽象方法呢?在所有的普通方法上面都会有一个"{}",这个表示方法体,有方法体的方法一定可以被对象直接使用。而抽象方法,是指,没有方法体的方法,且抽象方法必须被abstract关键字所修饰。

Java中的抽象类不能被直接实例化的原因是,它是一种不完整的类,只定义了一部分方法的声明而没有提供具体的实现,因此无法创建对象。

抽象类的主要作用是为其子类提供一个公共的接口和方法,以便子类可以继承并实现其中的抽象方法。由于抽象类中包含抽象方法,而抽象方法没有具体的实现,因此在抽象类中创建对象时,系统无法确定如何正确地执行抽象方法的调用。因此,Java中的抽象类只能用作其他类的基类,被继承和实现抽象方法。

Java中的抽象类是一种特殊的类,不能被实例化,只能被继承。

抽象方法是一种没有具体实现的方法,必须在子类中被实现。抽象方法的定义使用abstract关键字,例如:

public abstract void draw();

上面的代码定义了一个抽象方法draw(),它没有具体的实现。任何继承了该抽象类的子类都必须实现这个方法。

除了抽象方法,抽象类还可以包含非抽象方法,这些方法有具体的实现。子类可以继承这些方法,也可以重写这些方法。

抽象类的作用主要有两点:

强制规范子类的行为,避免出现不符合预期的情况。

提供抽象级别的通用功能,降低编程复杂度。

需要注意的是,如果一个类继承了抽象类,则必须实现所有抽象方法,否则该类必须也声明为抽象类。同时,抽象类也可以实现接口,这样就可以将接口中的一些方法的实现放在抽象类中,方便子类直接继承。

在Java中,抽象类是一种特殊的类,它不能直接实例化,只能被其他类继承。抽象类通常用于作为一个基类,封装一些共性的代码和行为,并且定义了一些抽象方法,这些抽象方法没有具体的实现,需要子类去实现。

抽象类的定义使用abstract关键字,抽象方法也使用abstract关键字进行修饰。如果一个类包含抽象方法,则该类必须声明为抽象类。

以下是一个抽象类的例子:

源码由两个文件构成

Animal.java内容如下:

public abstract class Animal {
    protected String name;

    public Animal(String name) {
        this.name = name;
    }

    public abstract void eat();

    public void sleep() {
        System.out.println(name + " is sleeping...");
    }

    public String getName() {
        return name;
    }
}

 Cat.java内容如下:

public class Cat extends Animal {
    public Cat(String name) {
        super(name);
    }

    public void eat() {
        System.out.println(getName() + " is eating fish...");
    }

    public static void main(String[] args) {
        Cat cat = new Cat("Tom");
        cat.eat();  // Tom is eating fish...
        cat.sleep(); // Tom is sleeping...
    }
}

上述例子中,Animal类是一个抽象类,其中定义了一个抽象方法eat()和一个非抽象方法sleep(),Cat类继承了Animal类并实现了eat()方法,同时还可以调用父类的sleep()方法。

抽象类与普通类的区别在于,抽象类不能被实例化,只能被继承,而其子类必须实现所有的抽象方法。使用抽象类可以提高代码的可复用性和拓展性。

抽象方法是一种没有实现的方法,必须在子类中实现。

构造方法和类方法都有具体的实现。构造方法用于创建对象,并初始化其状态,它们不能被声明为抽象方法,因为对象必须有一个确切的构造方法来进行实例化。类方法是与类相关联的方法,而不是与对象相关联的方法。它们也不能被声明为抽象方法,因为它们必须有一个具体的实现,以便在类加载时调用它们。

抽象类可以包含属性,方法,构造方法。

抽象类的构造方法不能用来new实例,只能被子类调用。抽象类不能被实例化,因为它是一种不完整的类,没有完整的实现。

抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类,不包含抽象方法的抽象类,目的就是不想让调用者实例化该对象,通常用于某些特殊的类的结构设计。

抽象类的子类,必须重写抽象父类的所有抽象方法,否则会出现编译报错,除非该子类也是抽象类(假设不重写父类中所有的抽象方法,那么调用抽象方法毫无意义)。

抽象类中的构造方法,用于初始化自身的成员变量或调用父类的构造方法。子类在创建对象时,会自动调用父类的构造方法来完成对父类的初始化。

举个完整的实验代码:

假设我们有一个抽象类Animal,其子类Dog和Cat都需要初始化一些共同的属性,比如体重weight和年龄age。那么我们就可以在Animal类中定义一个构造方法,在其中初始化这些属性。

抽象类文件Animal.Java内容如下:

public abstract class Animal {
    private int weight;
    private int age;

    public Animal(int weight, int age) {
        this.weight = weight;
        this.age = age;
    }

    public int getWeight() {
        return weight;
    }

    public int getAge() {
        return age;
    }
}

 

这样,Dog和Cat就可以通过调用super关键字来调用父类的构造方法完成对基本属性的初始化:

Dog.java文件内容如下:

// Dog类
public class Dog extends Animal {
    public Dog(int weight, int age) {
        super(weight, age);
        // 子类自己的初始化逻辑
    }
}

Cat.java文件内容如下:

// Cat类
public class Cat extends Animal {
    public Cat(int weight, int age) {
        super(weight, age);
        // 子类自己的初始化逻辑
    }
}

说明,Animal类作为抽象类被设计出来,它里面包含了一些基础的属性和方法,在子类中被继承和实现。而构造方法则是用来初始化这些属性,在子类中可直接使用。

Test.java文件内容如下:

//调用测试
public class Test {
    public static void main(String[] args) {
        Dog dog = new Dog(5, 2);
        System.out.println("Dog's weight is " + dog.getWeight());
        System.out.println("Dog's age is " + dog.getAge());

        Cat cat = new Cat(3, 1);
        System.out.println("Cat's weight is " + cat.getWeight());
        System.out.println("Cat's age is " + cat.getAge());
    }
}

说明,子类通过调用父类的构造方法完成了对基本属性的初始化,对本例而言,父类Animal的构造方法是 public Animal(int weight, int age),在子类中通过 super(weight, age) 调用父类的构造方法来完成对基本属性的初始化。

编译运行输出结果为:

Dog's weight is 5
Dog's age is 2
Cat's weight is 3
Cat's age is 1

Java中的抽象类是一种不能被实例化的类,它只能作为其他类的父类来使用。抽象类通常用于定义一个类的基本框架,而具体的实现则由其子类来完成。以下是Java中抽象类的一些主要特点:

1.抽象类不能被实例化:虽然抽象类可以提供构造方法,但这个构造方法不能用来创建对象(如果硬要创建,会出现编译报错)。

2.抽象类可以包含抽象方法和非抽象方法:抽象方法是没有具体实现的方法,必须由其子类来实现;非抽象方法则已经有了具体的实现,可以直接在抽象类中使用。

3.子类必须实现所有抽象方法:如果一个子类继承了一个抽象类,那么它必须实现该抽象类中所有的抽象方法,否则该子类也必须声明为抽象类。

4.构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。

5.抽象类可以实现接口:抽象类可以实现多个接口,并且可以在该抽象类中提供接口中定义的方法的默认实现。

6.抽象类可以被继承:抽象类可以被其他类继承,被继承的子类可以使用抽象类中定义的非抽象方法,并且必须实现其中的所有抽象方法。

附录

https://www.cnblogs.com/c1024/p/11011996.html

https://www.cnblogs.com/weibanggang/p/11184671.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/515084.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Leetcode2379. 得到 K 个黑块的最少涂色次数

Every day a Leetcode 题目来源:2379. 得到 K 个黑块的最少涂色次数 解法1:滑动窗口 首先题目给出一个下标从 0 开始长度为 n 的字符串 blocks,其中 blocks[i] 是 ‘W’ 或者 ‘B’ ,分别表示白色块要么是黑色块。 现在我们可…

抗体偶联药物都有哪些?(详细名单)

抗体偶联药物ADC简介 抗体-药物偶联物或ADC是一类生物制药药物,设计用于治疗癌症的靶向疗法。与化学疗法不同,ADC 旨在靶向并杀死肿瘤细胞,同时保留健康细胞。截至 2023 年5月,约有 433 家制药公司正在开发 ADC。 ADC 是由与具有…

SPI基础

SPI硬件接口 SPI协议使用3条总线以及片选线。3条总线分别是SCK、MOSI、MISO,片选线为SS(NSS、CS) SPI基础属性 主从模式:主机模式,从机模式 通讯频率:不定,根据设备速率确定 数据位数:4位、7位&#xff…

基于狮群算法优化的核极限学习机(KELM)分类算法-附代码

基于狮群算法优化的核极限学习机(KELM)分类算法 文章目录 基于狮群算法优化的核极限学习机(KELM)分类算法1.KELM理论基础2.分类问题3.基于狮群算法优化的KELM4.测试结果5.Matlab代码 摘要:本文利用狮群算法对核极限学习机(KELM)进行优化,并用于分类 1.KE…

【华为机试】——每日刷题经验分享

【华为机试】——每日刷题经验分享😎 前言🙌题目:HJ9 提取不重复的整数 总结撒花💞 😎博客昵称:博客小梦 😊最喜欢的座右铭:全神贯注的上吧!!! &a…

被ChatGPT“抢饭碗”的人

ChatGPT问世至今,互联上讨论声绵延不绝。有人说,AI会替代基础性工作。 一名金融从业者对《橡果商业评论》表示,这实际上是对人类经验的替代,那些引以为傲的经验,来源于对历史的总结,AI出现后,“…

【C++STL】红黑树(更新中)

前言 上篇博客学习了平衡二叉搜索树(AVLTree),了解到AVL树的性质,二叉搜索树因为其独特的结构,查找、插入和删除在平均和最坏情况下都是O(logn)。AVL树的效率就是高在这个地方。 但是在AVL树中插入或者删除结点,使得高度差的绝对…

【GO 编程语言】数组

数组 文章目录 数组一、数组是什么二、初始化数组三、数组的遍历四、数组类型五、数组排序 一、数组是什么 Go 语言提供了数组类型的 数据结构。 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型。例如整型、字符串或者自定义类型。 …

HTTP第八讲——请求方法

目前 HTTP/1.1 规定了八种方法,单词都必须是大写的形式 GET:获取资源,可以理解为读取或者下载数据;HEAD:获取资源的元信息;POST:向资源提交数据,相当于写入或上传数据;P…

echarts 如何保存为图片时,如何同时保存滚动条隐藏的数据

echarts 如何保存为图片&#xff0c;如何保存滚动条隐藏的数据 效果展示上代码内容讲解面临的问题解决思路&#xff08;当前代码的思路&#xff09; 效果展示 这是直接将保存的图片显示在网页下方了 上代码 <!DOCTYPE html> <html><head><meta charse…

【2023/05/11】Edsger Dijkstra

Hello&#xff01;大家好&#xff0c;我是霜淮子&#xff0c;2023倒计时第6天。 Share Sorrow is hushed into peace in my heart like the evening among thr silent trees. 译文&#xff1a; 忧思在我的心里平静下去&#xff0c;正如暮色降临在寂静的山林中。 Some unsee…

【报告回顾】精、稳、敏、融,步入人民金融时代

易观分析&#xff1a;2022年&#xff0c;在深化金融供给侧结构性改革和高质量增长要求的指引下&#xff0c;赋能实体、公平普惠、审慎经营成为银行业转型发展的关键词。一方面面临内外部复杂的经济环境和不确定性风险&#xff0c;银行主打稳健策略&#xff0c;数字化转型仍在持…

Redis的伪集群搭建与配置

文章目录 Redis主从集群模式搭建过程分级管理容灾冷处理 Redis主从集群模式 Redis 的主从集群是一个“一主多从”的读写分离集群。集群中的 Master 节点负责处理客户端的读写请求&#xff0c;而 Slave 节点仅能处理客户端的读请求。只所以要将集群搭建为读写分离模式&#xff…

5.最长回文子串——Manacher(马拉车)算法

给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串。 示例 1&#xff1a; 输入&#xff1a;s "babad" 输出&#xff1a;"bab" 解释&#xff1a;"aba" 同样是符合…

【计算机组成原理】第三章 多层次的存储器

系列文章目录 第一章 计算系统概论 第二章 运算方法和运算器 第三章 多层次的存储器 第四章 指令系统 第五章 中央处理器 第六章 总线系统 第七章 外围设备 第八章 输入输出系统 文章目录 系列文章目录前言第三章 多层次的存储器3.1 存储器概述3.1.1 存储器的分类3.1.2 存储器…

软件性能测试有哪些测试指标?性能测试报告怎么编写?​

软件性能测试是软件测试过程中非常重要的一部分&#xff0c;它可以保证软件在正式上线之前的稳定性和可靠性。那么&#xff0c;在进行软件性能测试时&#xff0c;我们需要关注哪些测试指标呢?性能测试报告又应该如何编写呢? 一、软件性能测试的测试指标 1.响应时间 响应时…

为github项目提交补充(pr)教程

记录第一次提交PR 前言为github提交补充什么是PR&#xff1a;Fork&#xff1a;git clone自己仓库&#xff1a;git remote add upstream和他人仓库建立关系&#xff1a;git checkout branch名切换分支&#xff1a;开始DIY项目文件&#xff1a;推送修改到自己仓库&#xff1a;空H…

c高级day4

一、编写一个名为myfirstshell.sh的脚本&#xff0c;它包括以下内容。 1、包含一段注释&#xff0c;列出您的姓名、脚本的名称和编写这个脚本的目的 2、和当前用户说“hello 用户名” 3、显示您的机器名 hostname 4、显示上一级目录中的所有文件的列表 5、显示变量PATH和H…

5.11总结:train/eval/BN、CNN与特征图、极大似然与EM、方差n与n-1(有偏估计/无偏估计)

目录 1.关于模型的train/eval与batchnorm1-1.理论1-2.实际运用&#xff08;包含loss反向传播&#xff09; 2.CNN详解&#xff0c;特征图是什么CNN处理过程特征图&#xff08;也叫通道&#xff09;(num_features)总结&#xff08;包含CNN图片的规律分析&#xff09;&#xff1a;…

SpringBoot基础篇3(SpringBoot+Mybatis-plus案例)

环境搭建&#xff1a;配置起步依赖pom.xml和配置文件application.yml 1.创建模块时&#xff0c;勾选的依赖有springMVC和MySQL驱动 2.手动添加的依赖有&#xff1a;MyBatis-plus、Druid、lombok <dependencies><dependency><groupId>org.springframework.…