定义类强化——定义Goods类表示商品

现需要编写一个计算商品总价值的程序,现要求:
1、定义一个表示商品的类:Goods,Goods类要包含:

  • 一个私有成员变量String name表示商品的名称;
  • 一个私有成员变量float price表示商品的价格,并定义setPrice(float price)方法用于修改商品价格;
  • 一个私有成员变量int count表示商品的数量,并定义setCount(int count)方法用于修改商品数量;
  • 一个带参数的构造器:Goods(String name, float price, int count),初始化Goods对象的三个成员变量;
  • 一个方法String toString()方法,用于返回包含商品信息的字符串,该方法返回的字符串内容格式见下面的格式说以及测试用例输出;

toString方法返回格式:

"商品:商品名的单价为:单价元,数量为:数量,合计总价值:总价元";

上述返回字符串中标红色的部分为变量,其他部分为固定内容。

裁判测试类Main:

import java.util.Scanner;
public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入商品的名称、单价和数量,中间用空格分开");String name = scanner.next();float price = scanner.nextFloat();int count = scanner.nextInt();Goods goods = new Goods(name,price,count);System.out.println(goods.toString());//修改商品的单价和数量goods.setCount(100);goods.setPrice(25.5f);System.out.println(goods.toString());}
}

输入样例:

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

钢笔 20 100

输出样例:

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

 前面的代码咱们不再做讨论:

代码奉上就行:
 

class Goods
{private String name;private float price;private int count;public Goods(String name,float price,int count){this.name = name;this.price = price;this.count = count;}public void setPrice(float price){this.price = price;}public void setCount(int count){this.count = count;}
}

划重点: 

关于toString方法

toString方法,看方法名就知道与String有关。我们看一眼API文档:

不错,确实返回类型是字符串。那么,我们就借此发挥发挥:是把传入的内容变成字符串,还是就是简单的打印前面传过来的字符串

package toStringTest;public class ToStringTest {public static void main(String[] args) {int a = 3;System.out.println(a);//对照组,我们本意就是打印a的值System.out.println(a.toString());//测试}
}

结果:

 咱们idea报错了,报错内容:

怎么理解?int类型属于值类型,我们toString方法前面的对象应该是引用类型。编译器看见你给一个int类型,哎,它以为你是按着语法来给了它一个引用类型。结果没想到,你给了它一个基本值类型,人编译器自然无法解引用。

引用类型在java里面包括:类、接口、数组

那我这时候又有想法了,值类型的数组可以吗?

package toStringTest;public class ToStringTest {public static void main(String[] args) {int[] arr1 = {1,2,3,4,5};//创建一个int型的数组,并且初始化System.out.println(arr1.toString());//我们把数组名传过去,调用它的toString方法,希望能打印数组这个内容}

这次咱没报错了,又是猜一猜的环节:输出内容是什么呢?

 

 好嘛,给我们打印的是这个数组的地址。事情发展到这儿,也能理解:这c语言的数组名就是代表数组首元素的地址。这里也不例外,数组确实是引用类型,但数组名.toString()方法,是打印这个数组名,数组名->数组地址,即打印数组地址。

我们尝试让它打印元素:

好好好,报错了,说明toString()前面只能传一个引用——说地址也不过分。

那么按照上面的经验,我们知道toString()前面必然是个引用类型——我们试试

字符串

 String arr = "Labor is the most glorious.";//实例化String类System.out.println(arr);//对照组System.out.println(arr.toString());//咱们希望调用这个引用类型的toString()方法也是实现对这个字符串的打印

题外话:Everything is an object。字符串本身就是个类,它在创建对象时候是可以默认省掉new + 构造器。

不负所望

我们试着传个对象:

public class ToStringTest {public static void main(String[] args) {Print print = new Print();//System.out.println(print.d.toString());这里toString()方法前面也报错,可见紧挨着toString()也必须是个引用类型System.out.println(print.s.toString());//打印print里面的字符串成员变量System.out.println(print.toString());//和上面传个数组名具有异曲同工之妙}
}
class Print
{public String s = "abc";public double d = 3.0;
}

 我们来看看结果:

小总结:

看来,toString()方法就是打印前面的内容,返回是个字符串,传过来的得是个引用类型

万一我们想要根据需求打印内容:我们就可以在相应类里面对方法进行重写(这也叫方法重载)

咱们这笔锋一转,插叙结束,如这道题: 

 那么,想返回一个固定格式,我们可以这样:
 

public String toString(){float sum = price * count;return "商品:"+name+"的单价为:"+price+"元,数量为:"+count+",合计总价值:"+sum+"元";//返回格式,参数可以直接和字符串用+拼接}

我们可以看到这个toString方法是在Goods类里面进行重写,调用成员变量可以不用getter方法,返回的时候就是值和字符串相接,进行打印。

小总结:

toString()方法就是打印方法,前面来个引用类型对其进行调用,返回格式不满意,尽管在类里面对方法重写。

至于重写的是哪里的代码,就是我们后面要谈的父类...

完整代码参考:
 

class Goods
{private String name;private float price;private int count;public Goods(String name,float price,int count){this.name = name;this.price = price;this.count = count;}public void setPrice(float price){this.price = price;}public void setCount(int count){this.count = count;}public String toString(){float sum = price * count;return "商品:"+name+"的单价为:"+price+"元,数量为:"+count+",合计总价值:"+sum+"元";}}

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

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

相关文章

微服务(基础篇-007-RabbitMQ部署指南)

目录 05-RabbitMQ快速入门--介绍和安装_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1LQ4y127n4?p65&vd_source60a35a11f813c6dff0b76089e5e138cc 1.单机部署 1.1.下载镜像 1.2.安装MQ 2.集群部署 2.1.集群分类 2.2.设置网络 视频地址: 05-Rab…

解析商业电子邮件泄露:深度剖析攻击的含义

本文的第1部分清楚地介绍了什么是商业电子邮件泄露(BEC),检测它的方法,以及如何防御。商业电子邮件泄露第2部分:攻击的含义将讨论BEC事件是如何发生的?如果你不够小心,BEC会在很多方面对你的业务…

【力扣hot100】两数之和、字母异位词分组

【1】两数之和 public class TwoNumAddiction {public static void main(String[] args) {int[] nums {3,3};int target 6;int[] indexArr new SolutionNumAddiction().twoSum(nums, target);for (int index : indexArr) {System.out.println(index);}} }class SolutionNumA…

最优算法100例之13-输出第n个丑数

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当…

国内好用的chatGPT和AI绘图工具

分享一个比较好用的AI 分享一个比较好用的AI,只是需要开通会员,目前官网的价格是:298,开通之后可以使用chatgpt4、AI绘画、图片融合等等!不开通的话是可以免费使用15次的,下面是一些介绍图片!链…

2013年认证杯SPSSPRO杯数学建模B题(第一阶段)流行音乐发展简史全过程文档及程序

2013年认证杯SPSSPRO杯数学建模 B题 流行音乐发展简史 原题再现: 随着互联网的发展,流行音乐的主要传播媒介从传统的电台和唱片逐渐过渡到网络下载和网络电台等。网络电台需要根据收听者的已知喜好,自动推荐并播放其它音乐。由于每个人喜好…

MySQl on和where条件的区别?

MySQ L on和where条件的区别? on会生成临时表,不满足条件会置空 where 过滤数据,不满足的数据不会显示

HTTP 与 HTTPS 的区别

基本概念 HTTP(HyperText Transfer Protocol:超文本传输协议)是一种应用层协议,主要用于在网络上进行信息的传递,特别是用于Web浏览器和服务器之间的通信。 它使用明文方式发送数据,这意味着传输的内容可…

好用还平价的挂耳式耳机有哪些?五款超平价品牌测评推荐

在数字化时代,耳机已经成为我们日常生活中不可或缺的一部分。而开放式耳机作为一种新兴趋势,以其独有的开放性设计和卓越的音质表现,正在悄然改变着人们的听音习惯。不同于传统的耳机产品,开放式耳机让音乐与外界环境相得益彰&…

mysql进阶知识总结

1.存储引擎 1.1MySQL体系结构 1).连接层 最上层是一些客户端和链接服务,包含本地sock通信和大多数基于客户端/服务端工具实现的类似于TCP/IP的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证…

Python爬虫:requests模块的基本使用

学习目标: 了解 requests模块的介绍掌握 requests的基本使用掌握 response常见的属性掌握 requests.text和content的区别掌握 解决网页的解码问题掌握 requests模块发送带headers的请求掌握 requests模块发送带参数的get请求 1 为什么要重点学习requests模块&…

on-my-zsh 命令自动补全插件 zsh-autosuggestions 安装和配置

首先 Oh My Zsh 是什么? Oh My Zsh 是一款社区驱动的命令行工具,正如它的主页上说的,Oh My Zsh 是一种生活方式。它基于 zsh 命令行,提供了主题配置,插件机制,已经内置的便捷操作。给我们一种全新的方式使用命令行。…