初始化数组和构造函数不起作用

时间:2019-11-14 15:06:14

标签: java oop parameters constructor

我想将ConcreteSubject类中的构造函数ConcreteSubject调用为main。我正在尝试与构造函数一起创建数组,该构造函数接受in作为初始化数组的参数。所以我不确定丢失了什么/错了。

public class ConcreteSubject extends AbstractSubject {
    public int arySize;

    private AbstractSpy[] spies;

    public ConcreteSubject(int a) {
        arySize = a;
        spies = new AbstractSpy[a];
    }

    @Override
    void notifySpies() {

    }

    @Override
    public void addSpy(AbstractSpy spy) {

    }
}

public class TestSpies {
    public static void main(String[] args) {
        // this is where there is something wrong as it whats another constructor created.
        ConcreteSubject cs = new ConcreteSubject();
        AbstractSpy spy = new ConcreteSpy();
        AbstractSpy[] spies = new AbstractSpy[10];
        cs.addSpy(spy);
    }
}

5 个答案:

答案 0 :(得分:3)

您如下定义了构造函数,并具有一个int参数:

public ConcreteSubject(int a) {
…
}

这意味着在调用它时,您需要传递一个int参数,例如:

ConcreteSubject cs = new ConcreteSubject(5); 

答案 1 :(得分:3)

在为类创建构造函数时,java不会为您提供默认的构造函数。然后您就可以使用ConcreteSubject cs = new ConcreteSubject()来初始化您的对象

有2种解决方案来初始化数组:

  1. 在类ConcreteSubject中创建默认构造函数

    public ConcreteSubject(){

    } 
    

然后初始化数组`

cs.arySize= x //whatever value you want`
cs.spies = new new AbstractSpy[a];
  1. 或者您必须像下面这样初始化对象:

    ConcreteSubject cs =新的ConcreteSubject(x); //您想要什么值

答案 2 :(得分:2)

ConcreteSubject类没有默认构造函数。仅有一个具有int参数的构造函数:

public ConcreteSubject(int a) {
//    ...
}

并且您必须将int参数传递给该构造函数的调用。 因此,呼叫应如下所示:

int x = ...
new ConcreteSubject(x);

答案 3 :(得分:1)

有两种方法可以解决此问题:

A。在ConcreteSubject类中创建非参数化的构造函数

public ConcreteSubject() {
    //Initialize the variables with default values
}

B。或者,在ConcreteSubject cs = new ConcreteSubject(10);方法中使用ConcreteSubject cs = new ConcreteSubject();代替main

答案 4 :(得分:1)

如果不创建构造函数,java将自动创建默认构造函数。但是,如果创建的不是默认值,例如使用int参数创建的值,则必须自行创建默认的构造函数(如果需要),因为在这种情况下java不会创建默认的构造函数。