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

news2024/11/15 19:30:15

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

按下面要求定义类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前面加一个abstract

        String 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.coloradmin.cn/o/1575307.html

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

相关文章

HarmonyOS实战开发DLP-如何实现一个安全类App。

介绍 本示例是一个安全类App&#xff0c;使用ohos.dlpPermission 接口展示了在eTS中普通文件加密受限的过程。 效果预览 使用说明: 1.启动应用后点击“”按钮可以添加一个普通文件; 2.长按点击加密按钮&#xff0c;出现加密权限弹窗&#xff0c;选择需要设置的权限并点击确定…

【C语言】_文件类型,结束判定与文件缓冲区

目录 1. 文本文件和二进制文件 2. 文件读取结束的判定 3. 文件缓冲区 1. 文本文件和二进制文件 根据数据的组织形式&#xff0c;数据文件被称为文本文件或二进制文件&#xff1b; 数据在内存中以二进制的形式存储&#xff0c;如果不加转换地输出到外存&#xff0c;就是二进…

蓝桥杯刷题-13-子矩阵-二维滑动窗口 ಥ_ಥ

给定一个 n m &#xff08;n 行 m 列&#xff09;的矩阵。 设一个矩阵的价值为其所有数中的最大值和最小值的乘积。求给定矩阵的所有大小为 a b &#xff08;a 行 b 列&#xff09;的子矩阵的价值的和。 答案可能很大&#xff0c;你只需要输出答案对 998244353 取模后的结果。…

Redis 的主从复制、哨兵和cluster集群

目录 一. Redis 主从复制 1. 介绍 2. 作用 3. 流程 4. 搭建 Redis 主从复制 安装redis 修改 master 的Redis配置文件 修改 slave 的Redis配置文件 验证主从效果 二. Redis 哨兵模式 1. 介绍 2. 原理 3. 哨兵模式的作用 4. 工作流程 4.1 故障转移机制 4.2 主节…

Java开发测试(第一篇):Java测试框架JUnit5

目录 1.基本介绍 2.maven中安装JUnit5 3.使用 4.JUnit5命名规则 5.JUnit5常用注解 6.JUnit5断言 7.JUnit5多个类之间的继承关系 8.JUnit5参数化 &#xff08;1&#xff09;使用场景&#xff1a; &#xff08;2&#xff09;使用前需在pom.xml文件中导入依赖 &#xff…

海纳斯删除广告位

找到文件 vim /var/www/html/home.php 删除代码段 <div class"adleft" id"adleftContainer"><button onclick"closeAd()">关闭</button><a href"https://www.ecoo.top/ad.html" target"_blank">&l…

怀俄明探空站数据解算PWV和Tm

1. Matlab 获取代码可关注公众号WZZHHH回复&#xff08;怀俄明探空站数据解算PWV和Tm&#xff09;&#xff0c;或者咸鱼关注&#xff1a;WZZHHH123 怀俄明探空站数据解算PWV和Tm&#xff1a; 有关 Matlab 获取代码可关注公众号WZZHHH回复&#xff08;怀俄明多线程下载&#…

最新怎么订阅OnlyFans上喜欢的博主,详细教程

大家好&#xff0c;本文教大家如何用虚拟信用卡在 Onlyfans 订阅&#xff0c;链接在浏览器打开地址https://bewildcard.com/i/GPT310&#xff0c;虚拟卡开好之后&#xff0c;用支付宝充值就可以进行订阅OnlyFans平台的博主了。 什么是OnlyFans&#xff1f; OnlyFans 是一个提…

毅速解析:金属3D打印模具工件性能如何?

3D打印技术&#xff0c;在模具随形水路、异形模具制造以及模具排气结构等方面的独特优势&#xff0c;已成为模具升级的重要技术方向&#xff0c;并受到众多注塑、压铸等模具行业的青睐。 然而&#xff0c;面对这一新兴技术&#xff0c;不少人不免心生疑虑&#xff1a;3D打印技术…

