Java:实例访问和输入System.in

时间:2013-11-17 16:16:12

标签: java input instance-variables

我必须根据实例和使用System.in输入的问题。

首先是实例:

我创建了一个名为woodenSword的实例变量,其中包含:

Sword woodenSword=new Sword("Wooden Sword", 2);

public Sword(String nameSword, int damageSword){
        this.nameSword=nameSword;
        this.damageSword=damageSword;
        numberOfSwords++;
}

现在,我想访问damageSword,但我该怎么做?我试过了woodenSword.damageSword,但显然这不起作用......我认为这是因为我制作了变量private,但我不想改变它,因为我在某处读到它更好保留变量private。 (还有一个附带问题:为什么保持变量私有更好?)

还有一个问题:我怎样才能获得System.in的输入?是否必须使用System.in.toString()完成?

我应该使用这个功能吗?要从类中获取私有变量,并将该函数放在类中? 我想到了这个功能:

public static int getSwordStats(String nameSword){
    damageSword=nameSword.damageSword;

}

但是,我在nameSword.damageSword上收到错误,我认为它不明白它是一个变量......我该如何解决这个问题?

希望你能帮助我!

2 个答案:

答案 0 :(得分:3)

看起来你的剑类负责跟踪三件事:

  1. 每把剑的名字
  2. 每把剑的伤害
  3. 剑的总数
  4. 前两个需要是成员变量,而最后一个需要是静态变量。

    public class Sword {
        // private (so no one can access it but Sword)
        // static (so it belongs to the class Sword and not any specific Sword)
        private static int numberOfSwords = 0; // initialize to 0
        // public accessor method
        public static int getNumberOfSwords() {
            return numberOfSwords;
        }
        // notice there's no "setNumberOfSwords" - no one can come along and change
        // our data - it's 'encapsulated' in the class
    
        private String name; // private
        private int damage; // private
    
        public Sword(String name, int damage) {
            this.name = name;
            this.damage = damage;
            numberOfSwords++; // the only place we change number of swords
        }
    
        // this is how people outside Sword access the name
        // note that we could add a "setName(String name)" if we want
        public String getName() {
            return name;
        }
    
        // same with name - protect and provide an accessor
        public int getDamage() {
            return damage;
        }
    }
    

    在以后的课程中,您现在可以执行此操作:

    Sword wood = new Sword("Wooden Sword", 2);
    System.out.println("wood's name is " + wood.getName());
    System.out.println("wood's damage is " + wood.getDamage());
    System.out.println("swords crafted so far: " + Sword.getNumberOfSwords());
    
    Sword mithril = new Sword ("Mithril Sword", 10);
    System.out.println("mithril 's name is " + mithril .getName());
    System.out.println("mithril 's damage is " + mithril .getDamage());
    System.out.println("swords crafted so far: " + Sword.getNumberOfSwords());
    

    将打印

    Wooden Sword
    2
    1
    Mithril Sword
    10
    2
    

    对于您的第二个问题,有一些很好的资源,我相信Google可以帮助您找到。作为一个简单的例子,这就是我的工作:

    // assumes you "import java.util.Scanner"
    Scanner sc = new Scanner(System.in);
    while(sc.hasNextLine()) {
        String line = sc.nextLine();
        System.out.println("You typed: " + line);
    }
    

答案 1 :(得分:1)

如果您需要从任何地方获取剑的伤害,那么您应该使用公共方法返回此信息:

public int getDamage() {
    return this.damageSword;
}

(请注意,我将方法命名为getDamage(),而不是getDamageSword()。该方法位于Sword类中。将剑放在任何地方都是无用的,只会增加噪音,并使代码不易读取)。

关于你的第二个问题。是的,System.in是标准输入流。 toString()不会返回用户输入的内容。阅读该类的javadoc以及它是如何工作的。另请阅读Java IO tutorial,其中有一节关于命令行。

关于最后一部分,您的代码会尝试获取String的损坏。字符串没有损坏。剑有伤害。