支付模块:27min讲了打开神秘开关
在前面讲了@Data,@NoArgsConstructor,@AllArgsConstructor
lombok技术
报错1
package com.itheima.demo; public class GoldCard extends Card { @Override public void cost(double money){ //消费八折 setMoney(getMoney()-money*0.8); //消费满200打印洗车票 if (money*0.8>=200) {printTk();} public void printTk() { System.out.println("打印洗车"); } } } 为何报错
在Java中,方法定义不能嵌套。在您提供的代码中,printTk
方法定义在 cost
方法的内部,这是不允许的,因此编译器会报错。
即:不能在函数里面写别的函数
要解决这个问题,您需要将 printTk
方法定义在 GoldCard
类的顶层,与 cost
方法同级。以下是修改后的代码:
java
复制
package com.itheima.demo;public class GoldCard extends Card {@Overridepublic void cost(double money){// 消费八折setMoney(getMoney() - money * 0.8);// 消费满200打印洗车票if (money * 0.8 >= 200) {printTk();}}// 将printTk方法移到cost方法外面,与cost方法同级public void printTk() {System.out.println("打印洗车票");}
}
这样修改后,printTk
方法就可以被 cost
方法正常调用了,而且代码结构也更加清晰。记得确保 Card
类中存在 setMoney
和 getMoney
方法,否则这段代码仍然无法编译通过。同时,请确保 printTk
方法的逻辑符合您的业务需求。
为什么无法解析符号“c”
ChatGLM
从图片中可以看到,问题出现在以下代码行:
java
复制
public static void pay(Card c)
和
java
复制
c.
错误信息指出无法解析符号 “c”。这通常是因为变量或参数没有被正确地声明或初始化。在这个上下文中,“c” 是一个参数,它应该在调用 pay
方法时传递一个有效的 Card
对象。
检查以下几点可能有助于解决问题:
-
确保
Card
类存在并且正确导入:确认Card
类已经定义并且在当前文件中正确导入了。 -
检查
pay
方法的调用:确保在调用pay
方法时传递了一个有效的Card
对象。例如:java
复制
GoldCard gd = new GoldCard("name", "phone", "card"); Test0.pay(gd); // 确保这里传递的是正确的对象类型
-
确保
GoldCard
继承自Card
:根据图片中的目录结构,GoldCard
应该继承自Card
类。确保这一点没有问题。 -
检查语法错误:有时简单的拼写错误也会导致这样的问题。确保所有括号、逗号和其他符号都正确无误。
-
调试代码:逐步运行代码,检查变量的值是否如预期那样变化。
通过这些步骤,你应该能够找到并解决无法解析符号 “c” 的问题。
用户_uBiEPA
test类:package com.itheima.demo; import java.util.Scanner; public class Test0 { public static void main(String[] args) { GoldCard gd=new GoldCard("w","139","苏",345); public static void pay(Card c) { Scanner sc=new Scanner(System.in); double money=sc.nextDouble(); } } } Card类:package com.itheima.demo; public class Card { private String name; private String phone; private double money; private String card; public String getCard() { return card; } public void setCard(String card) { this.card = card; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public double getMoney() { return money; } public void setMoney(double money) { this.money = money; } public void deposit(double money){ this.money+=money; } public void cost(double money){ this.money-=money; } public Card(String name, String phone, String card, double money) { this.name = name; this.phone = phone; this.card = card; this.money = money; } } c为何不能解析
ChatGLM
在你的 Test0.java
文件中,pay
方法被定义为静态方法,但是你在 main
方法中没有正确地调用它。静态方法的调用不需要创建类的实例,可以直接通过类名来调用。
此外,你的 GoldCard
构造函数缺少参数的类型声明,这会导致编译错误。构造函数应该明确指定每个参数的数据类型。
下面是修正后的代码:
java
复制
package com.itheima.demo;import java.util.Scanner;public class Test0 {public static void main(String[] args) {GoldCard gd = new GoldCard("W", "139", "苏", 345.0);pay(gd); // 正确调用静态方法}public static void pay(Card c) { // 静态方法Scanner sc = new Scanner(System.in);double money = sc.nextDouble();// 这里可以添加更多的支付逻辑}
}class GoldCard extends Card {public GoldCard(String name, String phone, String card, double money) {super(name, phone, card, money);}// 其他方法和逻辑...
}
请注意以下几点:
GoldCard
的构造函数现在包含了参数类型声明。pay
方法现在是静态的,因此在main
方法中直接通过类名Test0
调用它。- 我假设
GoldCard
是Card
的子类,所以使用了extends
关键字。如果你的设计不同,请相应调整。
确保你的 Card
类也正确实现了相关的属性和方法,以便 GoldCard
能够正常工作。
差不多的问题,因为不能在main里面定义函数