0

我已经玩了好几个小时了,改变了静态的、私有的、公共的等等 :) 但它仍然行不通。如果我在一个地方更改静态,我会在另一个地方收到错误等。

我有一个班级叫人。我使用了非静态 Setter,因为Person()构造函数也是非静态的。

public class Person {
    private String name;
    private String lastname;
    private String nickname; 

    Person() {
        this.name = ""; 
        this.lastname = ""; 
        this.nickname = "";  
    }

    public void setName(String name) {
        this.name = name; 
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;  
    }

    public void setNickname(String nickname) {
        this.nickname = nickname; 
    }
}

然后我有一个包含我的主要方法的文件,以及用于与用户交互的不同方法。这个方法也是静态的,因为它调用那些采用正在使用该类的 userInput 的方法Scanner

public class Interaction {
    public static void takeName() {
        String name; 
        String lastname;
        String nickname;  

        System.out.println("What is your firstname:");
        name = userInput(); // calls method with Scanner class
        System.out.println("What is your lastname:");
        lastname = userInput(); // calls method with Scanner class
        System.out.println("What is your nickname:");
        nickname = userInput(); 

        person.setName(name);
        person.setLastname(lastname); 
        person.setNickname(nickname); 
    }
//editor: missing closing bracket

我试过的:

  • 我已经尝试过Person.person.setname(name);
  • 在 public 类中声明 String Interaction,然后使用 this.name 传递 String 并从 public 类中调用方法Interaction
  • 试图改变静态、私有等。
  • 删除类中的构造函数类Person(Person

我在这里想念什么?

编辑:我已按照您的要求添加了更多信息:)

如果它通过 if 语句,我的新Person对象将被声明。

如果有可用的位置,则将创建一个新人并将其添加到该位置。

public class Theater {
    void reservationSystem () {
        if (availability > 0) {
            for (int i = 0; i < freespaces.length; i++) {
                if (freespaces[i].person == null) {
                    freespaces[i].person = new Person(); 
                    break; 
                }
            }
        } else {
            System.out.println("No tickets for you today :) ");
        }
    }
//editor: missing closing bracket

所以我的思路是:

  • Userinput()我用来自使用类的数据填充构造函数Scanner
  • 然后我创建了新Person对象,因此它具有该数据!
  • 当我在预订系统中创建一个新Person的时,构造函数中的数据将再次填充数据,但现在使用新数据:)

如果您需要更多信息,请告诉我:)

4

3 回答 3

2

首先要注意的是你的Person构造函数有点没用,你可以Person这样重写:

public class Person {

    private String name = "";
    private String lastname = "";
    private String nickname = "";

    public void setName(String name) {
        this.name = name;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }
}

现在到你的Interaction class. 这需要通过public而不是Public,但我认为这是一个错字。

您需要一个instanceofPerson来调用您的设置器,因为它们是instance方法。你需要在某个地方打电话new Person()

编写方法的最简单方法是takeName()方法中创建 a并ing 实例:Person return

public class Interaction {

    public static Person takeName() {
        final Person person = new Person();
        System.out.println("What is your firstname:");
        person.setName(userInput());
        System.out.println("What is your lastname:");
        person.setLastname(userInput());
        System.out.println("What is your nickname:");
        person.setNickname(userInput());
        return person;
    }
}
于 2013-10-04T08:05:58.037 回答
1

您的“takeName()”函数应该更新 Person 类的单个实例

一种方法是在Person外部创建并将其传递给函数:

Public class Interaction {
    public static void takeName(Person person) {
      String name; 
      String lastname;
      String nickname;  

      System.out.println("What is your firstname:");
      name = userInput(); // calls method with Scanner class
      System.out.println("What is your lastname:");
      lastname = userInput(); // calls method with Scanner class
      System.out.println("What is your nickname:");
      nickname = userInput(); 

      person.setName(name);
      person.setLastname(lastname); 
      person.setNickname(nickname); 
  }
}

但我认为在函数内部创建 person 实例并返回它会更直观:

Public class Interaction {
    public static Person takeName() {
      String name; 
      String lastname;
      String nickname;  

      Person person = new Person();

      System.out.println("What is your firstname:");
      name = userInput(); // calls method with Scanner class
      System.out.println("What is your lastname:");
      lastname = userInput(); // calls method with Scanner class
      System.out.println("What is your nickname:");
      nickname = userInput(); 


      person.setName(name);
      person.setLastname(lastname); 
      person.setNickname(nickname); 

      return person;
  }
}
于 2013-10-04T08:02:26.743 回答
1

因为这不是有效的语法:Person.person.setname(name);

在这种情况下,这意味着:

  1. 获取类命名Person
  2. 获取命名类的静态字段Personperson
  3. 使用参数查找并调用实例方法 setnamename

但是您的Person班级-适当地-没有名为 person 的静态字段...

您的问题的根本原因很可能是不完全熟悉类、实例的概念,以及静态和实例成员和方法的含义......

  • 静态总是意味着被引用的部分与相连。
  • 实例变量或方法(例如所有非静态的)连接到所述类的实例
于 2013-10-04T08:03:45.350 回答