Ввод с клавиатуры в отдельном классе? - PullRequest
0 голосов
/ 11 октября 2010

Только начал изучать Java неделю назад или около того.Я сделал небольшую Java-программу, которая подсчитывает количество отзывов и средний рейтинг отзывов, которые что-то имеют.Например, в магазине приложений вы должны ввести обзоры 1, 2, 3, 4 и 5 звезд, и программа подсчитает средний балл.В любом случае, может быть, вам будет проще показать.То, что я хочу сделать, это иметь секцию ввода с клавиатуры в другом классе.Но когда я попытался это сделать, компилятор сказал «не могу найти символ». Я знаю, что в Java нет глобальных переменных, но, несомненно, есть способ передать переменную пользовательского ввода в другой класс (?).Я попробовал ключевое слово "extends", чтобы сделать мой класс клавиатуры подклассом, но это тоже не сработало.По сути, мне нужно получить доступ к firStar , secStar , thrSstar , fouStar и fivStar переменных в класс reviewHandler , когда эти переменные первоначально определены в классе keyboardInput .

класс reviewHandler:

public class reviewHandler {

public void reviews() {

keyboardInput keyboard = new keyboardInput();
keyboard.fiveStar();

int oneStar = firStar;
int twoStar = secStar;
int threeStar = thrStar;
int fourStar = fouStar;
int fiveStar = fivStar;

int starOne = oneStar * 1;
int starTwo = twoStar * 2;
int starThree = threeStar * 3;
int starFour = fourStar * 4;
int starFive = fiveStar * 5;

int reviewCount = oneStar + twoStar + threeStar + fourStar + fiveStar;

double reviewStarCount = starOne + starTwo + starThree + starFour + starFive;

double reviewAverage = reviewStarCount / reviewCount; 

reviewAverage = reviewAverage * 100;
reviewAverage = Math.round(reviewAverage);
reviewAverage = reviewAverage / 100;

System.out.println("Total reviews: " + reviewCount);
System.out.println("Average review score: " + reviewAverage);
}
}

клавиатураВходной класс:

import java.util.Scanner; 

public class keyboardInput extends reviewHandler {

public void fiveStar() {

Scanner stars = new Scanner(System.in);
int firStar, secStar, thrStar, fouStar, fivStar; 
System.out.println("Number of 1 star reviews: ");
firstar = stars.nextInt();
System.out.println("Number of 2 star reviews: ");
secstar = stars.nextInt();
System.out.println("Number of 3 star reviews: ");
thrstar = stars.nextInt();
System.out.println("Number of 4 star reviews: ");
foustar = stars.nextInt();
System.out.println("Number of 5 star reviews: ");
fivstar = stars.nextInt();

}
}

обзор Класс пусковой установки:

public class reviewLauncher {

public static void main (String[] args) {
reviewHandler start = new reviewHandler();
start.reviews();

}
}

РЕДАКТИРОВАТЬ: Если я переместлю firStar, secStarПеременные, thrSstar, fouStar и fivStar вне метода, преобразуя их в переменные экземпляра, программа компилирует и запускает, но программа возвращает 0, когда я пытаюсь ее использовать.

1 Ответ

0 голосов
/ 12 октября 2010

Хорошо, с пересмотренным вопросом, я думаю, у меня есть лучшее представление о том, что вы хотите сделать.

Для этой программы требуется вспомогательный класс для хранения сводной информации о проверке. Примерно так:

public class ReviewInfo {
    public int numFiveStars = 0;
    public int numFourStars = 0;
    public int numThreeStars = 0;
    public int numTwoStars = 0;
    public int numOneStars = 0;
}

Это дает вам один аккуратный пакет, в котором вы можете хранить все данные, которые вы читаете с клавиатуры.

Затем обновите свой класс keyboardInput, чтобы метод fiveStar () сохранял все ваши данные в объекте ReviewInfo и возвращал этот объект обратно в вызывающий код:

import java.util.Scanner; 

public class keyboardInput extends reviewHandler {

    public ReviewInfo fiveStar() {
        Scanner stars = new Scanner(System.in);
        ReviewInfo info = new ReviewInfo();
        System.out.println("Number of 1 star reviews: ");
        info.numOneStars = stars.nextInt();
        System.out.println("Number of 2 star reviews: ");
        info.numTwoStars = stars.nextInt();
        System.out.println("Number of 3 star reviews: ");
        info.numThreeStars = stars.nextInt();
        System.out.println("Number of 4 star reviews: ");
        info.numFourStars = stars.nextInt();
        System.out.println("Number of 5 star reviews: ");
        info.numFiveStars = stars.nextInt();

        return info;
    }
}

И теперь вы можете упростить метод reveiwHandler.reviews (), чтобы он использовал вспомогательный класс ReviewInfo:

...
keyboardInput keyboard = new keyboardInput();
ReviewInfo info = keyboard.fiveStar();
int oneStar = info.numOneStars;
int twoStar = info.numTwoStars;
int threeStar = info.numThreeStars;
int fourStar = info.numFourStars;
int fiveStar = info.numFiveStars;
...

И оттуда тебе хорошо идти, я думаю.

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

Надеюсь, это ответит на ваш вопрос. Удачи!

-Крис

...