Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java. Array of objects

The problem is: i have this code:

public class Component {
public Component() {
// TODO Auto-generated constructor stub
 }
 public double[] Shifts ;
 public double[][] Couplings ;

}

public class Decouplage {
 public Decouplage(double[] GroupShifts, double[][] GroupCoup) {
  AllComponents = new Component(); 
  AllComponents.Shifts = GetShifts(...blah-blah-bla...);
  AllComponents.Couplings = GetGouplings(...blah-blah-bla...);
 }

public Component AllComponents ; 
}

It works. But when I try to create an array AllComponents[10] of this class Component

 public class Decouplage {
 public Decouplage(double[] GroupShifts, double[][] GroupCoup) {
  AllComponents = new Component()[nComponents]; /////HOW MUST I PUT IN ONE LINE THE NUMBER OF ELEMENTS AND THE () FOR CONSTRUCTOR????
  for (int iCounter=0;iCounter<nComponents;iCounter++){
         AllComponents.Shifts = GetShifts(...blah-blah-bla...);
         AllComponents.Couplings = GetGouplings(...blah-blah-bla...);
  }
 }
public Component[] AllComponents ; 
}

it does not compile.

But if I ignore the constructor's ()

public class Decouplage {
 public Decouplage(double[] GroupShifts, double[][] GroupCoup) {
  AllComponents = new Component[nComponents]; /////IS IT LEGAL TO IGNORE CONSTRUCTOR, EVEN IF IT IS EMPTY????
  for (int iCounter=0;iCounter<nComponents;iCounter++){
         AllComponents.Shifts = GetShifts(...blah-blah-bla...);
         AllComponents.Couplings = GetGouplings(...blah-blah-bla...);
  }
 }
public Component[] AllComponents ; 
}

it can not resolve Shifts and Couplings as a fields...

What could you advise? Note: GetShifts() has nothing with a standard Java's getShift(). It is my own, it works well, i checked.

Thanx!

like image 722
Andrew Avatar asked Dec 09 '22 17:12

Andrew


1 Answers

There are two separate concepts here: creating an array of references, and creating instances of your class. So this line:

AllComponents = new Component[nComponents]

will create an array of Component references. Initially, all the references will be null. If you want to fill it with references to new instances, you'll have to follow that line with:

for (int i = 0; i < nComponents; i++)
{
    AllComponents[i] = new Component();
}

EDIT: To reply to the comment, AllComponents is an array - it doesn't have a concept of Shifts or Couplings. If you need to set the shifts or couplings for the new component, you should use either:

for (int i = 0; i < nComponents; i++)
{
    AllComponents[i] = new Component();
    AllComponents[i].Shifts = // Code here
    AllComponents[i].Couplings = // Code here
}

or

for (int i = 0; i < nComponents; i++)
{
    Component component = new Component();
    component.Shifts = // Code here
    component.Couplings = // Code here
    AllComponents[i] = component;
}

or add parameters to the constructor for Component to take the shifts and couplings.

I'm assuming you're a newbie at Java, by the way, and only want help on this specific problem at the moment - when you're ready to move on, it would be worth looking at Java coding conventions, and encapsulating your data more robustly. (Using public variables is generally a bad idea.)

like image 190
Jon Skeet Avatar answered Dec 12 '22 07:12

Jon Skeet