初始化新对象时的 StackOverflow
StackOverflow when initializing new object
我不知道为什么会这样,它似乎在创建新对象和初始化它之间不断循环
public class App {
Character hero = new Character();
charCreation charCreation = new charCreation();
public static void main(String [] args){
App app = new App();
app.run();
}
void run(){
charCreation.charCreate();
}
}
所以这里 App 创建了一个新的 charCreation 对象,就是这个
import java.util.Scanner;
class charCreation extends App {
Scanner skan = new Scanner(System.in);
protected void charCreate(){
......
这是错误
Exception in thread "main" java.lang.WhosebugError
at charCreation.(charCreation.java:3)
at App.(App.java:5)
at charCreation.(charCreation.java:3)
at App.(App.java:5)
......
它一直在继续
当您创建 CharCreation
的实例时(为您修复了 CamelCase),它还将初始化从其超类 App
继承的所有内容(调用超类构造函数,初始化所有实例字段等).其中一部分是创建 CharCreation
的另一个实例(以及 Character
的实例)。
无限循环。
也许您想从 App
中删除该实例字段并使其成为 run
中的局部变量。
您有一个 App
class,其字段类型为 CharCreation
。
CharCreation
扩展了App
,所以当你初始化一个CharCreation
对象时,它会初始化字段charCreation
。因此,当 charCreation
字段被初始化时,它将初始化一个新的 CharCreation
对象,依此类推。
这基本上是您必须解决的设计问题,我认为您 CharCreation
class 不应该扩展 App
class 和 charCreate
应该 return 一个 Character
.
public class App {
Character hero = new Character();
CharCreation charCreation = new charCreation();
void run(){
hero = charCreation.charCreate();
}
}
public class CharCreation {
public Character charCreate() {
/* creates and returns the hero */
}
}
旁注:
- 始终使用第一个大写字母命名您的 class 以匹配 java 约定,
CharCreation
而不是 charCreation
。
- 不要用
Character
来命名一个class,它是一个已经存在于JDK中的class(char
的对象对应物) ).
charCreation
class 扩展了 App
所以要创建它需要调用 superclass (App
) 的构造函数。要构造 App
superclass,需要构造 App
的字段,包括 new charCreation()
- 所以它会循环。
您需要将新 charCreation
对象的创建与 App
实例的创建分离。
导致 Whosebug 的循环对象创建。
App对象创建charCreation实例对象
charCreation 对象也将创建 App 对象,因为它是超级 class。[超级 class 对象在子对象之前实例化]
找到循环,继续...直到Whosebug。
我不知道为什么会这样,它似乎在创建新对象和初始化它之间不断循环
public class App {
Character hero = new Character();
charCreation charCreation = new charCreation();
public static void main(String [] args){
App app = new App();
app.run();
}
void run(){
charCreation.charCreate();
}
}
所以这里 App 创建了一个新的 charCreation 对象,就是这个
import java.util.Scanner;
class charCreation extends App {
Scanner skan = new Scanner(System.in);
protected void charCreate(){
......
这是错误
Exception in thread "main" java.lang.WhosebugError
at charCreation.(charCreation.java:3)
at App.(App.java:5)
at charCreation.(charCreation.java:3)
at App.(App.java:5)
......
它一直在继续
当您创建 CharCreation
的实例时(为您修复了 CamelCase),它还将初始化从其超类 App
继承的所有内容(调用超类构造函数,初始化所有实例字段等).其中一部分是创建 CharCreation
的另一个实例(以及 Character
的实例)。
无限循环。
也许您想从 App
中删除该实例字段并使其成为 run
中的局部变量。
您有一个 App
class,其字段类型为 CharCreation
。
CharCreation
扩展了App
,所以当你初始化一个CharCreation
对象时,它会初始化字段charCreation
。因此,当 charCreation
字段被初始化时,它将初始化一个新的 CharCreation
对象,依此类推。
这基本上是您必须解决的设计问题,我认为您 CharCreation
class 不应该扩展 App
class 和 charCreate
应该 return 一个 Character
.
public class App {
Character hero = new Character();
CharCreation charCreation = new charCreation();
void run(){
hero = charCreation.charCreate();
}
}
public class CharCreation {
public Character charCreate() {
/* creates and returns the hero */
}
}
旁注:
- 始终使用第一个大写字母命名您的 class 以匹配 java 约定,
CharCreation
而不是charCreation
。 - 不要用
Character
来命名一个class,它是一个已经存在于JDK中的class(char
的对象对应物) ).
charCreation
class 扩展了 App
所以要创建它需要调用 superclass (App
) 的构造函数。要构造 App
superclass,需要构造 App
的字段,包括 new charCreation()
- 所以它会循环。
您需要将新 charCreation
对象的创建与 App
实例的创建分离。
导致 Whosebug 的循环对象创建。
App对象创建charCreation实例对象
charCreation 对象也将创建 App 对象,因为它是超级 class。[超级 class 对象在子对象之前实例化]
找到循环,继续...直到Whosebug。