当我们使用参数化构造函数时它会给出错误,但是当我们使用默认构造函数时它没有给出任何错误,为什么?
import java.io.*;
public class PrimeGenerator
{
final int a;
PrimeGenerator(PrimeGenerator r)
{
r.a=10;
}
public static void main(String rgs[])
{
PrimeGenerator ab= new PrimeGenerator(ab);
System.out.println(ab.a);
}
}
答案 0 :(得分:3)
ab
未初始化。
PrimeGenerator ab = new PrimeGenerator(ab);
您需要先初始化PrimeGenerator
然后再转到构造函数。
我不完全确定你的目标是什么,但正如Rudi所说,你需要在构造函数完成之前初始化最终变量。
以下是您要解决的问题的可能解决方案:在作为参数传递和最终初始化之前进行初始化。
public class PrimeGenerator{
final int a;
PrimeGenerator(){
a = 10;
}
PrimeGenerator(PrimeGenerator r){
a = r.a;
}
public static void main(String args[]){
PrimeGenerator ab = new PrimeGenerator();
PrimeGenerator cd = new PrimeGenerator(ab);
System.out.println(ab.a);
System.out.println(cd.a);
}
}
注意:接受的约定是在main
args
中命名String []。
答案 1 :(得分:2)
您的一个问题是因为您的类变量a
被声明为final
。
必须在构造函数完成运行之前初始化final
变量。您之所以没有这样做,是因为您正在尝试初始化解析为构造函数的a
的{{1}}变量而不是PrimeGenerator
中的a
变量this
。
另外,正如Andrew_CS所指出的那样,您尚未在尝试将其解析为构造函数之前初始化PrimeGenerator
变量。
答案 2 :(得分:0)
您的变量a
是最终的,这意味着您只能在创建时设置其值一次。因此,r.a=10;
将失败,因为无法设置两次。
此外,由于尚未创建对象,因此无法将对象发送给自身。
答案 3 :(得分:0)
您将对象添加为您创建的参数。那是行不通的:
PrimeGenerator ab= new PrimeGenerator(ab);
使用默认构造函数。
PrimeGenerator()
{
a=10;
}