初始化新对象时的 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 的循环对象创建。

  1. App对象创建charCreation实例对象

  2. charCreation 对象也将创建 App 对象,因为它是超级 class。[超级 class 对象在子对象之前实例化]

  3. 找到循环,继续...直到Whosebug。