英文:
Why is it showing stackoverflowerror when i am trying to create an object in it's own class?
问题
package inheritance;
public class SingleInheritance {
// SingleInheritance obj=new SingleInheritance(); Why does this line is not giving any error when I am creating a class's object in its own class
public static void main(String[] args) {
Plumber rahul=new Plumber();
}
}
package inheritance;
class Plumber{
Plumber ganesh=new Plumber();
// while this one is giving the stackoverflowerror.
}
这行代码在同一个类中创建该类的对象时并不会产生错误:
SingleInheritance obj = new SingleInheritance();
但是在另一个类中创建该类的对象时会抛出堆栈溢出错误(stackoverflowerror):
Plumber ganesh = new Plumber();
我知道在自己的类中创建对象有些愚蠢,但这是我在尝试其他操作时发生的。我需要解释一下发生了什么。
英文:
package inheritance;
public class SingleInheritance {
// SingleInheritance obj=new SingleInheritance(); Why does this line is not giving any error when I am creating a class's object in it's own class
public static void main(String[] args) {
Plumber rahul=new Plumber();
}
}
package inheritance;
class Plumber{
Plumber ganesh=new Plumber();
// while this one is giving the stackoverflowerror.
}
It does not throws any error when I create the object of SingleInheritance class in it's own class but throws an error while I do the same thing in another class .
I know It is silly to create object in it's own class but this happened when I was trying to do something else. I need an explanation to what is happening .
答案1
得分: 1
你的代码问题在于类Plumber
的对象被递归地创建,并且没有终止递归的条件。
让我们看一下你的类Plumber
的内容及其实例化。
class Plumber
{
Plumber obj = new Plumber();
}
你认为在创建一个new Plumber()
对象时会发生什么?
它会实例化一个new Plumber()
并赋值给obj
,然后会在obj.obj
中再次创建一个new Plumber()
,依此类推...
当然你可以在同一个类中保留一个Plumber
对象,但在实际初始化它时需要有一个特定的流程。
class Plumber
{
Plumber obj;
public Plumber()
{
if(/*条件*/)
{
obj = new Plumber();
}
}
// 你也可以使用一些方法来实现
public void InstantiateObj()
{
obj = new Plumber();
}
}
英文:
The issue with your code is that there is recursively creation of your class Plumber
objects and no condition that will terminate it.
Let us see the contents of your class Plumber
and their instantiation.
class Plumber
{
Plumber obj = new Plumber();
}
What do you think this does on creating a new Plumber()
object.
It will instantiate a new Plumber()
to obj
, which will in return create another new Plumber()
to obj.obj
, and so on ..
You sure can keep an object a Plumber in same class, but you need to have a specific flow when you want to actually initialize it.
class Plumber
{
Plumber obj;
public Plumber()
{
if(/*condition*/)
{
obj = new Plumber();
}
}
// You can also use some methods to do so
public InstantiateObj()
{
obj = new Plumber();
}
}
答案2
得分: 1
这是因为您没有实例化 SingleInheritance
类。
以下是更改后的代码部分:
public class SingleInheritance {
SingleInheritance obj=new SingleInheritance();
public static void main(String[] args) {
Plumber rahul=new Plumber();
}
}
原因是这段代码没有创建 SingleInheritance
的新实例,因为 main
是一个静态函数。
如果您将代码更改为:
public class SingleInheritance {
SingleInheritance obj=new SingleInheritance();
public static void main(String[] args) {
SingleInheritance rahul=new SingleInheritance();
}
}
您将会得到相同的堆栈溢出异常,因为现在 main
将会实例化 SingleInheritance
。导致堆栈溢出的原因是,new Plumber()
调用了它自己的构造函数,就像其他答案中解释的那样。
英文:
This is because you are not instantiating SingleInheritance
class.
The code
public class SingleInheritance {
SingleInheritance obj=new SingleInheritance();
public static void main(String[] args) {
Plumber rahul=new Plumber();
}
}
Is not creating a new instance of SingleInheritance
because main
is a static function.
If you change your code to:
public class SingleInheritance {
SingleInheritance obj=new SingleInheritance();
public static void main(String[] args) {
SingleInheritance rahul=new SingleInheritance();
}
}
You will get the same Stackoverflow exception because now main
will instantiate SingleInheritance
. The reason you get Stackoverflow is that new Plumber()
calls its own constructor like other answers do explain.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论