Java- Getters返回Null

时间:2016-01-31 01:03:43

标签: java abstract-class getter-setter

我正在为类进行一个抽象的超类练习,我坚持为什么我的getter返回null。根据我的教师演示的方式,在子类中重写了setter,并且getter将成为超类中的最终方法。当我将它们移动到子类时,getter工作,所以我猜它与它们在不同的类中的事实有关,但由于我是面向对象编程的新手,我不知道这是不是为什么和/或如何纠正这个问题。

摘要超类:

public abstract class ProgrammingCourse {

    private double credits;
    private  String courseName;

    public final double getCredits() {
        return credits;
    }

    public abstract void setCredits(double credits);

    public final String getCourseName() {
        return courseName;
    }

    public abstract void setCourseName(String courseName);

示例子类:

  public class AdvancedJavaCourse extends ProgrammingCourse {

    private double credits;
    private String courseName;

    @Override
    public void setCourseName(String courseName) {
        if (courseName == null || courseName.length() == 0) {
            JOptionPane.showMessageDialog(null,
                    "Error: courseName cannot be null or empty");
            System.exit(0);
        }
        this.courseName = courseName;
    }

    @Override
    public void setCredits(double credits) {
        this.credits = credits;
    }

我如何在我的主要工作中使用它:

     ProgrammingCourse[] courses = {new AdvancedJavaCourse(), 
     new IntroJavaCourse(), new IntroToProgrammingCourse()};

    courses[0].setCourseName("adv Java");
    courses[1].setCourseName("Intro Java");
    courses[2].setCourseName("Intro Programming");
    for (ProgrammingCourse pc : courses) {
        System.out.println(pc.getCourseName());
    }

    AdvancedJavaCourse advJava = new AdvancedJavaCourse();
    advJava.setCourseName("Advanced Java");

    System.out.println(advJava.getCourseName());

2 个答案:

答案 0 :(得分:5)

您的代码存在一些问题。从AdvancedJavaCourse开始,您应删除字段creditscourseName。可以从ProgrammingCourse访问这些内容。

现在您只为每个字段提供了一个声明,您应该在protected内将字段标记为ProgrammingCourse或创建一些getter / setter,以便您可以更改其值AdvancedJavaCourse

答案 1 :(得分:1)

您必须避免在超类和子类中声明具有相同名称的字段。

这就是所谓的变量/字段shadowing。即使语言允许,也应避免使用。

这里发生的是AdcanceJavaCourse的实例共有4个字段,两对creditcourseNameProgrammingCourseAdvanceJavaCourse声明的字段在ProgrammingCourse本身声明。

AdvanceJavaCourse中的代码将读取和写入该类中声明的变量,而ProgrammingCourse中的代码将访问该类中声明的字段。

你想在这里做的是删除AdvanceJavaCourse中的字段声明,并将protected中的字段声明为ProgramingCourse

另一种可能性是在ProgramingCourse中将这些字段声明为私有,为 public void setField(Type value) { field = value; } 中的设置者提供一个简单的主体:

super.

那些setter或getter中的任何专门覆盖子类都可以通过使用带有@Override public void setField(Type value) { ... super.setField(processedValue); ... } 前缀的父setter getters来访问私有字段:

public int rollPair()
{
    return die1.roll() + die2.roll();
}