2016-10-02 6 views
-4

Вчера я спросил this вопрос о том, что цикл while не закончился, и мне сказали, что мне нужно установить «правильный» в true в моем основном методе с помощью setter. Я провел некоторое исследование по сеттерам и геттерам, и я полностью потерялся. Что именно они делают и как я могу использовать его в этой ситуации?Java loop требует setter

EDIT: Спасибо, Бен Уэйнрайт за ваш ответ!

Основной метод:

while (lives > 0 && correct == false) { 
    startTime = System.currentTimeMillis(); 
    timeObject.time2(); 
    levelinfoObject.levelInfo(currentlevel); 
    timeObject.time1(); 
    levelinfoObject.livesInfo(lives); 
    timeObject.time1(); 
    levelinfoObject.skipsInfo(skips); 
    timeObject.time2(); 
    questionsObject.questionOne(lives, correct, choice, skips, currentlevel)   
} 

Вопросы один метод в классе вопросы:

public void questionOne(int lives, boolean correct, String choice, int skips, int currentlevel) { 

    Scanner scanner = new Scanner(System.in); 

    System.out.println(" "); 
    System.out.println("Question: If there are 6 apples in a tree and you take 4, how many do you have?"); 

    timeObject.time2(); 

    System.out.println("A: 3"); 
    System.out.println("B: 4"); 
    System.out.println("C: 2"); 
    System.out.println("D: 6"); 

    while (correct == false && lives > 0) { 

     choice = scanner.nextLine(); 

     switch(choice) { 
     case "a": 
      System.out.println("WRONG! Try again."); 
      lives = lives - 1; 
      break; 
     case "b": 
      System.out.println("CORRECT! You have the 4 you took obviously."); 
      correct = true; 
      break; 
     case "c": 
      System.out.println("WRONG! Try again."); 
      lives = lives - 1; 
      break; 
     case "d": 
      System.out.println("WRONG! Try again."); 
      lives = lives - 1; 
      break; 
     case "skip": 
      if (skips > 0) { 
       System.out.println("You have skipped level " + currentlevel + "!"); 
       skips = skips - 1; 
       correct = true; 
      } 

      else { 
       System.err.println("You do not have any skips left!"); 
      } 
      break; 
     default: 
      System.err.println("Please type an answer."); 
      break; 
     } 
    } 
+0

инкубационных и геттеров объясняются в каждом половинной достойный учебник, каково ваше оправдание тому, что вы не знаете, что это такое? – Kayaman

+0

Getters and setters - это аксессоры и мутаторы для переменных в классе. Они являются очень стандартными для ООП (инкапсуляция). –

+0

Ну @ ​​Кайаман, мое «оправдание» - это то, что я не понимаю. Как я уже сказал выше, я пытался узнать о них, и я не понимаю. Слишком сумасшедший для ВАС, чтобы понять, что у кого-то могут быть проблемы с чем-то. – KobiF

ответ

1

Ok, OOP 101, извиняться, если вы уже знаете этот материал, но мне кажется, как вернуться к основам подход может быть полезным.

В Java, как и в большинстве объектно-ориентированных программ, вы в основном участвуете в работе с «объектами», которые определяются «классами». Объекты - это экземпляры определенного типа «вещи» внутри программы, которые имеют «методы» (вещи, которые они делают) и «свойства».

Если мы рассмотрим случай автомобиля. Определенный автомобиль может быть красным или желтым; он может также иметь три или пять дверей. Это свойства. Точно так же автомобиль может делать вещи, как диск. К сожалению, нам не нужно знать, как работает автомобиль, чтобы управлять им, нам просто нужно нажать на педаль. То же самое верно для нашего объекта Java; мы не заботимся о внутренней работе, все, что нам нужно сделать, это вызвать метод drive(). Ниже создан «автомобиль» объект, заданный цвет, а затем вызывается метод «диск».

Car c = new Car(); 
car.colour = Car.Colour.RED; 
car.drive(); 

«Класс» описывает, что такое автомобиль (его свойства) и что он может делать (его методы). Думая об аналогиях с автомобилем; вы можете считать, что класс похож на «заводскую схему» для автомобиля.

class Car { 

    public enum Colour { 
     RED, 
     GREEN, 
     ORANGE, 
     RAINBOW_COLOURED 
    } 

    public Colour colour; 
    public int speed; 

    public void drive() 
    { 
     // ... some code that implements driving 
    } 
} 

Таким образом, вы можете увидеть здесь я добавил ряд свойств, значения которых могут быть изменены извне. Это все очень хорошо и хорошо; возможно, мы хотим, чтобы наша машина была быстрее, поэтому мы можем просто изменить ее, перейдя в

car.speed = 10000000000; 

Awesome; теперь у нас супер быстрый автомобиль. Но что, если мы хотим сделать что-то более сложное.Как насчет того, что мы представляем двигатель нашего автомобиля в коде, а скорость нашего автомобиля зависит от мощности двигателя.

class Car { 

    ... 

    public int speed() { 

     // This is an arbitrary operation for the sake of me not 
     // having to learn how engines work. Ahem. 

     return engine.power() * 842; 
    } 

    public Engine engine; // Assume this class is defined elsewhere 

    ... 
} 

GREAT! это еще более круто сейчас, за исключением ...

Огонь, линия, выше которой пыталась установить скорость автомобиля, теперь сломана.

И это подводит нас к нашему основному пункту. Если изначально мы только получили доступ к нашей скорости с помощью метода, эта проблема не возникла бы. Мы можем сделать это несколькими способами:

Обратите внимание, что перед ним, похоже, есть ключевое слово public. Это означает, что «это свойство/метод можно получить извне объекта. Итак, сначала мы изменим все наши свойства на private, а затем предоставим пару методов для их доступа. Эти методы называются «сеттерами» и «геттерами». Ниже

class Car { 

    ... 

    private int speed; 

    public int getSpeed() // The getter 
    { 
     return speed; 
    } 

    public void setSpeed(int newSpeed) // The setter 
    { 
     speed = newSpeed; 
    } 

    ... 
} 

Редактировать

Я не собираюсь дать вам точный код, чтобы решить вашу проблему, потому что вы бы ничего не узнать. Но примерно то, что вам нужно сделать, это:

  • Создание частной correct собственности на вашем Question класса; создать, по крайней мере, поглотитель, как показано выше
  • в главном классе, то вы можете получить доступ к этой поглотитель на questionsObject вместо доступа к правильной переменной в состоянии в while петли
+0

Спасибо за это очень подробное объяснение! У меня есть еще один вопрос. Итак, после настройки методов getter и setter выше, как изменить или использовать методы из другого класса? @Ben Wainwright – KobiF

+0

@KobiF Я добавил немного больше. В моем посте сейчас более чем достаточно, чтобы разобраться ...: P –

0

Мне кажется, что у вас есть плохое понимание некоторых основ в рамках Java, а именно ОО и в этом я думаю, что мы все были там.

Я рекомендую пройти через эту хорошо написанную статью Jon Skeet. Это объяснит вам разницу прохождения по значению или ссылке.

In (very) short; когда вы проходите по значению, вы не можете изменить состояние этого значения вне своей области.

Это объясняет, почему ваш основной корпус не отвечает ни на какие изменения переменных, внесенные в этот метод, просто потому, что они фактически не изменяются, вы просто отправляете их в новую область.

Что касается инкапсуляция: модификаторы доступа, методы получения и установки .. Я рекомендую следующий урок: Java Encapsulation

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

  • Нет связанных вопросов^_^