【c++练习】求3个长方柱的体积

【问题描述】编写一个基于对象数组的程序&#xff0c;用成员函数实现多个功能&#xff0c;求3个长方柱的体积。要求用成员函数实现以下功能&#xff1a; 1、由键盘分别输入3个长方柱的长、宽、高&#xff1b; 2、计算长方柱的体积&#xff1b; 3、输出3个长方柱的体积。 【…

MySQL基础【语句执行顺序】

一个SQL语句它的执行顺序对于我们思考题意有着很重要的关系 题意就是&#xff1a;找出哪些只逛超市不买单的人&#xff08;买单0元也算哦&#xff0c;可能是使用的是代金券吧&#xff09; 看到此题关键找出两个数据 参观过的人 和 买单的人 他们的差就是白嫖的人&#xff08;支…

C语言分支语句

一、什么是语句 C语句可分为以下五类&#xff1a; 表达式语句 函数调用语句 控制语句 复合语句 空语句 本周后面介绍的是控制语句。 控制语句用于控制程序的执行流程&#xff0c;以实现程序的各种结构方式&#xff0c;它们由特定的语句定义符组成&#xff0c;C语 言有…

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

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

什么是MQ ?为什么用MQ?

什么是MQ&#xff1f; MQ(message queue)&#xff08;消息队列&#xff09;&#xff0c;从字面意思上看&#xff0c;本质是个队列&#xff0c;FIFO先入先出&#xff0c;只不过队列中存放的内容是message而已&#xff0c;还是一种跨进程的通信机制&#xff0c;用于上下游传递消息…

春招-实战项目冲刺直播课

春招-实战项目冲刺直播课 CCtalk 丰富多元的综合内容平台-专业的知识分享与在线教育平台https://www.cctalk.com/m/group/91161801

解决win7作为虚拟机无法复制粘贴共享文件的问题

win7作为虚拟机经常会出现无法与主机的剪切板共享、文件共享。 归根结底是win7虚拟机里面没有安装VMware Tools 能够成功安装vmware tools的条件&#xff1a; 1&#xff09;win7版本为win7 sp1及以上 2&#xff09;安装KB4490628&#xff0c;KB4474419补丁 因此下面来详细介绍…

QA测试开发工程师面试题满分问答9: Python中内存管理的概念、原理、使用

概念原理 Python中的内存管理是由解释器自动处理的&#xff0c;它使用引用计数和垃圾回收机制来管理内存。以下是Python内存管理的一些关键概念、设计原理和最佳实践&#xff0c;以帮助您高效使用和管理内存&#xff1a; 引用计数&#xff1a;Python使用引用计数来追踪对象的引…

c++的学习之路:8、内存管理与模板

一、 C/C内存分布 首先在c语言的动态内存管理中我知道了代码是如何存储数据的&#xff0c;然后c是根据c语言底层变化来的&#xff0c;那么c语言的内存管理就是适用c的内存管理&#xff0c;在c语言中程序是分为几个部分存储&#xff0c;例如在栈堆等等&#xff0c;他们的分布如…

解决 macOS 系统向日葵远程控制鼠标、键盘无法点击的问题

解决 macOS 系统向日葵远程控制鼠标\键盘无法点击的问题 1、首先正常配置&#xff0c;在系统偏好设置 - 安全性与隐私内&#xff0c;将屏幕录制、文件和文件夹、完全的磁盘访问权限、辅助功能全部都加入向日葵客户端 2、通过打开的文件访达&#xff0c;使用command shift G…

c++ Constraints 和 concepts介绍

C++20 引入了 Concepts,以改进模板编程的体验。Concepts 是一种用于模板编程的新机制,它允许程序员在编译时对模板参数进行约束和限制,从而提高模板的可读性、可维护性和错误检测能力。 Constraints(约束)是 Concepts 的一部分,它定义了模板参数必须满足的条件。一个约束…