【问题标题】:Keyboard Input In A Separate Class?单独的类中的键盘输入?
【发布时间】:2011-04-23 23:31:31
【问题描述】:

大约一周前刚开始学习 Java。我制作了一个 Java 小程序来计算评论数量,以及某事物的平均评论评分。例如,在应用商店中,您将输入 1 星、2 星、3 星、4 星和 5 星评论,程序将计算平均评论分数。无论如何,也许向您展示会更容易。我想要做的是将键盘输入部分放在不同的类中。但是当我尝试这样做时,编译器说“找不到符号”我知道 Java 中没有全局变量,但肯定有一种方法可以将用户输入变量传递给不同的类(?)。我已经尝试使用“extends”关键字来使我的键盘类成为子类,但这也不起作用。我基本上需要访问 firStarsecStarthrSstarfouStarfivStar 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();

}
}

reviewLauncher 类:

public class reviewLauncher {

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

}
}

编辑:如果我将 firStar、secStar、thrSstar、fouStar 和 fivStar 变量移出方法,将它们转换为实例变量,程序将编译并运行,但程序将返回当我尝试使用它时为 0。

【问题讨论】:

    标签: java input keyboard user-input java.util.scanner


    【解决方案1】:

    好的,有了修改后的问题,我想我对你想要做什么有了更好的了解。

    这个程序需要一个帮助类来保存汇总的评论信息。像这样的:

    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;
    ...
    

    我认为,从那里你可以开始了。

    在您的问题中,您询问如何在类之间共享变量。有很多方法可以做到这一点(静态变量、内部类和各种其他技术),但这几乎总是一个坏主意。如果您正在上课或读书,我相信您已经听说过/阅读过“封装”一词。全局变量或类之间共享的变量会破坏封装,如果您依赖它们,您将面临创建难以处理或使用的代码的风险。 Globals 通常不会在像这样的小项目上造成麻烦,但对于更大的项目,他们会很快把你烧死。

    我希望这能回答您的问题。祝你好运!

    -克里斯

    【讨论】:

    • 嗨,克里斯,感谢您的回复。我一直在阅读我的原始帖子,并意识到我需要帮助的内容确实没有意义。如果可以的话,如果您能再次阅读我的原始帖子,我将不胜感激,因为它现在已被编辑以更好地描述我的要求。
    • 啊,好吧。我想我明白你现在在问什么。如果我说得对,您想更改上面的代码(有效),以便keyboardInput.fiveStar() 在reviewHandler 中设置成员变量。这可以使用内部类,但不是我建议的方式。我会发布一个新的答案。
    • 非常感谢您的回复。这很有道理。不过,我还有另一个问题。像这样的项目,你怎么能做封装呢?对于一个庞大的项目,人们是否拥有这些 HUGE 课程中的所有内容?如何封装?
    • 这是一个深刻的问题。有了经验,你会知道什么时候严格封装是值得的。但是,由于您才刚刚开始,因此值得建立良好的习惯,然后学习何时可以让它们滑动,而不是相反。有关更多信息,请从“模型视图控制器”架构和一般“设计模式”中找到的任何内容开始。如果您真的想深入了解,请查看“设计模式:可重用的面向对象软件的元素”。并下载并使用一些开源软件,这样您就可以看到更有经验的编码人员是如何做到的。
    猜你喜欢
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多