【问题标题】:Java- Getters Returning NullJava-Getter 返回 Null
【发布时间】:2016-02-27 01:09:42
【问题描述】:

我正在为班级做一个抽象的超类练习,但我不知道为什么我的 getter 返回 null。根据我的导师的演示,setter 在子类中被覆盖,getter 将成为超类中的 final 方法。当我将吸气剂移到子类时,吸气剂会起作用,所以我猜测这与它们在不同的类中的事实有关,但由于我是面向对象编程的新手,我不知道这是否是原因和/或如何纠正这一点。

抽象超类:

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());

【问题讨论】:

  • 为什么要复制类变量?你创建"shadowing" 效果。
  • 构造函数在哪里?您没有启动超类属性(也没有启动子类属性)。尝试去做,问题就解决了。
  • 我也想知道重复变量,但是这是我老师在课堂上演示的确切代码,所以.....
  • 至于构造函数,我确实有,但值仍然为空,所以我删除了它们。

标签: java abstract-class getter-setter


【解决方案1】:

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

现在每个字段只有一个声明,您应该在ProgrammingCourse 内将字段标记为protected 或创建一些getter/setter,以便您可以从AdvancedJavaCourse 更改它们的值。

【讨论】:

    【解决方案2】:

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

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

    这里发生的事情是 AdcanceJavaCourse 的实例共有 4 个字段,两对 creditcourseName,由 ProgrammingCourse 声明的字段和在 AdvanceJavaCourse 本身中声明的字段。

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

    您在这里可能要做的是删除 AdvanceJavaCourse 中的字段声明,并将ProgrammingCourse 中的字段声明为protected

    另一种可能性是在ProgramingCourse 中将这些字段声明为私有,为ProgramingCourse 中的设置器提供一个简单的主体:

      public void setField(Type value) {
         field = value;
      }
    

    这些 setter 或 getter 子类中的任何专门覆盖都可以通过使用带有 super. 前缀的父 setter getter 来访问私有字段:

    @Override 
    public void setField(Type value) {
        ...
        super.setField(processedValue);
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 2016-07-01
      • 2021-05-04
      • 2014-05-08
      • 1970-01-01
      • 2021-08-12
      • 2020-01-26
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      相关资源
      最近更新 更多