Java 在超类构造函数的超级调用中使用子类方法作为参数
在下面的代码中,我试图调用RandomLetterChooser子类构造函数中的RandomStringChooser构造函数 为了将数组作为参数传递,我在super()中调用getSingleLetters方法。但是,我得到了以下错误: “在调用超类构造函数之前无法引用此” 在getSingleLetters(子类的第三行)中,箭头指向“g” 这是为什么?我应该如何解决 仅供参考:这是我试图解决1.b。美联社《计算机科学》2016年FRQ()。 他们的解决方案()涉及一个ArrayList(或List,我不完全确定这两者之间的区别),我意识到这要干净得多,但仍然以与下面相同的方式调用getSingleLetters方法(因此在运行时应该会有相同的错误)Java 在超类构造函数的超级调用中使用子类方法作为参数,java,constructor,super,Java,Constructor,Super,在下面的代码中,我试图调用RandomLetterChooser子类构造函数中的RandomStringChooser构造函数 为了将数组作为参数传递,我在super()中调用getSingleLetters方法。但是,我得到了以下错误: “在调用超类构造函数之前无法引用此” 在getSingleLetters(子类的第三行)中,箭头指向“g” 这是为什么?我应该如何解决 仅供参考:这是我试图解决1.b。美联社《计算机科学》2016年FRQ()。 他们的解决方案()涉及一个ArrayList(或
类随机字符串选择器{
私有整数长度;
私有整数计数=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
}