import java.util.ArrayList;
public class Finance {
ArrayList<String> title = new ArrayList<String>();
ArrayList<Double> moneySpent = new ArrayList<Double>();
Scanner input = new Scanner(System.in);
public Finance(ArrayList<String> title, ArrayList<Double> moneySpent){
this.title = title;
this.moneySpent = moneySpent;
System.out.println(title);
System.out.println(moneySpent);
}
public static void main(String[] args){
Finance entertainment = new Finance(title.add("Movies"), moneySpent.add(1));
}
当我运行这段代码时,我发现有两个错误。
File: D:\Java Programs\Finance.java [行数: 19] Error: Cannot make astatic reference to the non-static field title: 不能对非静态字段title做静态引用
File: D:\JavaPrograms/Finance.java [行:19] Error: 不能对非静态字段moneySpent做静态引用。
虽然你的重点是在创建一个实例 Finance
有几个概念我想请大家探讨一下。
首先,为了回答你的问题,我想说的是 Finance
的构造者签名,定义了合同中的 Finance
oject成为一个实例。它期望有两个参数,每个参数都属于 ArrayList
类型.要创建一个 Finance
你必须创建两个数组,一个由字符串组成,另一个由Doubles组成。在这一线 你有很多关于如何初始化数组的想法。
一个例子可以是:
new Finance(new ArrayList<>(List.of("Movies")), new ArrayList<>(List.of(1.0)));
接下来,我想把你的意识拖到你代码中的这个表达式上。
title.add("Movies")
title
是你想在你的构造函数中初始化的东西 虽然像你这样把它初始化成一个空的ArrayList并不是一个坏主意, 但在其中添加一个元素然后传给你的构造函数让它改变同一个实例对象是没有意义的.
接下来,我想把你的意识拖到你所使用的类型上:在我个人看来,我会使用java的 List
界面 当声明变量时,使用复数来命名任何对象的集合,在你的例子中,请使用 ArrayList
作为 List
接口实现类。例如:
List<String> titles;
// and
List<Double> expenses;
构造函数上也一样。
public Finance(List<String> titles, List<Double> expenses) {
//...init variables here
}
注意,我把 moneySpent
到 expenses
. 我这样做,是因为一个钱花在多个时刻 它更有可能是费用和 moneySpent
将是单次花费的金额。
应用单一责任制,我将重构创建一个。Finance
实例到一个separete(静态。为什么是静态的?)方法。
public class Finance {
List<String> titles;
List<Double> expenses;
Scanner input = new Scanner(System.in);
public Finance(List<String> titles, List<Double> expenses) {
this.titles = titles;
this.expenses = expenses;
System.out.println(this.titles);
System.out.println(this.expenses);
}
public static void main(String[] args) {
Finance entertainment = createFinance();
}
private static Finance createFinance() {
return new Finance(
new ArrayList<>(List.of("Movies")),
new ArrayList<>(List.of(1.0)));
}
}
最后,考虑在测试的指导下驱动你的实现。我可以推荐。TDD的例子, GOOS 和 Jason Gorman的TDD书