Java学习教程,从入门到精通,Java 抽象类和抽象方法语法知识点及案例代码(32)

Java 抽象类和抽象方法语法知识点及案例代码

1. 抽象类和抽象方法的定义

抽象类

  • 抽象类是一个包含抽象方法的类,或者即使不包含抽象方法,但被设计为不能被实例化的类。
  • 抽象类使用 abstract 关键字修饰。
  • 抽象类不能被实例化,即不能创建它的对象实例,但可以作为其他类的基类。
  • 抽象类中可以包含成员变量、常量、抽象方法以及非抽象方法。
    抽象方法
  • 抽象方法是一个没有实现的方法,即没有方法体(没有大括号 {} 和其中的代码)。
  • 抽象方法通过 abstract 关键字来定义。
  • 抽象方法的主要作用是为子类提供一个规范或接口,强制子类必须实现这个方法。

2. 抽象类和抽象方法的声明格式

抽象类声明格式

public abstract class 类名 {成员变量;方法() { 方法体; } // 一般方法abstract 方法(); // 抽象方法
}

抽象方法声明格式

修饰符 abstract 返回值类型 方法名(参数列表);

3. 抽象类和抽象方法的特点

  • 抽象方法

    • 抽象方法只有声明,没有实现。
    • 抽象方法不能用 privatefinalstaticnative 修饰。
  • 抽象类

    • 抽象类不能被实例化,即使不包含抽象方法。
    • 抽象类中可以包含构造方法,供子类调用。
    • 抽象类中不一定包含抽象方法,但有抽象方法的类必定是抽象类。
    • 抽象类的子类必须实现父类中所有的抽象方法,否则子类也必须声明为抽象类。

4. 案例代码

以下是一个完整的示例,定义了一个抽象类 Shape,以及它的几个子类 CircleRectangleTriangle,分别计算不同形状的面积和周长。

// 抽象类 Shape
public abstract class Shape {// 抽象方法,计算面积public abstract double area();// 抽象方法,计算周长public abstract double perimeter();// 具体方法,描述形状public void describe() {System.out.println("This is a shape.");}
}// 圆形类 Circle,继承 Shape 并实现抽象方法
public class Circle extends Shape {private double radius;public Circle(double radius) {this.radius = radius;}@Overridepublic double area() {return Math.PI * radius * radius;}@Overridepublic double perimeter() {return 2 * Math.PI * radius;}
}// 矩形类 Rectangle,继承 Shape 并实现抽象方法
public class Rectangle extends Shape {private double length;private double width;public Rectangle(double length, double width) {this.length = length;this.width = width;}@Overridepublic double area() {return length * width;}@Overridepublic double perimeter() {return 2 * (length + width);}
}// 三角形类 Triangle,继承 Shape 并实现抽象方法
public class Triangle extends Shape {private double a, b, c;public Triangle(double a, double b, double c) {this.a = a;this.b = b;this.c = c;}@Overridepublic double area() {double p = (a + b + c) / 2;return Math.sqrt(p * (p - a) * (p - b) * (p - c));}@Overridepublic double perimeter() {return a + b + c;}
}// 测试类
public class Test {public static void main(String[] args) {Shape circle = new Circle(5);Shape rectangle = new Rectangle(4, 6);Shape triangle = new Triangle(3, 4, 5);System.out.println("Circle area: " + circle.area());System.out.println("Circle perimeter: " + circle.perimeter());circle.describe();System.out.println("Rectangle area: " + rectangle.area());System.out.println("Rectangle perimeter: " + rectangle.perimeter());rectangle.describe();System.out.println("Triangle area: " + triangle.area());System.out.println("Triangle perimeter: " + triangle.perimeter());triangle.describe();}
}

5. 运行结果

运行上述测试类 Test,将会输出以下内容:

Circle area: 78.53981633974483
Circle perimeter: 31.41592653589793
This is a shape.
Rectangle area: 24.0
Rectangle perimeter: 20.0
This is a shape.
Triangle area: 6.0
Triangle perimeter: 12.0
This is a shape.

这个示例展示了如何使用抽象类和抽象方法来定义一个通用的接口,并在不同的子类中实现这些接口。
以下是一个使用

