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前面加一个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; 
   }
    

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SV学习笔记(五)

文章目录 线程的使用程序和模块什么是线程线程的概念澄清 线程的控制fork并行线程语句块fork…joinfork…join_any等待所有衍生线程停止单个线程停止多个线程停止被多次调用的任务 线程的通信写在前面event事件通知的需求semaphore旗语mailbox信箱三种通信的比较和应用 参考资料…

免疫检查点信号转导和癌症免疫治疗(文献)

目录 基础 介绍 免疫检查点的表面调控&#xff08;细胞膜层面&#xff09; ​编辑 PD-1调节 PD-L1调节 CTLA-4 调节 检查点信号通路 关于靶点研究 展望 Immune checkpoint signaling and cancer immunotherapy - PubMed (nih.gov) 基础 【中英字幕】肿瘤免疫疗法之免…

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…

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

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

电力行业智能升级:IEC104网关在电网中的作用

IEC104是国际电工委员会&#xff08;IEC&#xff09;制定的一套用于电力自动化的通信协议。通过IEC104规约可以实现实时监测电力系统的状态、采集各种数据、控制设备的运行和保护等功能&#xff0c;为电力系统的安全稳定运行提供了重要的支持。 钡铼技术IEC104网关可实现对IEC-…

Java零基础入门-综合案例(File类+递归)

一、概述 java零基础教学也讲了一阵子了&#xff0c;从jdk安装到第一个java程序再到如今的java File类&#xff0c;递归思想等&#xff0c;不知道你们对于此教学有没有啥建议&#xff0c;毕竟看着浏览量不是很可人&#xff0c;所以在开启此篇前&#xff0c;我想统计一下&#x…

MyBatis操作数据库(1)

前言 在应用分层的学习时, 我们了解到web应用程序一般分为三层,即Controller, Service, Dao. 之前的案例中, 请求流程如下: 浏览器发起请求, 先请求Controller, Controller接受到请求后,调用Service进行业务逻辑处理, Service再调用Dao, 但是Dao层的数据是Mock的, 真实的数据…

JavaWeb后端——Mybatis

概述 Mybatis&#xff1a;Java程序来对数据库进行操作&#xff0c;一款优秀的持久层框架&#xff0c;用于简化JDBC的开发 SSM&#xff1a;SpringMVC、Spring、Mybatis 快速入门 步骤2&#xff1a;注意数据库连接的四要素 application.properties&#xff1a;springboot 的默…

pytorch 演示 tensor并行

pytorch 演示 tensor并行 一.原理二.实现代码 本文演示了tensor并行的原理。如何将二个mlp切分到多张GPU上分别计算自己的分块,最后做一次reduce。 1.为了避免中间数据产生集合通信,A矩阵只能列切分,只计算全部batch*seqlen的部分feature 2.因为上面的步骤每张GPU只有部分featu…

布隆过滤器详解及java实现

什么是布隆过滤器&#xff1f; 布隆过滤器&#xff08;Bloom Filter&#xff09;是一种数据结构&#xff0c;用于判断一个元素是否属于一个集合。它的特点是高效地判断一个元素是否可能存在于集合中&#xff0c;但是存在一定的误判率。 布隆过滤器的基本原理是使用一个位数组…

【STL学习】(4)vector的模拟

前言 本文将模拟实现vector的常用功能&#xff0c;目的在于更深入理解vector。 一、前置知识 在模拟之前先对vector的结构和常用接口学习&#xff0c;有一个大致了解。看源码&#xff0c;本文参考的源码是SGI版本的stl3.0。 技巧&#xff1a; 看源码不要一行一行的看&#xff…

Severt

severt是让我们自己写一些类,然后把这些类给加载Tomcat中&#xff0c;后续Tomcat收到HTTP请求(来自于浏览器)&#xff0c;就会执行到咱们上面写的代码.从而通过这些代码,完成一定的业务逻辑. 创建项目 此处创建的是一种新的项目的形式称为Maven项目,Maven是Java 中的一个的构建…

libVLC 音频立体声模式切换

在libVLC中&#xff0c;可以使用libvlc_audio_set_channel函数来设置音频的立体声模式。这个函数允许选择不同的音频通道&#xff0c;例如立体声、左声道、右声道、环绕声等。 /*** Set current audio channel.** \param p_mi media player* \param channel the audio channel…

Datacom HCIP笔记-路由策略与路由控制 之二

路由策略和策略的区别&#xff1f; 路由策略&#xff1a; 操作的对象是路由表条目&#xff0c; 实现路由过滤&#xff0c;从而实现访问控制&#xff0c;引入时过滤&#xff0c;发送和接收路由时过滤。 通过配置cost&#xff0c;来实现路径的控制。 策略路由&#xff1a; 对…

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

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

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

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

谷歌浏览器如何截全屏图片?

有时候想要截取浏览器全屏&#xff0c;谷歌浏览器自带截取全屏命令&#xff0c;操作步骤如下&#xff1a; 1、按住键盘的F12或者是空白处点击鼠标右键找到检查项 2、按住ctrlshiftp&#xff0c;会出现搜索框的界面 3、搜索框中输入screen&#xff0c;选中Capture full size scr…

项目架构MVC,DDD学习

写在前面 本文一起看下项目架构DDD&#xff0c;MVC相关的内容。 1&#xff1a;MVC 不管我们做什么项目&#xff0c;自己想想其实只是做了三件事&#xff0c;如下&#xff1a; 其实&#xff0c;这三件事完全在一个类中做完也可以可以正常把项目完成的&#xff0c;就像下面这…

Redis简介、常用命令

目录 一、关系数据库​​与非关系数据库​​ 1.1. 关系型数据库 1.2 非关系型数据库 1.3.关系数据库与非关系型数据库区别 1.3.1. 数据存储方式不同 1.3.2. 扩展方式不同 1.3.3.对事务性的支持不同 1.4.非关系型数据库产生背景 二、Redis 2.1.Redis简介 2.2.Redis的…

如何使用开源情报跟踪一个人?在线访问网站以及使用方法介绍

如何使用开源情报跟踪一个人&#xff1f;在线访问网站以及使用方法介绍。 开源情报&#xff08;OSINT&#xff09;是一门关于收集和分析公开可用信息的独特技艺&#xff0c;它致力于构建个人或团体的详尽档案。 这一过程中&#xff0c;信息搜集者会利用多元化的信息源&#xff…