Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在超类构造函数的超级调用中使用子类方法作为参数_Java_Constructor_Super - Fatal编程技术网

Java 在超类构造函数的超级调用中使用子类方法作为参数

Java 在超类构造函数的超级调用中使用子类方法作为参数,java,constructor,super,Java,Constructor,Super,在下面的代码中,我试图调用RandomLetterChooser子类构造函数中的RandomStringChooser构造函数 为了将数组作为参数传递,我在super()中调用getSingleLetters方法。但是,我得到了以下错误: “在调用超类构造函数之前无法引用此” 在getSingleLetters(子类的第三行)中,箭头指向“g” 这是为什么?我应该如何解决 仅供参考:这是我试图解决1.b。美联社《计算机科学》2016年FRQ()。 他们的解决方案()涉及一个ArrayList(或

在下面的代码中,我试图调用RandomLetterChooser子类构造函数中的RandomStringChooser构造函数

为了将数组作为参数传递,我在super()中调用getSingleLetters方法。但是,我得到了以下错误:

“在调用超类构造函数之前无法引用此”

在getSingleLetters(子类的第三行)中,箭头指向“g”

这是为什么?我应该如何解决

仅供参考:这是我试图解决1.b。美联社《计算机科学》2016年FRQ()。 他们的解决方案()涉及一个ArrayList(或List,我不完全确定这两者之间的区别),我意识到这要干净得多,但仍然以与下面相同的方式调用getSingleLetters方法(因此在运行时应该会有相同的错误)

类随机字符串选择器{
私有整数长度;
私有整数计数=0;
私有字符串字;
私有字符串newArray[];
随机字符串选择器(字符串[]数组){
长度=数组长度;
newArray=新字符串[长度];
for(int i=0;i
这里是我运行程序的地方,以防有帮助:

public class AP2 {
    public static void main(String[] args) {
        String ball = "basketball";
        RandomLetterChooser s = new RandomLetterChooser(ball);
        for(int i = 0; i < 12; i++) {
            System.out.print(s.getNext() + " ");
        }
    }
}
公共类AP2{
公共静态void main(字符串[]args){
弦球=“篮球”;
RandomLetterChooser s=新的RandomLetterChooser(球);
对于(int i=0;i<12;i++){
System.out.print(s.getNext()+);
}
}
}
“在调用超类构造函数之前无法引用此”

在过程中调用任何实例方法(就像您正在做的那样)

或者在调用超类构造函数导致编译错误之前。

构造函数体中的显式构造函数调用语句可能 不引用任何实例变量或实例方法或内部 在此类或任何超类中声明的类,或使用此类或超类 以任何形式否则,将发生编译时错误

或者以另一种方式说,当层次结构(父类)尚未完全构建时,不能使用对象(实例字段和方法)

通过将
getSingleLetters()
方法的修饰符更改为
static
,您可以使用此代码,因为
static
方法与类的实例不关联:

 RandomLetterChooser(String str) {
    super(RandomLetterChooser.getSingleLetters(str)); //here's the problem
}
这是因为

getSingleLetters方法

在完成超类构造函数之前不能使用。实际上我的意思和异常文本一样。因此,您可以将此方法放到您的超类构造函数中,或在此处查看:


正如其他答案所解释的,这就是应该发生的事情

您可以看到,新对象的“构造”只有在该类的构造函数完全完成后才能完成,这包括超类构造函数。只有这样,才能确保对象已完全初始化


换句话说:您绝对不想做类似于示例代码的事情:避免在类仍处于初始化阶段时对其调用“real”方法

尝试将该方法设置为
static
。作业中的
getSingleLetters
方法为
static
。感谢您的回复。为了进一步澄清,为什么static会使这项工作正常?是因为静态方法不需要类的实例来运行,因此也不需要超级构造函数来完成吗?您能在不使方法私有的情况下实现这一点吗?很多时候,提供实例方法很有用,因为该方法的结果取决于对象本身。
RandomLetterChooser(String str) {
    super(getSingleLetters(str)); //here's the problem
}
 RandomLetterChooser(String str) {
    super(RandomLetterChooser.getSingleLetters(str)); //here's the problem
}