JAVA—抽象—定义抽象类Converter及其子类WeightConverter

同样,我们由这道题引出抽象类,抽象方法这个概念。

按下面要求定义类Converter及其子类WeightConverter

定义抽象类:Converter:

定义一个抽象类Converter,表示换算器,其定义的如下:

  1. 一个私有的String类型成员变量:name,表示换算器Converter的名称,并定义name变量的getter方法;
  2. 一个带参数的构造器,用于对name赋值;
  3. 一个公有的抽象方法:double convert(); 表示进行换算操作。

定义Converter的子类WeightConverter:

定义Converter的子类WeightConverter,表示重量换算器。

对于WeightConverter类的要求如下:

  1. 成员变量 value 表示原重量值,并定义其getter方法;
  2. 成员变量 factor 表示换算系数,比如 公斤-克的换算系数为1000,因为1公斤=1000克;
  3. 带三个参数的构造器,在实例化WeightConverter对象时初始化:换算器名称、原重量值以及换算系数;
  4. 实现父类Converter中的convert方法,将原重量值换算为指定单位的重量值

Main类代码:

import java.lang.reflect.Modifier;
import java.util.Scanner;
public class Main {public static void main(String[] args) throws ClassNotFoundException {Class<?> clazz = Class.forName("Converter");Class<?> clazz2 = Class.forName("WeightConverter");boolean isAbs = Modifier.isAbstract(clazz.getModifiers()) ;System.out.println(clazz.isAssignableFrom(clazz2)+" "+Modifier.isAbstract(clazz.getModifiers()));Scanner scanner = new Scanner(System.in);System.out.println("请输入换算器名称(比如:斤-克)、原重量值和换算系数,中间用空格分开");String name = scanner.next();double value = scanner.nextDouble();double factor = scanner.nextDouble();WeightConverter converter = new WeightConverter(name,value,factor);String[] units = name.split("-");System.out.println(converter.getName()+"换算,"+converter.getValue()+units[0]+"="+converter.convert()+units[1]);}
}

输入样例:

在这里给出一组输入。例如:

斤-克 2.5 500

输出样例:

在这里给出相应的输出。例如:

true true
请输入换算器名称(比如:斤-克)、原重量值和换算系数,中间用空格分开
斤-克换算,2.5斤=1250.0克

先来看有关抽象类问题的需求:
 定义一个抽象类,成员变量和构造器倒是和以前定义类时差不多,唯一变了的就是方法,这里要求我们定义一个抽象方法。

好嘞,撸起袖子加油干——咱们来唠唠“抽象”。

抽象

抽象:英文abstract,为什么要抽象?Java为了符合现实生活中的逻辑,有些类是不能被实例化的,于是便有了抽象类。

举个例子:我们要介绍一个人的爱好。这时候,爱好就是个抽象的概念,它看不见摸不着,是只存在人类脑子里的概念。爱好可以是方方面面,在写爱好类时,我们可以标上爱好的名字,但我们是敲不出方法体的——再细细道来:

我们可以先写一个Person类,然后Person类具有姓名,职业以及爱好这个方法,由上面分析可以知道,在没有实例化Person时我们并不知道这个爱好究竟是什么。这时候我们利用abstract关键字,把爱好这个方法写成抽象方法(具体格式在后面),既然这个类有个方法/行为是抽象的,那么这个类也应该是抽象的。

因为对象,我们又称作实例对象,所有的属性和方法都得具体化。一旦抽象类被实例化,一是它的逻辑上说不通,二是抽象方法与具体、完整的实例方法相矛盾。

小总结:

故抽象类是不能被实例化的,且有了抽象方法就一定是抽象类

且看代码:

