Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在自己的类中实例化对象_Java - Fatal编程技术网

Java 在自己的类中实例化对象

Java 在自己的类中实例化对象,java,Java,这是我的第一个问题。我是一名校友。我们的学生和老师给了我们一些问题要解决 他基本上要求我们创建2个类;其中一个应该包含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编译器将初始值设定项块复制到每个构造函数中

详情载于:

如果声明符用于实例变量(即非静态字段),则以下规则适用于其初始值设定项:
  • [……]
  • 在运行时,每次创建类的实例时,都会评估初始值设定项并执行赋值(§12.5)


    无论何时实例化一个
    构造函数类
    ,都要实例化它的两个成员,
    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
    

    你能分享主要的课堂档案吗?谢谢,这回答了我的问题。