我正在尝试为我在下面创建的构造函数创建一个无参数形式的构造函数。我试图编写这个构造函数。这是对的吗?
/**
* Default Constructor for Testing
*/
public void extractTokens(Scanner scanner )
throws IOException, FileNotFoundException
{
//extracts tokens from the text file
File text = new File("E:/LEWIS BC 2/java project/project 1 part 3/items_all.txt");
String toolName = scanner.next();
String itemCode = scanner.next();
String power = scanner.next();
String timesBorrowed = scanner.next();
String onLoan = scanner.next();
String cost = scanner.next();
String weight = scanner.next();
extractTokens(scanner);
// System.out.println(parts.get(1)); // "en"
}
/**
* Creates a collection of tools to be stored in a tool list
*/
public Shop( String toolName,
int power,
int timesborrowed,
boolean rechargeable,
int itemCode,
int cost,
double weight,
int toolcount,
boolean onLoan )
{
toolsList = new ArrayList<Tool>();
toolName = new String();
power = 0;
timesborrowed = 0;
rechargeable = true;
itemCode = 001;
cost = 100;
weight = 0.0;
toolCount = 0;
onLoan = true;
}
/**
* Default Constructor for Testing
*/
public Shop() {
// initialise instance variables
toolName = "Spanner";
itemCode = 001;
timesBorrowed = 0;
power = 0;
onLoan = true;
rechargeable = true;
itemCode = 001;
cost = 100;
weight = 0.0;
toolCount = 0;
}
答案 0 :(得分:2)
你犯了很多错误。首先,字段需要存在于类级别范围内。
public void extractTokens(Scanner scanner )
throws IOException, FileNotFoundException
{
//extracts tokens from the text file
File text = new File("E:/LEWIS BC 2/java project/project 1 part 3/items_all.txt");
String toolName = scanner.next();
String itemCode = scanner.next();
String power = scanner.next();
String timesBorrowed = scanner.next();
String onLoan = scanner.next();
String cost = scanner.next();
String weight = scanner.next();
extractTokens(scanner);
// System.out.println(parts.get(1)); // "en"
}
这个方法基本上什么都不做,你声明了很多方法范围变量,这些变量超出范围,因此被下一轮垃圾收集所消耗。你有其他方法可以犯同样的错误。如果您需要对字段进行操作,则需要重新参考这些字段。通过说String toolname = scanner.next()
,您声明了一个变量,该变量包含对String
类型的对象的引用,在METHOD范围内,等于scanner.next()
的值。你想要做的是在CLASS范围内声明变量,然后通过引用它们来处理它们。我强烈建议您使用this
关键字限定参考资料,这样您就可以参考当前的对象实例。
至于你的无参数public
构造函数是否写得正确,答案是是,因为你声明了一个没有返回类型的类的成员,具有相同的name为类,没有参数且public
可见性。这里有一个警告,因为你的代码有100%的机会实际上没有做你想做的事。
答案 1 :(得分:1)
一旦引入了第二个构造函数,那么您的代码可以使用两个路径来初始化对象。如果您不小心,可以引入不一致性,以便根据对象的创建方式设置不同的值。
对于您发布的代码,引入第二个构造函数似乎是不必要的,只会给您带来问题。作为测试的一部分,为测试创建对象的代码会更好,因此它可以与主代码分开。
在您确实需要其他方法来初始化对象的情况下,有一种称为构造函数链接的常见模式,旨在消除不一致初始化的机会。使用这种方法,有一个主要构造函数,以及一个或多个构建在主要构造函数上的辅助构造函数。
// primary constructor
public Foo(String p1, String p2, String p3) {
this.p1 = p1;
this.p2 = p2;
this.p3 = p3;
}
// auxiliary constructor
public Foo() {
this("firstDefault", "secondDefault", "thirdDefault");
}
主要构造函数总是被调用,其他构造函数使用各种参数调用this()
。
答案 2 :(得分:1)
这样做
/**
* Creates a collection of tools to be stored in a tool list
*/
public Shop(String toolName, int power,int timesborrowed,boolean rechargeable,
int itemCode,int cost,double weight,int toolcount,boolean onLoan) {
this.toolsList = new ArrayList<Tool>();
this.toolName = toolName;
this.power = power;
this.timesborrowed = timesborrowed;
// ... and so on ..
}
/**
* Default Constructor for Testing
*/
public Shop(){
// Call the previous defined constructor
this("Spanner", 0, 0, ... and so on ...)
}
答案 3 :(得分:0)
是的,假设所有变量都被正确声明,这是正确的。你可以有这样的构造函数:
public Shop() {}
以骰子类为例:
private num_sides;
public Dice(int sides) { this.num_sides = sides; }
public Dice() { this.num_sides = 6; } //default
非常好。