抽象类和抽象方法的具体案例

关于动物王国系统的简单实现:

动物王国系统

抽象类:Animal

首先,我们定义一个抽象类 Animal,它包含所有动物共有的抽象方法,如 makeSoundmove。这些方法没有具体的实现,因为它们在不同的动物种类中会有不同的表现。

public abstract class Animal {// 抽象方法:发出声音public abstract void makeSound();// 抽象方法:移动public abstract void move();// 具体方法:描述动物public void describe() {System.out.println("This is an animal.");}
}

子类:Dog 和 Cat

接下来,我们定义两个具体的动物类 DogCat,它们都继承自 Animal 类,并实现了其中的抽象方法。

// 狗类,继承自 Animal
public class Dog extends Animal {@Overridepublic void makeSound() {System.out.println("Woof! Woof!");}@Overridepublic void move() {System.out.println("The dog is running.");}// 狗类特有的方法:摇尾巴public void wagTail() {System.out.println("The dog is wagging its tail.");}
}// 猫类,继承自 Animal
public class Cat extends Animal {@Overridepublic void makeSound() {System.out.println("Meow! Meow!");}@Overridepublic void move() {System.out.println("The cat is walking.");}// 猫类特有的方法:抓老鼠public void catchMouse() {System.out.println("The cat is catching a mouse.");}
}

测试类:AnimalKingdom

最后,我们创建一个测试类 AnimalKingdom,用于展示如何使用这些类和方法。

public class AnimalKingdom {public static void main(String[] args) {// 创建 Dog 对象Animal dog = new Dog();dog.makeSound(); // 输出:Woof! Woof!dog.move();      // 输出:The dog is running.dog.describe();  // 输出:This is an animal.if (dog instanceof Dog) {((Dog) dog).wagTail(); // 强制类型转换后调用 Dog 类的特有方法}// 创建 Cat 对象Animal cat = new Cat();cat.makeSound(); // 输出:Meow! Meow!cat.move();      // 输出:The cat is walking.cat.describe();  // 输出:This is an animal.if (cat instanceof Cat) {((Cat) cat).catchMouse(); // 强制类型转换后调用 Cat 类的特有方法}}
}

运行结果

运行 AnimalKingdom 类,将会输出以下内容:

Woof! Woof!
The dog is running.
This is an animal.
The dog is wagging its tail.
Meow! Meow!
The cat is walking.
This is an animal.
The cat is catching a mouse.

案例总结

这个案例展示了如何使用抽象类和抽象方法来定义一个通用的动物接口,并在不同的动物子类中实现这些接口。通过使用抽象类,我们可以确保所有子类都实现了必要的方法,从而提供了一种结构化和可扩展的方式来管理动物王国的系统。同时,我们也看到了如何在运行时进行类型检查和强制类型转换,以调用子类特有的方法。

抽象类和抽象方法之间的区别

主要体现在以下几个方面:

定义与用途

  • 抽象类:是一种特殊的类,它不能被实例化,主要用于定义一些通用的方法和属性,让子类继承并实现它们。抽象类中可以包含普通方法和属性,但至少要有一个抽象方法(尽管这不是强制性的,但包含抽象方法的类必须被声明为抽象类)。
  • 抽象方法:是一种没有实现的方法,只有定义,需要在子类中被实现。抽象方法一般存在于抽象类或接口中,它没有方法体,只有方法签名。

声明与实现

  • 抽象类:使用abstract关键字来修饰,它不能直接被实例化,但可以被其他类继承。继承抽象类的子类必须实现抽象类中的所有抽象方法(除非子类本身也是抽象类)。
  • 抽象方法:同样使用abstract关键字来修饰,它只有方法声明,没有方法体。抽象方法必须在子类中被实现,否则子类也将被视为抽象类。

成员与继承

  • 抽象类:可以包含普通方法和属性,这些方法和属性可以被子类直接使用(不必重写)。此外,抽象类还可以有构造方法,用于初始化属性。
  • 抽象方法:不能是privatestaticfinal修饰的,因为这些关键字都是和重写相违背的。抽象方法必须被子类重写,以提供具体的实现。

应用场景

