我是Java和OOP的新手,这是我的问题。当我运行以下代码时,我得到了
线程“主”中的异常java.lang.StackOverflowError。
问题出在我创建对象的代码中JavaApplication1。class不会发生问题App2。如果ja在run方法内部创建对象,则代码可以正常工作。你能解释一下为什么吗?
JavaApplication1
App2
ja
package javaapplication1; public class JavaApplication1 { int i, k, j; class App2 { int i = 23; int j = 12; } App2 a2 = new App2(); JavaApplication1 ja = new JavaApplication1(); public void run() { ja.i = 10; a2.i = 26; a2.j = 18; System.out.println(i + "," + j + "'" + ja.i + "'" + a2.i + "'" + a2.j + "'" + k); } public static void main(String[] args) { int k = 24; JavaApplication1 ja1 = new JavaApplication1(); ja1.run(); ja1.i = 18; System.out.println(ja1.i + "'" + "'" + k); } }
您的类的JavaApplication1字段JavaApplication1 ja包含JavaApplication1类的另一个实例,也有自己的ja字段,包含的另一个实例JavaApplication1,依此类推。
JavaApplication1 ja
换句话说,当您创建JavaApplication1该实例的实例时,将创建其内部实例,JavaApplication1并且此内部实例将创建另一个JavaApplication1实例,该实例再次创建实例JavaApplication1…,直到堆栈已满。
因此,当您在main方法中运行此代码时
JavaApplication1 ja1 = new JavaApplication1();
这样的事情发生
+-----------------------------------------------+ ja1 -> | JavaApplication1 instance | +-----------------------------------------------+ | | | +------------------------------------+ | | ja -> | JavaApplication1 instance | | | +------------------------------------+ | | | | | | | +-------------------------+ | | | | ja -> |JavaApplication1 instance| | | | | +-------------------------| | | | | | | | | | | | ja -> .... | | | | | +-------------------------+ | | | +------------------------------------+ | +-----------------------------------------------+
无论如何,我看不到ja字段的使用位置,因此请考虑将其从代码中删除。