Конструктор выводит NULL вместо значения объекта - PullRequest
0 голосов
/ 06 февраля 2019

Я создал новый класс "Lecturer", который расширяет другой класс "Person", я хотел сделать 2 конструктора для Lecturer, и один мог бы принять имя и стипендию (просто константу, чтобы сказать, сколько платят), другойпросто принимает имя и использует стипендию по умолчанию, установленную в коде.я включил соответствующие геттеры и сеттеры.Затем я написал метод writeOutput для печати вывода, подобного этому

Имя: (имя), которое получает имя и печатает его Стипенд: (Стипенд) тот же процесс ^

вот что у меня такдалеко

Lecturer.java

public class Lecturer extends Person{

private static String name;
static double stipend;

public Lecturer(String name) {
    super(name);

}

public Lecturer(String name, double stipend) {
    super(name);
}

public String getName() {
    return name;
}



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



public double getStipend() {
    return stipend;
}



public void setStipend(double stipend) {
    this.stipend = stipend;
}

public static void writeOutput() {
    System.out.println("Name: " + name);
    System.out.println("Stipend: " + stipend);
    }

 }

Person.java

public class Person {

/** Every Person has a name */
private String name;

/** Person requires a name */
public Person(String n) {
    this.name = n;
}

/** return this Person's name */
public String getName() {
    return this.name;
}

/** Change this Person's name */
public void setName(String nn) {
    this.name = nn;
}

Основной файл (Inheritance.java)

Строки 41-53

    Lecturer l1 = new Lecturer("Zachary");
    Lecturer l2 = new Lecturer("Wilhelmina", 11017.00);
    l1.writeOutput();
    l2.writeOutput();
    pause();
    l1.setName("Zack");
    l1.setStipend(10800.00);
    l1.writeOutput();
    pause();
    System.out.printf("%s's stipend is $%,4.2f.\n", 
                        l1.getName(), l1.getStipend());        
    System.out.printf("%s's stipend is $%,4.2f.\n", 
                        l2.getName(), l2.getStipend());    

Это вывод

Name: null
Stipend: 0.0
Name: null
Stipend: 0.0

press enter...

Name: Zack
Stipend: 10800.0

2-я часть работает как надо, но первая - нет, и я попытался изменить код, но ничего не работает должным образом.

Ответы [ 4 ]

0 голосов
/ 06 февраля 2019

Исправлен проект, основанный на ответе rgettman.

Lecturer класс должен выглядеть следующим образом:

public class Lecturer extends Person {
    double stipend = 9144;

    public Lecturer(String n) {
        super(n);
    }

    public Lecturer(String n, double stipend) {
        super(n);
        this.stipend = stipend;
    }

    public double getStipend() {
        return stipend;
    }

    public void setStipend(double stipend) {
        this.stipend = stipend;
    }

    public void writeOutput() {
        System.out.println("Name: " + this.getName());
        System.out.println("Stipend: " + getStipend());
    }
}
0 голосов
/ 06 февраля 2019

В Lecturer вы объявляете другую переменную name.Эта переменная отделена от переменной name, объявленной в Person.Вызов конструктору суперкласса устанавливает переменную name в Person, а не в Lecturer.Но вам не нужна вторая переменная;убери это.Вы можете получить доступ к имени в Person с помощью метода getName, который вы уже объявили.Это означает, что вам также не нужно повторно объявлять getName и setName в Lecturer, поэтому класс Lecturer может их наследовать.

Кроме того, в Lecturer дваобъявленные вами переменные не должны быть static.Согласно приведенному выше рассуждению, name даже не должно быть там, но даже если оно должно быть там, оно не должно быть static.Переменная stipend должна быть там, но она не должна быть static.Когда вы объявляете переменную-член static, тогда существует только одна переменная для всего класса, независимо от того, сколько экземпляров вы создаете, что не похоже на то, что вы хотите.

Ваши конструкторы должны инициализировать stipend.

0 голосов
/ 06 февраля 2019

В вашей программе есть два поля name, одно из которых private static String name; в Lecturer.java , а другое private String name; в person.java .

Дело в том, что вы просто вызываете поле Lecturer javs name, но не устанавливаете его.

0 голосов
/ 06 февраля 2019

У вас есть статическая переменная внутри Lecturer, имя которой совпадает с именем, унаследованным от Person, и ваш получатель ссылается на эту статическую - вы уверены, что хотите эти статические переменные?Для полноты, если вы действительно хотите сохранить статический и унаследованный объект с одинаковыми именами, измените ваш метод get на return this.name;, который будет возвращать унаследованную переменную экземпляра имени .... Но этот метод может быть унаследован от класса Person...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...