简体   繁体   中英

ArrayList only printing last member repeatedly

From my created array list, the result shown once I run program is always the last item of list, repeatedly.

I created two classes, one called Array_List6 and another called Data. Array_List6 is dependent upon Data.

Please see current output: https://www.dropbox.com/s/9nb3r2hr4pm4j8r/Screen%20Shot%202016-03-15%20at%2017.57.53.png?dl=0

Below is my java code.

import java.util.ArrayList;
import javax.swing.JOptionPane;

public class Array_List6 {


  public static void main(String args[]) {

  //        Data x = new Data("Fred",41);
  //        x.Print();


    // Using an Array List. 
    // Create an ArrayList of objects.

            ArrayList<Data> array_list = new ArrayList<Data>(); 

            array_list.add(new Data("Fred", 21));
            array_list.add(new Data("Joe", 43));                
            array_list.add(new Data("Zoe", 37));
            array_list.add(2, new Data("Harry", 78)); 

//     Display our objects.

            PrintDataArray(array_list);

        //conclusion: duplicating last result in array. i.e last person Harry for example is displayed 4 times instead of Fred, Jo, Zoe then Harry.

System.out.println("==================5.5=====================");   


    //5.5 - ArrayList Implementation Considerations

            //Array A
    /*-*/       ArrayList<Data> ArrayA = new ArrayList<Data>(); 

                ArrayA.add(new Data("Fred", 21));
                ArrayA.add(new Data("Joe", 43));            
                ArrayA.add(new Data("Zoe", 37));

            //ArrayB
    /*-*/       ArrayList<Data> ArrayB = new ArrayList<Data>();

                // Display our objects.

                PrintDataArray(ArrayA);
                System.out.println();   
                ArrayB = ArrayA;
                PrintDataArray(ArrayB);
                System.out.println();   
                ArrayA.remove(1);
                PrintDataArray(ArrayB);

                System.out.println("-------------------------------------");    

    /*-*/       ArrayList<Data> ArrayC = new ArrayList<Data>(); 

                ArrayC.add(new Data("Fred", 21));
                ArrayC.add(new Data("Joe", 43));            
                ArrayC.add(new Data("Zoe", 37));

                //cloning an array
                System.out.println("Cloning an array.");
                System.out.println();

    /*-*/       ArrayList<Data> ArrayD = new ArrayList<Data>();

                PrintDataArray(ArrayC);
                System.out.println();

                ArrayD = (ArrayList<Data>)ArrayC.clone();
                ArrayC.remove(1);
                PrintDataArray(ArrayC);
                System.out.println();   

                PrintDataArray(ArrayD);
                System.out.println();                                   

    //Deleting elements from ArrayA and ArrayC and displaying the elements from ArrayB and 
    //ArrayD respectively. 


            } //main



private static void PrintDataArray(ArrayList<Data> array) 
            {
                for(int i=0;i<array.size();++i)
                {
                    array.get(i).Print();
                }
            }

private static void PrintArray(int[][] array) 
            {
                for(int i=0;i<array.length;++i)
                {
                    for(int j=0;j<array[i].length;++j)
                    {
                        System.out.print(array[i][j] + " ");
                    }
                    System.out.println();
                }
            }


    }


} //class

This is the Data Class.

public class Data {

private static String name;
private static int age;
Data(String n,int a)

{
    name = n;
    age = a;
}


public static String GetName()
{
    return(name);
}


public static void SetName(String n)

{
    name = n;
}


public static int GetAge()

{
    return(age);
}

public static void SetAge(int a)

{
    age = a;
}

public static void Print()

{   
    System.out.println(("("+GetName() + "," + GetAge() +")" ));
}

}

Well your Data class just has static members. Thats the problem about it. You need instance members. A static variable is shared through all instances (it exists once per program execution). You might want to take a look at Oracles "Understanding Class Members" page. As another illustration this diagram about program memory and when it's allocated might help understanding.

Change to:

public class Data{

private String name;
private int age;

public Data(String name, int age){
this.name = name;
this.age = age;
}

public String getName(){
return this.name;
}

[... Other getters and setters...]
}

I think you've made a critical error in your Data class. Everything in it, namely name and age , is static . This means it is shared across all instances of Data objects. In fact, apart from the constructor, you have no non-static methods at all, which means that every single Data is identical, and each time you create a new one, you're actually modifying name and age for every single instance of Data .

To learn more about what this means, see I want to know the difference between static method and non-static method .

Make your members non static. When they are static they are the same for all instances of your Data class.

https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM