2013-12-02 2 views
0

Я пытаюсь создать счетчик, который содержит число, которое можно увеличить и уменьшить. Программа также имеет логическую проверку: когда true, счетчик не может пойти отрицательным. Кажется, что программа работает нормально, но я не могу получить методы уменьшения (как уменьшаются на единицу, так и уменьшаться по вводу), чтобы получить логическое право. Он не проверяет логическое значение или что-то еще? Я новичок в Java и нуждаюсь в помощи, понимая, что не так. Класс выглядит следующим образом:Счетчик: метод уменьшения игнорируется boolean

public class Counter { 

    private int value; 
    private boolean check; 

    public Counter(int startingValue, boolean check) { 
     if (this.check = true) { 
      this.value = startingValue; 
      if (value < 0) { 
       value = 0; 
      } 
     } 
     if (this.check = false) { 
      this.value = startingValue; 
     } 

    } 

    public Counter(int startingValue) { 
     this.check = false; 
     this.value = startingValue; 
    } 

    public Counter(boolean check) { 
     this.check = check; 
    } 

    public Counter() { 
     this.value = 0; 
     this.check = false; 
    } 

    public int value() { 
     return this.value; 
    } 

    public void increase() { 
     value++; 
    } 

    public void decrease() { 
     if (this.check == true) { 
      this.value--; 
      if (value < 0) { 
       value = 0; 
      } 
     } else if (this.check == false) { 
      this.value--; 
     } 
    } 

    public void increase(int IncreaseAmount) { 
     if (IncreaseAmount >= 0) { 
      this.value = value + IncreaseAmount; 
     } 
    } 

    public void decrease(int DecreaseAmount) { 
     if (DecreaseAmount >= 0) { 
      this.value = value - DecreaseAmount; 
     } 
     if (check == true && value < 0) { 
      value = 0; 
     } 
    } 
} 

Теперь, если я должен был выполнить основную программу с этим классом, как это, например:

Counter count = new Counter (2, true); 
count.decrease(); 
count.decrease(); 
count.decrease(); 

То, что я хочу, чтобы моя программа, чтобы сделать это, чтобы не идти отрицательным поскольку логическая проверка верна. И все же он идет до -1. Почему это?

+4

'if (this.check = true)' должен быть 'if (this.check == true)' или более простым 'if (this.check)' Также не забудьте присвоить значение 'this.check' в ваш конструктор: 'this.check = check'. –

+0

Вы должны назвать свой логический «чек» чем-то вроде «allowNegative», поскольку его легче понять, но это не ваша проблема. –

+0

Зачем это делать?Совершенно прекрасный вопрос, на мой взгляд (Edit: вопрос был в -1, когда я разместил комментарий) – Sondre

ответ

3

Вы не в состоянии установить глобальную переменную check в false , Вы также использовали = вместо ==:

использование:

public Counter(int startingValue, boolean check) { 
    this.check = check; 
    if (check == true) { 
     value = startingValue; 
     if (value < 0) { 
      value = 0; 
     } 
    } 
    else { 
     value = startingValue; 
    }  
} 
+1

Не использовать '=' - использовать '==' !!! – isnot2bad

+1

Да, я вижу, я пропустил эту деталь. Спасибо Дэвиду за предложенное редактирование. – ljgw

+0

@ isnot2bad Я исправил код ljgw –

0

Вам необходимо использовать == для сравнения равенства. Использование single = устанавливает значение. Еще лучше, проверяя значение булева, просто используйте логическое значение. Таким образом, вместо

if (someBool == true) 

предпочитают

if (someBool) 

Аналогично, вместо

if (someBool == false) 

предпочитают

if (!someBool) 
0

Ваши логические тесты в вашем случае утверждения нужно использовать == для сравнения равенства в конструкторе.

В инструкции второго оператора вашего конструктора вы присваиваете check значение false.

0

При выполнении логической логики с булевым, просто используйте логическое значение.

Таким образом, вместо "если (this.check == верно)" делать "если (this.check)" и "если (this.check == ложь)" делать «, если (! This.check) «

Кроме того, у вас было« if (this.check = true) »для некоторых, которое присваивает true this.check.

Вы главный вопрос заключается в том, что вы пропустили назначение параметра метода переменного объекта «this.check = проверить, // Я добавил это»

Сравните версию с этим:

public class Counter { 

    private int value; 
    private boolean check; 

    public Counter(int startingValue, boolean check) { 
     this.check = check; // I added this 
     if (this.check) { //I changed this 
      this.value = startingValue; 
      if (value < 0) { 
       value = 0; 
      } 
     } else { //and this 
      this.value = startingValue; 
     } 

    } 

    public Counter(int startingValue) { 
     this.check = false; 
     this.value = startingValue; 
    } 

    public Counter(boolean check) { 
     this.check = check; 
    } 

    public Counter() { 
     this.value = 0; 
     this.check = false; 
    } 

    public int value() { //good practice to use getVar and setVar, ie: getValue() 
     return this.value; 
    } 

    public void increase() { 
     value++; 
    } 

    public void decrease() { 
     if (this.check) { // you are not consistent with this.value VS value, which can be a confusing practise 
      this.value--; 
      if (value < 0) { 
       value = 0; 
      } 
     } else { 
      this.value--; 
     } 
    } 

    public void increase(int increaseAmount) { //you had "IncreaseAmount", good practice to start vars with lower case 
     if (increaseAmount >= 0) { 
      this.value = + increaseAmount; 
     } 
    } 

    public void decrease(int decreaseAmount) { 
     if (decreaseAmount >= 0) { 
      this.value = value - decreaseAmount; 
     } 
     if (check && (value < 0)) { 
      value = 0; 
     } 
    } 

    public void print(){ 
     System.out.println("value:"+value+" check:"+check); 
    } 


    public static void main(String[] args) { 
     Counter count = new Counter (2, true); 
     count.decrease(); 
     count.print(); 

     count.decrease(); 
     count.print(); 

     count.decrease(); 
     count.print(); 

    } 

} 
Смежные вопросы