构造函数打印出NULL而不是对象值

时间:2019-02-06 01:21:54

标签: java constructor

我创建了一个新的“讲师”类,该类扩展了另一个“人”类,我想为讲师创建2个构造函数,一个构造函数将接受名称和津贴(只是一个常数,表示工资是多少),另一个只接受名称并使用代码中设置的默认津贴。我包括适当的吸气剂和吸气剂。然后,我写了一个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

第二部分可以正常工作,但是第一部分不是,我试图更改代码,但是没有任何正常工作。

4 个答案:

答案 0 :(得分:2)

Lecturer中,您要声明另一个name变量。此变量与name中声明的Person变量分开。对超类构造函数的调用是在name中而不是Person中设置Lecturer变量。但是您不需要第二个变量。去掉它。您可以通过已经声明的Person方法访问getName中的名称。这意味着您也不需要在getName中重新声明setNameLecturer,因此Lecturer类可以继承它们。

此外,在Lecturer中,您声明的两个变量不应为static。根据上述推理,name甚至不应该存在,但即使应该存在,也不应存在static。变量stipend应该存在,但不应为static。声明成员变量static时,整个类只有一个变量,无论您创建了多少实例,这听起来都不是您想要的。

您的构造函数应初始化stipend

答案 1 :(得分:1)

您在Lecturer中有一个静态变量,该静态变量的名称与从Person继承的名称相同,而您的getter引用的是该静态变量-您确定要这些静态变量吗?为了完整起见,如果您真的想保持静态名称和继承名称相同,则将您的吸气剂更改为return this.name;,这将返回继承的名称实例变量。...但是该方法可以从Person继承。课...

答案 2 :(得分:1)

程序中有两个$today字段,一个是 Lecturer.java 中的name,另一个是 person.java < / strong>。

问题是,您只是在调用Lecturer javs的private static String name;字段,而没有进行设置。

答案 3 :(得分:0)

根据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());
    }
}