public abstract class Person {//定义一个Person类private String name;private String career;//俩成员变量public Person(String name,String career){this.name = name;this.career = career;}//有参构造器public abstract String hobby();//未知爱好,无法书写方法体,故令其为抽象方法public String toString()//这里重写toString()方法,改变返回类的信息,不再是简单的地址_哈西玛{return name + "是一位" + career + "爱好是" + hobby();}//toString()方法是Person类继承Object类的方法,对其进行重写}

题外话:所有的类的拥有一个共同的父类:Object类,一般默认不写,但是默认继承。

虽说只能有一个直接父类,但是间接父类是可以有很多的,并且都会继承间接父类的属性和方法。有关继承和方法覆盖,我们在这里详说:感兴趣的小伙伴可移步这里

Java-继承-定义Student类继承于Person类(例)-CSDN博客

抽象类的语法格式:

public abstract class 类名
{}//abstract关键字放在class前面

abstract是放在class前面,抽象一般是公开的,但一定不能是private。

抽象方法的语法格式:

abstract 方法返回类型 方法名(参数列表)
{//方法体
}

问题来了,抽象到底做什么用呢?---抽象类的逻辑作用:避免抽象类被实例化(这个我们上文解释过了);代码上的作用,其实就是一种继承。

抽象方法的作用——用来对继承它的子类的行为作出某种规范,实现方法的声明。

怎么又和继承挂上钩了?好问题,不过能问出这种问题,说明还需要对继承有正确的认识。

对于上次说到的继承:我们会使用继承,是因为类与类之间具有传承。这里引入的抽象类,其实本质上是对继承的扩大,有些时候父类并不会是实实在在的类,不能被实例化。

综上所述,继承本质上是描述类与类之间抽象与具体的关系,父类未完善的,子类就对其补充。

而抽象,也正是对继承的普遍化,对于我们定义子类起着更加规范的作用,因为抽象方法必须实现,因为不实现,编译都不给过。而子类继承非抽象类的父类的方法时,对于方法重写需要我们主动Override。

了解了继承与抽象的关系,那读懂抽象的语法规则简直易如反掌。

abstract的语法规则

1.abstract不能修饰private,抽象方法作父类肯定要被子类继承并一对一进行完善,子类看不见,显然是矛盾的。

2.抽象方法必须定义在抽象类中,抽象方法意味着某个类在某个行为上抽象,那沾了点抽象,就是抽象类了。

3.抽象方法不能有实现,被实现的抽象方法就不叫抽象方法了。注意:在子类里被实现的抽象方法是叫实例方法,也可以叫方法覆盖不过是强制性的。只有抽象类里的方法才能算抽象方法

咱们把这道题拿下,抽象的知识点基本就掌握了。

回到题目

1、2要求我们还是直接上代码,需要相应详细参考的,可以移步:定义类:定义一个类Square表示正方形_定义一个square类,当客户访问该页面时,服务器创建该类的对象,只要客户给出正方形-CSDN博客

public abstract class Converter {//让我们定义一个抽象类,则在class前面加一个abstractString name;//换算器名称public String getName(){return name;}//name的getter方法public Converter(String name){this.name = name;}//有参构造器
}

3.抽象方法的书写

public abstract class Converter {//...public abstract double convert();//抽象方法,是不是很像方法的声明,不过确实是方法声明//抽象方法,如果在声明里面,abstract前面写上了public ,那后面在子类实现方法的时候一定也要加上public,否则会报错
}

在抽象方法声明里面有了public,后面子类实现方法的时候一定要加上public。如果声明里面没有写public,子类里面倒是可写 可不写。有觉得绕的同学,可以记住:要么都写,要么都不写。

前俩题,涉及定义类这个知识点。而3题,涉及super关键字和继承,要作详细了解的同学,移步: Java-继承-定义Student类继承于Person类-CSDN博客

前仨的代码:

public class WeightConverter extends Converter//子类继承抽象类/父类
{private double value;//原重量值public double  factor;//换算系数public double getValue(){return value;}public WeightConverter(String name,double value,double factor){super(name);//调用父类的构造器,实现该对象下的成员变量赋值this.value = value;this.factor = factor;}
}

 

子类对抽象方法的实现

public class WeightConverter extends Converter
{
//...public double convert(){return value * factor; }//根据题意得,看不懂题?由输入样例和输出样例结合一下,可知就是value和factor相乘的结果}

完整代码:(合在一个java文件下,只会有一个public类就是main类)

abstract class Converter
{String name;public String getName(){return name;}public Converter(String name){this.name = name;}public abstract double convert();}class WeightConverter extends Converter
{double value;//原重量值double  factor;//换算系数public double getValue(){return value;}public WeightConverter(String name,double value,double factor){super(name);this.value = value;this.factor = factor;}public double convert(){return value * factor; }}

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

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

相关文章

海外仓的出入库流程有什么痛点?位像素海外仓系统怎么提高出入库效率?

随着跨境电商的蓬勃发展&#xff0c;海外仓是其中不可或缺的一个关键环节。而货物的出库与入库则是海外仓管理中的一个核心业务流程&#xff0c;它的运作效率直接影响到整个跨境物流的效率和客户体验。今天&#xff0c;让我们具体来看一看关于海外仓出入库的流程&#xff0c;其…

JVM内存性能调优思路之:通过GC log、Thread Dump 、Heap Dump分析内存使用说明

文章目录 一. 各日志概述1. Garbage Collection Log - 找到GC规律2. 线程转储(Thread dump) - 分析&#xff08;快照&#xff09;线程状态3. 堆转储(Heap dump) - APP某刻内存使用全貌 二. 命令1. 程序的gc日志2. 线程转储3. 堆转储 概述 在 Java 虚拟机中&#xff0c;(GC) Gar…

C++ 类和对象(初篇)

类的引入 C语言中&#xff0c;结构体中只能定义变量&#xff0c;在C中&#xff0c;结构体内不仅可以定义变量&#xff0c;也可以定义函数。 而为了区分C和C我们将结构体重新命名成class去定义 类的定义 标准格式&#xff1a; class className {// 类体&#xff1a;由成员函…

【计算机毕业设计】计算机考试系统设计——后附源码

&#x1f389;**欢迎来到我的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 一名来自世界500强的资深程序媛&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 在深度学习任务中展现出卓越的能力&#xff0c;包括但不限于…

华为openEuler-22.03-LTS-SP3配置yum源

先有华为后有天&#xff0c;遥遥领先&#xff01; 1 确定使用的OS版本 # cat /etc/os-release NAME"openEuler" VERSION"22.03 (LTS-SP3)" ID"openEuler" VERSION_ID"22.03" PRETTY_NAME"openEuler 22.03 (LTS-SP3)" ANSI…

【NLP】关于BERT模型的一些认知

BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;模型是由Google在2018年提出的预训练Transformer模型&#xff0c;用于自然语言处理任务。 一. BERT模型的架构 1.1 输入表示 / Encoder模块 BERT中的Encoder模块是由三种Embedding&…

GD32F470_ DS18B20温度传感器模块移植

DS18B20温度传感器 DS18B20数字温度传感器提供9位至12位精度的温度测量&#xff0c;并具有非易失性用户可编程上下触发点报警功能。DS18B20通过单总线通信&#xff0c;根据定义&#xff0c;只需要一条数据线(和地线)即可与单片机通信。此外&#xff0c;DS18B20可以直接从数据线…

vue2开发好还是vue3开发好vue3.0开发路线

Vue 2和Vue 3都是流行的前端框架&#xff0c;它们各自有一些特点和优势。选择Vue 2还是Vue 3进行开发&#xff0c;主要取决于你的项目需求、团队的技术栈、以及对新特性的需求等因素。以下是一些关于Vue 2和Vue 3的比较&#xff0c;帮助你做出决策&#xff1a; Vue 2&#xff1…

docker安装nacos,单例模式(standalone),使用mysql数据库

文章目录 前言安装创建文件夹"假装"安装一下nacos拷贝文件夹删除“假装”安装的nacos容器生成nacos所需的mysql表获取mysql-schema.sql文件创建一个mysql的schema 重新生成新的nacos容器 制作docker-compose.yaml文件查看网站 前言 此处有本人写得简易版本安装&…

log4j 集成 ELK环境搭建

一、前言 1.需要准备一台linux服务器&#xff08;最好是CentOS7&#xff09;,内存至少4g以上&#xff08;三个组件都比较占用内存&#xff09; 2.需要有docker使用经验 3. 三个软件的版本要一致 二、安装ElasticSearch 这里先创建一个网络&#xff1a;因为我们还需要部署k…

品牌定位升级|飞雕开关如何从家庭作坊走上国际之路?

飞雕电器,这个名字在中国开关插座行业中如同一面旗帜,自1987年起就扬帆在电工领域的大海中。它不仅见证了这个行业的起起伏伏,还始终以其创新的姿态站在浪尖之上。 飞雕的产品线丰富多彩,除主营的墙壁开关插座领域外,飞雕电器还涉足了与墙壁开关紧密相关的其它领域,现已推出移…

蓝桥杯第十四届C++C组

目录 三国游戏 填充 翻转 【单调队列优化DP】子矩阵 【快速幂、欧拉函数】互质数的个数 【tire树】异或和之差 【质因数分解】公因数匹配 子树的大小 三国游戏 题目描述 小蓝正在玩一款游戏。游戏中魏蜀吴三个国家各自拥有一定数量的士兵X, Y, Z (一开始可以认为都…

Linux中安装nacos

Linux中安装nacos 一、前言二、准备1、下载2、上传到服务器3、解压 三、配置1、备份配置文件2、导入sql3、修改前4、修改后 四、使用1、启动2、关闭 一、前言 最近国外的docker似乎是出什么问题&#xff0c;试过很多手段都拉不下 nacos 镜像&#xff0c;就打算在服务器装一下 …

能否安全地删除 Mac 资源库中的文件?

在管理Mac电脑存储空间时&#xff0c;用户确实可能考虑对资源库&#xff08;Library&#xff09;文件夹进行清理以释放空间。Mac资源库是一个系统及应用程序存放重要支持文件的地方&#xff0c;其中包括但不限于配置文件、临时文件、缓存、插件、偏好设置、应用程序支持数据等。…

Rustdesk二次编译,新集成AI功能开源Gpt小程序为远程协助助力,全网首发

环境&#xff1a; Rustdesk1.1.9 sciter版 问题描述&#xff1a; Rustdesk二次编译&#xff0c;新集成AI功能开源Gpt小程序为远程协助助力,全网首发 解决方案&#xff1a; Rustdesk二次编译&#xff0c;新集成开源AI功能Gpt小程序&#xff0c;为远程协助助力&#xff0c…

【蓝桥杯嵌入式】六、真题演练(三)-2研究篇:第13届第一场真题

温馨提示&#xff1a; 真题演练分为模拟篇和研究篇。本专栏的主要作用是记录我的备赛过程&#xff0c;我打算先自己做一遍&#xff0c;把遇到的问题和不同之处记录到演练篇&#xff0c;然后再返回来仔细研究一下&#xff0c;找到最佳的解题方法记录到研究篇。题目在&#xff1a…

远程过程调用(远程调用)

远程过程调用&#xff08;远程调用&#xff09; 1、什么是分布式计算 在计算机科学中&#xff0c;分布式计算&#xff08;英语&#xff1a;Distributed computing&#xff09;&#xff0c;又译为分散式运算。这个研究领域&#xff0c;主要研究分布式系统&#xff08;Distribu…

学习周报:文献阅读+Fluent案例+水力学理论学习

目录 摘要 Abstract 文献阅读&#xff1a;物理信息的神经网络与湍流传质的非封闭机制模型相结合 文献摘要 提出问题 提出方案 实验设置 所需方程介绍 雷诺时均方程&#xff08;RANS&#xff09; K-epsilon两方程模型 神经网络框架 DNN部分 损失函数定义 PINN部分…

Francek Chen 的128天创作纪念日

目录 Francek Chen 的128天创作纪念日机缘收获日常成就憧憬 Francek Chen 的128天创作纪念日 Francek Chen 的个人主页 机缘 不知不觉的加入CSDN已有两年时间了&#xff0c;最初我第一次接触CSDN技术社区是在2022年4月的时候&#xff0c;通过学长给我们推荐了几个IT社区平台&a…

【Python】还在用print进行调试,你Out了!!!

1. 引言 Python 中最常用的函数是什么&#xff1f;像在大多数编程语言中&#xff0c;print() 函数是最常用的。我相信大多数开发者都会像我一样&#xff0c;在开发过程中多次使用它将信息进行打印。 当然&#xff0c;没有其他方法可以完全取代print()函数。不过&#xff0c;当…