Java 在自己的类中实例化对象
这是我的第一个问题。我是一名校友。我们的学生和老师给了我们一些问题要解决 他基本上要求我们创建2个Java 在自己的类中实例化对象,java,Java,这是我的第一个问题。我是一名校友。我们的学生和老师给了我们一些问题要解决 他基本上要求我们创建2个类;其中一个应该包含2个重载的构造函数和一些有关数据封装的方法,另一个应该是主类。我们的工作是使用主类中的方法“控制”主类中的第一个类。他还提到,我们应该在类之间传递一些原语和引用类型变量的值。我写了一些代码,但是在初始化包含构造函数的类时,出现了一个堆栈溢出错误。据我所知,当你做递归时,你会得到这个错误,但我不知道我在做什么 这是我编写的构造函数类(很抱歉我的名字不好,但因为它只是作业,我没有考虑
类
;其中一个应该包含2个重载的构造函数
和一些有关数据封装的方法
,另一个应该是主类
。我们的工作是使用主类中的方法“控制”主类中的第一个类。他还提到,我们应该在类之间传递一些原语
和引用类型变量的值。我写了一些代码,但是在初始化包含构造函数的类时,出现了一个堆栈溢出错误。据我所知,当你做递归时,你会得到这个错误,但我不知道我在做什么
这是我编写的构造函数类(很抱歉我的名字不好,但因为它只是作业,我没有考虑我的名字):
编辑:这是我得到的错误:
线程“main”java.lang.StackOverflower中的异常位于
ConstructorClass.(ConstructorClass.java:19)
第19行是:
public ConstructorClass obj1= new ConstructorClass("abc");
你得到这个是因为你基本上得到了以下几点:
public class ConstructorClass {
//Objects
public ConstructorClass obj1= new ConstructorClass("abc");
public ConstructorClass obj2= new ConstructorClass(1);
}
这是一种隐藏的递归形式
这大致相当于写作
public class ConstructorClass {
public ConstructorClass(int a) {
public ConstructorClass obj1= new ConstructorClass("abc");
public ConstructorClass obj2= new ConstructorClass(1);
...
}
...
}
i、 e.从每个构造函数调用构造函数
另请参见-尽管此处未明确提及,但其中关于“实例初始值设定项块”的内容也适用于使用final方法初始化实例字段,这就是您在此处所做的:
Java编译器将初始值设定项块复制到每个构造函数中
详情载于:
如果声明符用于实例变量(即非静态字段),则以下规则适用于其初始值设定项:无论何时实例化一个
构造函数类
,都要实例化它的两个成员,obj1
和obj2
。这些成员本身就是ConstructorClass
es,因此它们每个都有obj1
和obj2
成员,这些成员也会被实例化,依此类推,直到出现stackoverflowerrror
失败
我不确定为什么您有这两个成员(即,我看不出它们的需求),但如果您真的需要它们,您应该将它们放在不同的上下文中(例如,作为
静态成员,作为某些方法中的局部变量,等等)由于在类级别本身创建了以下两个对象,因此出现getting stackoverflow错误:
public ConstructorClass obj1= new ConstructorClass("abc");
public ConstructorClass obj2= new ConstructorClass(1);
以下代码可能适合您:
public class ConstructorClass {
//Fields
private String str;
private int integer;
//Constructors
public ConstructorClass(String a) {
str= a;
}
public ConstructorClass(int a) {
integer= a;
}
//Methods
public int getInteger() {
return this.integer;
}
public String getString() {
return this.str;
}
public ConstructorClass getObj1() {
ConstructorClass obj= new ConstructorClass("");
obj.str= new ConstructorClass("abc").str;
return obj;
}
public ConstructorClass getObj2() {
return new ConstructorClass(1);
}
}
class ConstructorExample{
public static void main(String[] args) {
new ConstructorClass("");
}
}
注:
如果您想在类中实现封装,请确保为变量str
和integer
设置了getter和setter方法,因为部分由于这些行,类被递归实例化,Stackoverflow即将出现
//Objects
public ConstructorClass obj1= new ConstructorClass("abc");
public ConstructorClass obj2= new ConstructorClass(1);
删除以上两行问题将消失。您将得到一个编译问题,应该很容易解决
内部发生的事情是,假设您试图从您的主类使用
ConstructorClass cc = new ConstructorClass("string");
现在将使用第一个构造函数。然后将创建实例字段。实例字段创建还调用构造函数。构造函数将再次创建在此处输入代码
e实例字段。这种循环持续不断,导致了一些问题
你需要了解类是如何被加载的,以及它是如何被创建的。如果您尝试使用实例块或静态块,将为您增加更多的复杂性/学习。以下是固定代码,并实施了以下更改:
从ConstructorClass中删除循环调用
(试图实例化自身的对象方法)
在ConstructorClass中引入setInteger()和setString()方法来设置其私有数据成员的值
从MainClass实例化ConstructorClass对象
从main类调用ConstructorClass的setInteger()和setString()方法
工作代码:
// File name: MainClass.java
class ConstructorClass {
//Fields
private String str;
private int integer;
//Constructors
public ConstructorClass(String a) {
str = a;
}
public ConstructorClass(int a) {
integer = a;
}
//Methods
public int getInteger() {
return this.integer;
}
public String getString() {
return this.str;
}
public void setInteger(int a) {
integer = a;
}
public void setString(String a) {
str = a;
}
}
public class MainClass {
//Objects
ConstructorClass obj1;
ConstructorClass obj2;
public MainClass() {
obj1 = new ConstructorClass("abc");
obj2 = new ConstructorClass(1);
}
public ConstructorClass getObj1() {
ConstructorClass obj = new ConstructorClass("");
obj.setInteger(100);
obj.setString("Hello! How are you doing?");
return obj;
}
public ConstructorClass getObj2() {
return obj2;
}
public static void main(String[] args) {
MainClass mc = new MainClass();
System.out.println("obj1 - integer = " + mc.getObj1().getInteger());
System.out.println("obj1 - string = " + mc.getObj1().getString());
System.out.println("obj2 - integer = " + mc.getObj2().getInteger());
System.out.println("obj2 - string = " + mc.getObj2().getString());
}
}
> javac MainClass.java
> java MainClass
obj1 - integer = 100
obj1 - string = Hello! How are you doing?
obj2 - integer = 1
obj2 - string = null
输出:
// File name: MainClass.java
class ConstructorClass {
//Fields
private String str;
private int integer;
//Constructors
public ConstructorClass(String a) {
str = a;
}
public ConstructorClass(int a) {
integer = a;
}
//Methods
public int getInteger() {
return this.integer;
}
public String getString() {
return this.str;
}
public void setInteger(int a) {
integer = a;
}
public void setString(String a) {
str = a;
}
}
public class MainClass {
//Objects
ConstructorClass obj1;
ConstructorClass obj2;
public MainClass() {
obj1 = new ConstructorClass("abc");
obj2 = new ConstructorClass(1);
}
public ConstructorClass getObj1() {
ConstructorClass obj = new ConstructorClass("");
obj.setInteger(100);
obj.setString("Hello! How are you doing?");
return obj;
}
public ConstructorClass getObj2() {
return obj2;
}
public static void main(String[] args) {
MainClass mc = new MainClass();
System.out.println("obj1 - integer = " + mc.getObj1().getInteger());
System.out.println("obj1 - string = " + mc.getObj1().getString());
System.out.println("obj2 - integer = " + mc.getObj2().getInteger());
System.out.println("obj2 - string = " + mc.getObj2().getString());
}
}
> javac MainClass.java
> java MainClass
obj1 - integer = 100
obj1 - string = Hello! How are you doing?
obj2 - integer = 1
obj2 - string = null
你能分享主要的课堂档案吗?谢谢,这回答了我的问题。