【问题标题】:Using scanner to assign value to a variable in another class?使用扫描仪为另一个类中的变量赋值?
【发布时间】:2020-03-12 19:29:02
【问题描述】:

我正在尝试使用来自用户的输入为另一个类中的变量赋值。 我的目标是使用在 二级课程,但我不断收到错误“无法解析符号全名”。 我认为这可能是因为另一个类中的变量是私有的,但我编辑了公开的可见性,这并没有改变任何东西。 我怎样才能做到这一点?

这是我的代码:

public class Main{

    public static void main(String[] args) {

     Scanner scan = new Scanner(System.in);
     System.out.println("Enter your full name:\n");
     fullName = scan.nextLine();
    }
}

// Secondary class
public class Person {

    private int id;
    private String fullName;

    // Constructor
    public Person(String fullName, String id){

    }

    // Setters
    public static void setName(String fullName){
        this.fullName = fullName;
    }

    public static void setid(int id){
        this.id = id;
    }

    //getters
    public String getfullName(){
        return fullName;
    }

    public int getid(){
        return id;
    }

【问题讨论】:

  • setter 不能是静态的。
  • 提供错误信息总是有帮助的。否则,“我不断收到错误”信息不足以让我们提供帮助
  • 我得到的错误是“无法解析符号'fullName'”
  • new Person().setName(scan.nextLine());使用这个
  • @Onkar Musale 我不会这样做,因为它会创建一个未分配给变量的对象,因此之后无法访问。

标签: java


【解决方案1】:

您遇到的错误是因为在 Main 类中,您没有声明 fullName。 阅读有关变量作用域的信息以了解更多信息(直观地说,您在 Person 类中定义的 fullName 在其他类 Main 中是不可见的,因为它被声明为私有,这是应该的)。

解决方法很简单:

  1. fullName定义为Main类中的String,
  2. 创建一个 Person 实例,比如person,然后
  3. 使用您读取的 fullName 值调用 person.setName(fullName); 方法(不能是静态的)。

这是此解决方案的代码:

public class Main{

    public static void main(String[] args) {

     Scanner scan = new Scanner(System.in);
     System.out.println("Enter your full name:\n");
     String fullName = scan.nextLine();
     Person person = new Person();
     person.setName(fullName);
    }
}

// Secondary class
public class Person {

    private int id;
    private String fullName;

    // Constructor
    public Person(String fullName, String id){
         this.id = id;
         this.fullName = fullName;
    }

    public Person(){             
    }

    // Setters
    public void setName(String fullName){
        this.fullName = fullName;
    }

    public void setid(int id){
        this.id = id;
    }

    //getters
    public String getfullName(){
        return fullName;
    }

    public int getid(){
        return id;
    }
}

另一种选择是添加一个只接受一个参数(String fullName)的新构造函数,并直接创建一个 Person 实例为Person person = new Person(fullName);

【讨论】:

    【解决方案2】:

    为了访问Person 成员,您必须首先在Main 类中声明Person 对象。 完成后,您将拥有Person 的实例,然后您可以使用他的成员/方法。

    另外 2 个提示:

    1. setter 不应该是静态的。

    2. 您的构造函数什么都不做。修改它,将fullNameid变量分配给匹配的成员:

    public Person(String fullName, int id) {
        this.fullName = fullName;
        this.id = id;
    }
    

    如果您不希望这种行为,您可以编写一个不接收任何输入的空构造函数。

    【讨论】:

    • 您能否就如何修改构造函数以便将变量分配给匹配的成员提供一些建议?我不知道该怎么做
    • 我已将代码添加到我的评论中。如果您喜欢我的回答,请为我点击“向上”箭头 :)
    • Leibobitz 在我的构造函数被修改以便将变量分配给匹配的成员的情况下,我不再需要在 main 中编写此代码吗? - obj.setFullName(fullName); obj.setId(id); 或者可以这样做:Person obj = new Person(fullName, id);
    • 是的,完全正确。您正在将值分配给构造函数中的每个成员。这是这样做的正确方法。请为我的答案投票:)
    • 我在更改它时遇到了一个问题,我的设置器不再被调用,它只是直接创建对象。这应该是一个问题吗?谢谢,我投了赞成票!
    【解决方案3】:

    1) 你应该创建一个 Person 类型的对象。 2) 定义一个字符串来保存名称。 3) 调用函数。

     String pName =  scan.nextLine();
     Person myPerson = new Person();
     myPerson.setFullName(pName);
    

    -

    public class Person {
    
    private int id;
    private String fullName;
    
    public void setName(String fullName){
        this.fullName = fullName;
    }
    
    public void setid(int id){
        this.id = id;
    } 
    public String getfullName(){
        return fullName;
    }
    }
    

    你的设置器也不应该是静态的。

    【讨论】:

    • 这无法编译,因为他的构造函数接收到 2 个输入。
    • 你说得对,他可以使用默认构造函数。已编辑。
    【解决方案4】:

    我做了以下改动:

    1. 在您的主类中创建了 Person 类的对象,并创建了 id 的输入以及将 fullName 声明为字符串变量。
    2. 使用 set 方法 将值设置为 Person 类。在这种情况下,id 和 fullName setters 用于将这些值设置为 person 类。
    3. nextLine() 方法替换为简单的 next() 方法。
    4. 在 Person 类中添加 toString() 方法来打印 Person 对象的值。

    参考下面提到的代码:

    // Main Class
    public class Main{
    
        public static void main(String[] args) {
    
         Scanner scan = new Scanner(System.in);
            System.out.println("Enter your id:");
            int id = scan.nextInt();
    
            System.out.println("Enter your full name:");
            String fullName = scan.next();
    
            Person obj = new Person();
            obj.setFullName(fullName);
            obj.setId(id);
    
            System.out.println(obj);
        }
    }
    
    // Secondary class
    public class Person {
    
        private int id;
        private String fullName;
    
        public Person() {
            super();
        }
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getFullName() {
            return fullName;
        }
    
        public void setFullName(String fullName) {
            this.fullName = fullName;
        }
    
        @Override
        public String toString() {
            return "Person [id=" + id + ", fullName=" + fullName + "]";
        }
    
    

    【讨论】:

    • 这无法编译,因为他的构造函数接收到 2 个输入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多