Почему getName () возвращает ноль? - PullRequest
0 голосов
/ 15 апреля 2020

РЕДАКТИРОВАТЬ: Спасибо за все ответы! Я не знал, что объект p в List. java отличается от p в Main. java. Я передал его в качестве параметра, и теперь он работает нормально. Спасибо!

На главной. 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);

Лично. 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;
    }

В списке. 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

Я не знаю, почему это происходит. Я сделал что-то неправильно? Я думаю, что код правильный?

Ответы [ 4 ]

2 голосов
/ 15 апреля 2020

Каждый раз, когда вы вызываете конструктор, вы получаете отдельный экземпляр объекта. Объект, созданный в Main.java с именем, сохраняется в локальной переменной p, которая существует только в области действия Main.java. В 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, у которого еще нет имени.

2 голосов
/ 15 апреля 2020

У вас есть два конструктора. Тот, который принимает строку, тот, который принимает число.

В вашем последнем примере вы назвали тот, который принимает число, и, поскольку ничего не инициализирует член name, он инициализируется как null как default.

p в Main.java не имеет ничего общего с p в List.java (это две разные переменные), поэтому инициализация первого не повлияет на второе.

1 голос
/ 15 апреля 2020

Как я вижу в вашем классе . java, вы создали новый объект Person с параметром age, поэтому для этого объекта имя будет * 1005. *, поскольку две ссылочные переменные указывают на другой Person объект

Первая ссылка p на объект Person создала экземпляр объекта person с помощью конструктора: -

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

Вторая ссылка p на объект Person создала экземпляр объекта person с помощью конструктора: -

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

Вы должны использовать setter, чтобы установить для свойства age уже созданное Person объект

0 голосов
/ 15 апреля 2020

код, который создает ваш person -> Person p = new Person(age);

вызываемый конструктор -> Person(int newAge){ age=newAge; } Этот конструктор позволяет имени с его значением по умолчанию .. так что null

...