  • 抽象类:常用于定义一些通用的行为或属性,这些行为或属性在子类中有具体的实现。抽象类提供了一种模板或框架,让子类在此基础上进行扩展和实现。
  • 抽象方法:常用于在抽象类或接口中定义一些需要子类实现的方法。这些方法是抽象的,没有具体的实现,留给子类去具体实现。

示例对比

  • 抽象类示例
public abstract class Animal {private String name;public Animal(String name) {this.name = name;}public String getName() {return name;}public abstract void eat(); // 抽象方法
}
  • 抽象方法示例(通常与抽象类一起使用):
public abstract class Animal {// ... 其他方法和属性 ...public abstract void eat(); // 抽象方法,没有实现
}public class Dog extends Animal {@Overridepublic void eat() {System.out.println("Dog is eating.");}
}

在上面的示例中,Animal是一个抽象类,它包含了一个抽象方法eat()Dog类继承了Animal类,并实现了eat()方法。
综上所述,抽象类和抽象方法都是面向对象编程中的重要概念,它们共同构成了抽象机制的基础。抽象类提供了一种定义通用行为和属性的方式,而抽象方法则用于在子类中实现这些行为。

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

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

相关文章

jmeter常用配置元件介绍总结之监听器

系列文章目录 1.windows、linux安装jmeter及设置中文显示 2.jmeter常用配置元件介绍总结之安装插件 3.jmeter常用配置元件介绍总结之线程组 4.jmeter常用配置元件介绍总结之函数助手 5.jmeter常用配置元件介绍总结之取样器 6.jmeter常用配置元件介绍总结之jsr223执行pytho…

蓝绿色电影风格滑板运动自拍照Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色教程 蓝绿色电影风格的滑板运动自拍照,通过 Lightroom 调色,将滑板运动的活力与电影般的质感相结合。这种风格以独特的蓝绿色调为主,营造出一种神秘、宁静又充满活力的氛围,仿佛将瞬间定格成电影画面中的一帧。 预设信息 调…

通用定时器---输入捕获功能

目录 一、概念 二、输入捕获的结构图 三、配置的基本步骤 一、概念 STM32的输入捕获功能是一种强大的特性,他允许处理器捕获外部输入信号,并基于定时器抓取输入信号指定触发方式(上升沿/下降沿)之间的长度。这对于测量信号的脉…

Comsol 大功率超声波清洗机

大功率超声波清洗机是利用超声波在清洗液中产生的空化作用来清洗物体表面的设备。这种清洗机通常用于清洗工业零部件、实验器皿、医疗器械等物体,能够高效去除表面附着的污垢、油脂、细菌等。 大功率超声波清洗机的工作原理是通过超声波换能器将电能转换成机械振动…

计算机视觉中的双边滤波:经典案例与Python代码解析

🌟 计算机视觉中的双边滤波:经典案例与Python代码解析 🚀 Hey小伙伴们!今天我们要聊的是计算机视觉中的一个重要技术——双边滤波。双边滤波是一种非线性滤波方法,主要用于图像去噪和平滑,同时保留图像的边…

模板——实现泛型编程的有力武器

模板——实现泛型编程的有力武器 我们为什么需要模板?模板 前言:关于模板,相信大家都有所而闻,以下是我对C模板的个人看法,希望能够帮助到你们呀! 我们为什么需要模板? 请到大家看这一段代码&a…

Hugging_Face下载

能进huggingface的就能翻过去 不行的话可以去参考这个:mojie.app 1.直接原网下载 2.git(小白勿入) 如果是Linux,可以搜一个叫HFD(HuggingFace_Download) Windows的git安装参考如下:Git安装 建议先看看这个文档, 如果…

C++之内存管理

​ 🌹个人主页🌹:喜欢草莓熊的bear 🌹专栏🌹:C入门 目录 前言 一、C/C内存分配 二、 malloc、calloc、realloc、free 三、C内存管理方式 3.1 new/delete 操作内置类型 3.2 new和detele操作自定义类型…

QT适配最新版Android SDK

从AndroidStudio的SDK管理下载最新版SDK 从https://www.androiddevtools.cn/下载国内安卓SKDTools 这里下载SKDTools后不需要使用SDK Manager.exe下载SDK(SDK Manager.exe下载的SDK都是旧版,没法支持新版本),直接使用从AndroidS…

Ubuntu 环境下通过 Apt-get 安装软件

操作场景 为提升用户在云服务器上的软件安装效率,减少下载和安装软件的成本,腾讯云提供了 Apt-get 下载源。在 Ubuntu 环境下,用户可通过 Apt-get 快速安装软件。对于 Apt-get 下载源,不需要添加软件源,可以直接安装软…

反转链表、链表内指定区间反转

反转链表 给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。 如当输入链表{1,2,3}时,经反转后,原链表变…

SpringCloud篇(服务网关 - GateWay)

目录 一、简介 二、为什么需要网关 二、gateway快速入门 1. 创建gateway服务,引入依赖 2. 编写启动类 3. 编写基础配置和路由规则 4. 重启测试 5. 网关路由的流程图 6. 总结 三、断言工厂 四、过滤器工厂 1. 路由过滤器的种类 2. 请求头过滤器 3. 默认…

MATLAB实现历史模拟法计算VaR(Value at Risk)

MATLAB实现历史模拟法计算VaR(Value at Risk) 历史模拟法(Historical Simulation Method)是一种用于计算风险值(Value at Risk, VaR)的非参数方法。它基于过去的资产价格或收益数据来估计未来的潜在损失。 MATLAB代码如下: 完整…

数据结构——红黑树

目录 一.红黑树 二.红黑树的实现 1.红黑树节点的定义 2.红黑树的插入 3.红黑树的遍历 4.检测红黑树 5.红黑树的查找 6.红黑树的性能 三.整体代码 1.RBTree.h 2.RBTree.cpp 一.红黑树 1.红黑树的概念 红黑树,是一种二叉搜索树,但在每个结点上…

OMV7 树莓派 tf卡安装

​ 升级7之后,问题多多,不是docker不行了,就是代理不好使 今天又重装了一遍,用官方的链接,重新再折腾一遍…… 使用raspberry pi imager安装最新版lite OS。 注意是无桌面 Lite版 配置好树莓派初始化设置&#xff0…

Java集合ConcurrentHashMap——针对实习面试

目录 Java集合ConcurrentHashMapConcurrentHashMap的特性是什么?HashMap和ConcurrentHashMap的区别?说说ConcurrentHashMap的底层实现 Java集合ConcurrentHashMap ConcurrentHashMap的特性是什么? 线程安全性 多线程并发读写安全&#xff1a…

攻防世界-mfw

进入题目以后可以点击三个网页&#xff0c;这三个网页其中有一个提示我们git、php、Bootstrap。可以联想到是git泄露 在url后面的参数改为.git 存在git漏洞&#xff0c;这时候就可以利用python的githacker库下载泄漏的文件 查看index.php的源代码 <?phpif (isset($_GET[pa…

MySQL面试之底层架构与库表设计

华子目录 mysql的底层架构客户端连接服务端连接的本质&#xff0c;连接用完会立马丢弃吗解析器和优化器的作用sql执行前会发生什么客户端的连接池和服务端的连接池数据库的三范式 mysql的底层架构 客户端连接服务端 连接的本质&#xff0c;连接用完会立马丢弃吗 解析器和优化器…

代理(下):结构化工具对话、Self-Ask with Search以及Plan and execute代理

在上一讲中&#xff0c;我们深入LangChain程序内部机制&#xff0c;探索了AgentExecutor究竟是如何思考&#xff08;Thought&#xff09;、执行&#xff08;Execute/Act&#xff09;和观察&#xff08;Observe&#xff09;的&#xff0c;这些步骤之间的紧密联系就是代理在推理&…

RPC-路由策略

为什么选择路由策略&#xff1f; 每次上线应用的时候都不止一台服务器会运行实例&#xff0c;那上线就涉及到变更&#xff0c;只要变更就可能导致原本正常运行的程序出现异常&#xff0c;尤其是发生重大变动的时候&#xff0c;导致应用不稳定的因素就变得很多。 灰度发布应用…