为什么 getName() returns 为空?

Why does getName() returns null?

编辑:感谢您的所有回答!我不知道 List.java 中的对象 p 与 Main.java 中的 p 不同。我将它作为参数传递,它现在工作正常。谢谢!

在Main.java中:

        System.out.println("Enter your name:");
        String name = scan.next();
        name+=scan.nextLine();

        String words[]=name.split("\s");  
        String capitalizeWord="";  
        for(String w:words){  
            String first=w.substring(0,1);  
            String afterfirst=w.substring(1);  
            capitalizeWord+=first.toUpperCase()+afterfirst+" ";  
        }

        Person p = new Person(capitalizeWord);

在Person.java

    private String name;
    private int age;

    Person(String newName){
        name=newName;
    }

    Person(int newAge){
        age=newAge;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

在List.java中:

public void printInvoice(){
        System.out.println("Enter your age:");
        int age = scan.nextInt();

        Person p = new Person(age);
        System.out.println("Thank you for shopping with us, "+p.getName());
}

最后的输出是

Thank you for shopping with us, null

我不知道为什么会这样。我做错什么了吗?我认为代码是正确的?

你有两个构造函数。一种接受字符串,一种接受数字。

在您最近的示例中,您调用了接受数字的那个,并且由于没有初始化 name 成员,它默认初始化为 null

Main.java中的pList.java中的p没有任何关系(是两个不同的变量),所以初始化前者没有对后者的影响。

创建您的代码 person -> Person p = new Person(age);

调用了构造函数 -> Person(int newAge){ age=newAge; } 这个构造函数让名称具有他的默认值..所以null

每次调用构造函数时,您都会获得对象的不同实例。在 Main.java 中创建的具有名称的对象存储在仅存在于 Main.java 范围内的局部变量 p 中。在 List.java 中,您创建了第二个具有年龄但没有名称的对象。它也存储在一个名为 p 的变量中,但该变量仅在 List.java 的范围内,与之前创建的对象无关。

听起来您想将名称添加到较早的对象而不是创建新对象。为此,您应该将第一个对象作为参数传递给添加年龄的代码,可能像这样:

public void addAge(Person p) {
  System.out.println("Enter your age:");
  int age = scan.nextInt();
  p.setAge(age);  // will have to make this method in the Person class
  System.out.println("Thank you for shopping with us, "+p.getName());
}

调用 Person p = new Person(age); 会得到一个全新的 Person 对象,它还没有名字。

正如我在您的 List.java class 中看到的,您已经实例化了一个新的 Person 对象 age 作为一个参数,因此对于该对象,名称将是 null,因为两个引用变量指向不同的 Person 对象

对对象 Person 的第一个引用 p 已使用构造函数实例化了 person 对象:-

Person(String name) {
    this.name = name;
}

对对象 Person 的第二次引用 p 已使用构造函数实例化了 person 对象:-

Person(int age) {
    this.age = age;
}

您应该使用 setter 将 属性 age 设置为已创建的 Person 对象