【java学习—九】抽象类和抽象方法(3)

news2024/12/21 20:25:16

文章目录

  • 1. 相关概念
  • 2. 如何定义抽象方法和抽象类
  • 3. 抽象类的作用
  • 4. 练习题
    • 4.1. 问题1
    • 4.2. 问题2


1. 相关概念

抽象类:随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用。类的设计应该保证父类和子类能够共享特征。有时将一个父类设计得非常抽象,以至于它没有具体的实例,这样的类叫做抽象类。

在这里插入图片描述

2. 如何定义抽象方法和抽象类

abstract关键字:
    (1)用 abstract 关键字来修饰一个类时,这个类叫做抽象类;
    (2)用 abstract关键字 来修饰一个方法时,该方法叫做抽象方法。

抽象方法:
    只有方法的声明,没有方法的实现。以分号结束,如:

	abstract int abstractMethod(int a);

注意:
①含有抽象方法的类必须被声明为抽象类
抽象类不能被实例化。抽象类是用来作为父类被继承的,抽象类的子类必须重写父类的抽象方法,并提供方法体。若没有重写全部的抽象方法,仍为抽象类
③不能用 abstract 修饰属性、私有方法、构造器、静态方法、 final 的方法。

3. 抽象类的作用

举例:
编程实现:父类为Animal类且为抽象类,子类有Dog、Fish、Bird类

答:
Animal类:

package day09;

public abstract class Animal {//定义父类Animal,因为类中含抽象方法,所以必须声明为抽象类
	public abstract void test();//只要类中有一个抽象方法,类就必须是一个抽象类
	
	public abstract void move();
}

//定义子类:Dog、Fish、Bird(抽象类)
//子类Dog
class Dog extends Animal{
	@Override
	public void test() {
		
	}
	
	@Override
	public void move() {
		System.out.println("狗的移动方式是跑");
		
	}
}

//子类Fish
class Fish extends Animal{
	@Override
	public void test() {
		
		
	}
	
	@Override
	public void move() {
		System.out.println("鱼的移动方式是游");
		
	}
}

//抽象子类Bird:抽象类可以继承抽象类
abstract class Bird extends Animal{//因为该类中没有重写test()方法,test()仍为抽象方法,所以Bird必须是抽象类
	
	@Override
	public void move() {
		System.out.println("鸟的移动方式是飞");
	}
		
	public abstract void test();//只要类中有一个抽象方法,类就必须是一个抽象类
}

Test.java:

package day09;

public class Test {
	public static void main(String[] args) {

		Dog d = new Dog();
		Fish f = new Fish();
		//Bird b = new Bird();//抽象类不能被实例化
		d.move();
		f.move();
	}
}

运行结果:

在这里插入图片描述

小结:抽象类是用来模型化那些父类无法确定全部实现,而是由其子类提供具体实现的对象的类。

4. 练习题

4.1. 问题1

问题情境:
    在航运公司系统中,Vehicle 类需要定义两个方法分别计算运输工具的燃料效率行驶距离
问题:卡车 (Truck) 和驳船 (RiverBarge) 的燃料效率和行驶距离的计算方法完全不同。 Vehicle类不能提供计算方法,但子类可以。该如何实现?

答案:

// Vehicle 是一个抽象类,有两个抽象方法。
public abstract class Vehicle{
	public abstract double calcFuelEfficiency(); // 计算燃料效率的抽象方法
	public abstract double calcTripDistance(); // 计算行驶距离的抽象方法
}


//Truck子类:
public class Truck extends Vehicle{
	public double calcFuelEfficiency( ) { 
	// 写出计算卡车的燃料效率的具体方法 
	}
	
	public double calcTripDistance( ) { 
	// 写出计算卡车行驶距离的具体方法
	 }
}

//RiverBarge子类:
public class RiverBarge extends Vehicle{
	public double calcFuelEfficiency( ) { 
	// 写出计算驳船的燃料效率的具体方法
	}
	public double calcTripDistance( ) {
	 // 写出计算驳船行驶距离的具体方法 
	 }
}

思考题:
问题 1 :为什么抽象类不可以使用 final 关键字声明?
答:(抽象类不能被实例化。抽象类是用来被继承的,抽象类的子类必须重写父类的抽象方法 ,并提供方法体)
问题 2 :一个抽象类中可以定义构造器吗?
答:抽象类可以有构造方法,只是不能直接创建抽象类的实例对象而已;
    抽象类不能实例化,new 抽象类() 是非法的。

