2017-05-26 78 views
0

我写了这个代码:改变一个对象的值,也改变另一个(相同类)对象的相同的值-Java

public class ArraLists { 
    public static void main(String[] args) { 
     ArrayList<Amphitheater> amphitheaters= new ArrayList<Amphitheater>(); 

      Amphitheater a1 = new Amphitheater("Amph 2"); 
      Amphitheater a2 = new Amphitheater("Amph 3"); 
      Amphitheater a3 = new Amphitheater("Amph 8"); 
      Amphitheater a4 = new Amphitheater("Amph 9"); 
      Amphitheater a5 = new Amphitheater("Amph 11"); 
      Amphitheater a6 = new Amphitheater("Amph 10"); 
      Amphitheater a7 = new Amphitheater("Amph 12"); 
      Amphitheater a8 = new Amphitheater("Amph 13"); 

      Course cC1 = new Course("Math","M123"); 

      amphitheaters.add(a1); 
      amphitheaters.add(a2); 
      amphitheaters.add(a3); 
      amphitheaters.add(a4); 
      amphitheaters.add(a5); 
      amphitheaters.add(a6); 
      amphitheaters.add(a7); 
      amphitheaters.add(a8); 

      DateExamination d1= new DateExamination("03 May",amphitheaters); 
      DateExamination d2= new DateExamination("04 May",amphitheaters); 

      ArrayList<Amphitheater> amph1= d1.getAmphitheaters(); 
      ArrayList<Amphitheater> amph2= d2.getAmphitheaters(); 

      amph2.get(1).addCourse(1,cC1); 

      System.out.println("Amphitheaters of D1"); 
      for(Amphitheater a: amph1) { 
       System.out.println(a.getName()); 
       System.out.println(a.getAvailableHours()); 
      } 

      System.out.println("Amphitheaters of D2"); 

      for(Amphitheater a: amph2) { 
       System.out.println(a.getName()); 
       System.out.println(a.getAvailableHours()); 
      } 

      System.out.println("\n\nList of Amphitheaters that I created in Main."); 

      for(Amphitheater a: amphitheaters) { 
       System.out.println(a.getName()); 
       System.out.println(a.getAvailableHours()); 
      } 
     } 
} 


public class Course { 

    private String name; 
    private String id; 

    private ArrayList<Amphitheater> amphitheaters= new ArrayList<Amphitheater>(); 
    private ArrayList<Integer> hours= new ArrayList<Integer>(); 

    public Course(String name, String id){ 
     this.name=name; 
     this.id=id; 
    } 

    public void addAmphitheater(Amphitheater amphitheater,int hour){ 
     amphitheaters.add(amphitheater); 
     hours.add(hour); 
    } 
} 




public class Amphitheater{ 

    private String name; 
    private HashMap<Integer,Boolean> availableHours=new HashMap<Integer,Boolean>(); //Hour,Available 
    private HashMap<Integer,Course> courses= new HashMap<Integer,Course>(); //Hour,Course 

    public Amphitheater(String name){ 
     this.name=name; 
     for(int i=0; i<5; i++){ 
      availableHours.put(i,true); 
      courses.put(i,null); 
     } 
    } 
    public boolean isHourAvailable(Integer hour){ 
     return availableHours.get(hour); 
    } 

    public ArrayList<Integer> getAvailableHours(){ 
     ArrayList<Integer> avHours= new ArrayList<Integer>(); 
     for(int i=0; i<5; i++){ 
      if(availableHours.get(i)) 
       avHours.add(i); 
      } 
      return avHours; 
     } 

    public void addCourse(Integer hour,Course course){ 
     courses.put(hour,course); 
     availableHours.put(hour, false); 
     course.addAmphitheater(this,hour); 

    } 

    public void setName(String name){ 
     this.name=name; 
    } 

    public String getName(){ 
     return name; 
    } 

} 






public class DateExamination{ 

    private ArrayList<Amphitheater> amphitheaters; 
    private String name; 

    public DateExamination(String name,ArrayList<Amphitheater> amphitheaters) { 
     this.name=name; 
     this.amphitheaters=amphitheaters; 
    } 

    public ArrayList<Amphitheater> getAmphitheaters(){ 
     return amphitheaters; 
    } 

} 

我作为参数传递到DateExamination对象ArrayList与竞技场。

的问题是,当我改变的值的d1DateExamination)的圆形剧场,自动相同的值被改变为的d2DateExamination)的竞技场。

此外,我在Main中创建的ArrayList已更改。我认为所有的ArrayList都提到了相同的对象,但我真的不明白。

我希望DateExamination的每个对象有一个ArrayList圆形剧场,它将独立于其他圆形剧场。

我也尝试通过这个ArrayList作为参数,但没有结果。

+0

不知道这是否会算作重复问题,但请查看https://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value – Zircon

+0

另请参阅[陷阱:在stackoverflow文档中将变量看作对象](https://stackoverflow.com/documentation/java/4388/common-java-pitfalls/24130)。 –

回答

0

这是因为它们都具有相同的对象,您需要改为创建每个对象的新实例。

ArrayList<Amphitheater> amphitheaters= new ArrayList<>(); 
    ArrayList<Amphitheater> amphitheaters1= new ArrayList<>(); 

    Course cC1 = new Course("Math","M123"); 

    amphitheaters.add(new Amphitheater("Amph 2")); 
    amphitheaters.add(new Amphitheater("Amph 3")); 
    amphitheaters.add(new Amphitheater("Amph 8")); 
    amphitheaters.add(new Amphitheater("Amph 9")); 
    amphitheaters.add(new Amphitheater("Amph 11")); 
    amphitheaters.add(new Amphitheater("Amph 10")); 
    amphitheaters.add(new Amphitheater("Amph 12")); 
    amphitheaters.add(new Amphitheater("Amph 13")); 

    amphitheaters1.add(new Amphitheater("Amph 2")); 
    amphitheaters1.add(new Amphitheater("Amph 3")); 
    amphitheaters1.add(new Amphitheater("Amph 8")); 
    amphitheaters1.add(new Amphitheater("Amph 9")); 
    amphitheaters1.add(new Amphitheater("Amph 11")); 
    amphitheaters1.add(new Amphitheater("Amph 10")); 
    amphitheaters1.add(new Amphitheater("Amph 12")); 
    amphitheaters1.add(new Amphitheater("Amph 13")); 



    DateExamination d1= new DateExamination("03 May", new ArrayList<>(amphitheaters)); 
    DateExamination d2= new DateExamination("04 May", new ArrayList<>(amphitheaters1)); 

这是一个肮脏的黑客来解决它,但它会适用于你的情况,如果那只是你需要这一次。

+0

这不仅是一次。我希望每次用户想要“创建”一个对象DateExamination时,都会自动获得这个ArrayList的这个对象。为了简单起见,我是这样写的。无论如何,谢谢! – OrestisNer

相关问题