现需要编写一个计算商品总价值的程序,现要求:
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+"元";
}
}