4.2. 问题2

    编写一个 Employee 类,声明为抽象类,包含如下三个属性: name ,id , salary 。提供必要的构造器和抽象方法: work() 。对于 Manager类来说,他既是员工,还具有奖金 (bonus) 的属性。请使用继承的思想,设计 CommonEmployee 类和 Manager 类,要求类中提供必要的方法进行属性访问。

答案:
Employee类:

package day09;

//抽象类:Employee父类
public abstract class Employee {
	public Employee() {
		
	}
	
	int id;
	String name;
	double salary;
	
	public abstract void work();
}

//子类:普通员工
class CommonEmployee extends Employee{
	
	public void setCommonEmployeeInfo(int id, String name, double salary) {
		super.id = id;
		super.name = name;
		super.salary = salary;
	}
	
	public void getCommonEmployeeInfo() {
		System.out.println(super.id);
		System.out.println(super.name);
		System.out.println(super.salary);
	}
	
	@Override
	public void work() {
		System.out.println("这是一个普通的员工");
	}
}


//子类:领导
class Manager extends Employee{
	double bonus;
	
	public void setMangerInfo(int id, String name, double salary,double bonus) {
		super.id = id;
		super.name = name;
		super.salary = salary;
		this.bonus = bonus;
	}
	
	public void getMangerInfo() {
		System.out.println(super.id);
		System.out.println(super.name);
		System.out.println(super.salary);
		System.out.println(this.bonus);
	}
	
	@Override
	public void work() {
		System.out.println("这是领导");
	}
}

Test.java:

package day09;

public class Test {
	public static void main(String[] args) {
		//普通员工
		CommonEmployee ce = new CommonEmployee();
		ce.work();
		ce.setCommonEmployeeInfo(123, "员工张", 6000.00);
		ce.getCommonEmployeeInfo();
		
		System.out.println("---------------------------");

		//领导
		Manager me = new Manager();
		me.work();
		me.setMangerInfo(111, "领导李", 12000.00, 2000.00);
		me.getMangerInfo();
	}
}

运行结果:
在这里插入图片描述

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

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

相关文章

如何在群晖Synology+Office实现多人编辑一个文件?

使用群晖Synology Office提升生产力:多人同时编辑一个文件 文章目录 使用群晖Synology Office提升生产力:多人同时编辑一个文件本教程解决的问题是:1. 本地环境配置2. 制作本地分享链接3. 制作公网访问链接4. 公网ip地址访问您的分享相册5. 制…

潮玩宇宙:大逃杀模式的利与弊

在当今的游戏市场中,潮玩宇宙的概念越来越受到关注。这个以潮流玩具为主题的宇宙,不仅包含了众多类型的玩具和收藏品,还融合了各种独特的文化形式和娱乐内容。其中,大逃杀模式作为一种流行的游戏模式,在潮玩宇宙中占据…

倒计时 1 天!神策 2023 数据驱动大会「参会指南」,请收藏

「新旅程、新经营,决胜数字化」,神策 2023 数据驱动大会明日召开!大会聚焦客户经营与客户旅程主题,特邀数十位海内外专家、知名企业代表、资深投资人,分享行业观点与趋势洞察,共同推动中国企业数字化客户经…

Mysql8.1.0 windows 绿色版安装

Mysql8.1.0 windows 绿色版安装 目录 Mysql8.1.0 windows 绿色版安装1、下载mysql8.1.0_windows(mysql-8.1.0-winx64.zip)2、解压到安装目录3、添加环境变量4、新建mysql配置文件5、安装mysql服务6、初始化数据文件7、启动mysql服务8、进入mysql管理模式…

深度学习:张量 介绍

张量[1]是向量和矩阵到 n 维的推广。了解它们如何相互作用是机器学习的基础。 简介 虽然张量看起来是复杂的对象,但它们可以理解为向量和矩阵的集合。理解向量和矩阵对于理解张量至关重要。 向量是元素的一维列表: 矩阵是向量的二维列表: 下标…

JAVA面试题简单整理

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、重载和重写的区别一、&和&&的区别一、get和post请求的区别 delete、put一、cookie和session的区别一、Autowired和Resource区别一、”和equals…

wait 和 notify 这个为什么要在 synchronized 代码块中?

