2017-03-02 36 views
0

我有一個小問題,我的實例變量有點作爲類變量,至少這就是我的想法。2實例變量不斷更新對方

public class Lab10 { 
    public static void main(String[] args) { 
     CannonSolution MaxRange = MAXRMHC(10); 
     MaxRange.println(); 
    } 

    public static CannonSolution MAXRMHC(int iter){ 
     double range =0; 
     double newrange; 
     CannonSolution sol = new CannonSolution(1,1); 
     CannonSolution NewSol = new CannonSolution(sol.SendCanang(),sol.SendCanvel()); 
     range = Cannon.GetMaxRange(sol.SendCanang(),sol.SendCanvel()); 
     for(int i =0;i<iter;i++){ 
      NewSol.smallChange(); 
      newrange = Cannon.GetMaxRange(NewSol.SendCanang(), NewSol.SendCanvel()); 
      if(range <= newrange){ 
       System.out.println(range+" is smaller than "+newrange); 
       NewSol.println(); 
       range = newrange; 
       sol = NewSol; 
      }else if (range > newrange){ 
       NewSol.println(); 
       sol.println(); 
      }else{ 
       System.out.println("I don't work"); 
      } 
     } 
     System.out.println(); 
     System.out.println(range); 
     return (sol); 
    } 
} 


public class CannonSolution { 


    private double canang; 
    private double canvel; 

    public CannonSolution(double ang, double vel){ 

     if(ang <25.0 || ang >55.0){ 
      canang = Randomang(); 
     }else{ 
      canang = ang; 
     } 
     if(vel <1500.0 || vel > 1650.0){ 
      canvel = Randomvel(); 
     }else{ 
      canvel = vel; 
     } 
    } 
    public double SendCanang(){ 
     return (canang); 
    } 
    public double SendCanvel(){ 
     return (canvel); 
    } 

    private static double Randomang(){ 
     double ang = RandomNumber.RandomNum(25,55); 
     return ang; 
    } 
    private static double Randomvel(){ 
     double vel = RandomNumber.RandomNum(1500,1650); 
     return vel; 
    } 
    private void smallChangeVel(){ 
     double vel = canvel; 
     double number = (double) RandomNumber.UI(1,30); 
     double updown = RandomNumber.UI(1,2); 
     if(updown ==1){ 
      vel = vel + number; 
     }else{ 
      vel = vel - number; 
     } 
     if(vel <1500){ 
      vel =1500.0; 
     }else if (vel > 1650){ 
      vel = 1650.0; 
     } 
     canvel = vel; 
    } 
    private void smallChangeAng(){ 
     double ang = canang; 
     double number = RandomNumber.UI(1,3); 
     double updown = RandomNumber.UI(1,2); 
     if(updown ==1){ 
      ang = ang + number; 
     }else{ 
      ang = ang - number; 
     } 
     if(ang <25){ 
      ang =25.0; 
     }else if (ang > 55){ 
      ang = 55.0; 
     } 
     canang= ang; 
    } 
    public void smallChange(){ 
     double updown = RandomNumber.UI(1,2); 
     if(updown == 1){ 
      smallChangeAng(); 
     }else{ 
      smallChangeVel(); 
     } 
    } 
     public void print() 
     { 
      System.out.println(canang); 
      System.out.print(canvel); 
     } 

     public void println() 
     { 
      print(); 
      System.out.println(); 
     } 
    } 

http://pastebin.com/zJWPyz7Q http://pastebin.com/EYugr96p

的問題是,當Newsol使用它改變既newsol,溶膠smallchange方法改變。我一直堅持這一點。

對不起,我不太確定如何格式化這個即時通訊新的要求在stackoverflow。

+0

爲什麼在你的代碼中:'// sol = Newsol;'?它在你正在運行的代碼中註釋掉了嗎? –

+0

我正在測試一些東西,並且忘記刪除那個抱歉。修正了它對於混亂的抱歉。 –

回答

0

你已經放棄通過sol引用舊的對象,現在這兩個變量solNewsol識別相同的對象行

sol = Newsol; 

後。這會導致你所看到的行爲。

+0

只有當它找到範圍較大的值時纔會更新sol,因爲它試圖找到大炮的最大範圍。這是一次隨機突變登山嘗試。 –