wait 和 notify wait 和 notify 用来实现多线程之间的协调,wait 表示让线程进入到阻塞状态,notify 表示让阻塞的线程唤醒。 wait 和 notify 必然是成对出现的,如果一个线程被 wait()方法阻塞,那么必然需要另外一个线程通过 noti…

C语言_文件_进程_进程间通讯 常用函数/命令 + 实例

文件相关命令: ps -aux|grep init? //搜索包含init名称的进程 top //linux下的资源管理器(动态)//open 返回的int 是给后面的读/写/光标移动 用的fd,没有open就不能进行后面的操作; int op…

大数据Flink(一百零三):SQL 表值聚合函数(Table Aggregate Function)

文章目录 SQL 表值聚合函数(Table Aggregate Function) SQL 表值聚合函数(Table Aggregate Function) Python UDTAF,即 Python TableAggregateFunction。Python UDTAF 用来针对一组数据进行聚合运算,比如同一个 window 下的多条数据、或者同一个 key 下的多条数据等,与…

【micro ros】快速上手:在 RT-Thread上运行 micro ros

文章目录 快速上手micro ros && RT-Thread(serial和udp方式)1.背景介绍2.工程准备工作2.1 克隆 RT-Thread主仓2.2 克隆 env-windows 3.编译准备工作3.1 python & cmake安装3.2 scons工具安装3.3 GNU make安装3.4 Fastgithub安装 4.工程配置4…

[SQL开发笔记]LIKE操作符:在 WHERE 子句中搜索列中的指定模式

一、功能描述: LIKE操作符:用于在 WHERE 子句中搜索列中的指定模式。 二、LIKE操作符语法详解: LIKE 语法 SELECT column1, column2,…FROM table_nameWHERE column LIKE pattern; 参数说明: (1)colum…

全球生物气候产品2.5m和30s分辨率

简介 生物气候是指生物和气候相互作用的结果,包括植物和动物对气候的影响,以及气候对生物的影响。生物气候研究的是生物、气候、土地和水等自然要素之间相互作用的过程,旨在探讨它们是如何互动并导致生态系统的变化的。生物气候对于理解全球…

C#,数值计算——分类与推理,基座向量机(SVM,Support Vector Machines)的计算方法与源程序

把 Support Vector Machines 翻译成 支持向量机 是书呆子翻译。基座向量机 不好吗。 1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// Support Vector Machines /// </summary> public class Svm { priv…

上海亚商投顾:沪指震荡反弹 华为汽车、卫星通信板块再度爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一、市场情绪 三大指数早盘低开低走&#xff0c;深成指、创业板指一度跌超1%&#xff0c;午后集体拉升翻红。 华为汽车概念…

KMS在腾讯云的微服务实践助力其降本50%

背景介绍 KMS 是一家日本的游戏公司&#xff0c;主要经营游戏业务、数字漫画业务、广告业务、云解决方案业务等&#xff0c;出品了多款在日本畅销的漫画风游戏&#xff0c;同时有网络漫画专业厂牌&#xff0c;以内容创作为目标&#xff0c;拥有原创 IP 创作、游戏开发等多元化发…

WSL2Linux 子系统(六)

WSL 连接USB WSL (Windows Subsystem for Linux) 是一种在 Windows 操作系统上运行 Linux 应用程序的兼容层。它的主要作用是提供了一个类似于虚拟机的环境&#xff0c;使得在 Windows 上开发和运行基于 Linux 的应用变得更加方便。然而&#xff0c;WSL 目前还不支持直接通过 …

spring6-提前编译:AOT

提前编译&#xff1a;AOT 1、AOT概述1.1、JIT与AOT的区别1.2、Graalvm1.3、Native Image 2、演示Native Image构建过程2.1、GraalVM安装&#xff08;1&#xff09;下载GraalVM&#xff08;2&#xff09;配置环境变量&#xff08;3&#xff09;安装native-image插件 2.2、安装C的…

【Unity程序技巧】事件管理器

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

TIA博途_Profinet通信故障诊断及常见错误解决方法汇总

TIA博途_Profinet通信故障诊断及常见错误解决方法汇总 1. 在线诊断报硬件组件的用户数据错误,设备组态不支持 解决方法: (1)检查模块终端盖板; (2)检查组态模块与实际组装模块顺序型号是否一致。 2. 网络视图,设备视图界面显示黑色感叹号 解决方法: PLC转离线,下载硬…

疫情物资管理系统-基于SSM实现

包括-源码参考文档 下载地址: https://juzhendongli.store/commodity/details/5