【问题标题】:How to read and write to variables of an abstract class如何读写抽象类的变量
【发布时间】:2013-10-25 22:24:25
【问题描述】:

简单地说,我有一个包含多个变量和方法的抽象类。其他类扩展了这个抽象类,但是当我尝试通过调用抽象类中的 getter 方法来读取抽象类中的私有变量时,它返回 null 作为变量的值。

public class JavaApplication {

    public static void main(String[] args) {
        NewClass1 n1 = new NewClass1();
        NewClass2 n2 = new NewClass2();

        n1.setVar("hello");
        n2.print();

    }
}



public class NewClass1 {

    public String firstWord;

    public void setVar(String var) {
        firstWord = var;
    }

    public String getVar () {
        return firstWord;
    }

}



public class NewClass2 extends NewClass1{

    public void print() {
        System.out.println(makeCall());
    }

    public String makeCall() {
        return getVar();
    }

}

仍然打印出 null。

【问题讨论】:

  • 请贴出实际代码。如所写,您的 subclass 类将无法编译。
  • 为什么“System.out.println(var2)”不在方法中?
  • 只需编译代码 (String var2 = getVar1();),将其放入方法中即可。不需要protected
  • 好的,我会发布相关部分,但我必须在一段时间后将其删除。
  • 仍然无法编译。您缺少右大括号,并且正在尝试打印 void 方法。

标签: java class variables abstract


【解决方案1】:

String 被初始化之前,它将为空。您可能应该在抽象类中有一个构造函数来设置它。

public abstract class Command
{
     String firstWord; // = null 

     protected Command(){}

     protected Command( String w )
     {
         firstWord = w;
     }
     //...
}

public class Open extends Command
{
     public Open()
     {
         this( "your text" );
     }

     public Open( String w )
     {
         super( w );
     }

     // ...
}

如果您需要在每次调用execute() 时修改firstWord 字符串,则可能不需要使用带有String 参数的构造函数(我在上面添加了默认构造函数)。但是,如果你这样做,那么要么

  • 必须确保在 getFirstWord() 之前调用 setFirstWord(),或者,
  • 处理getFirstWord() 返回null 的情况。这可以通过简单地使用默认值(可能由每个子类确定)或其他方式来实现,例如执行失败。

由于我不知道您实施的所有细节,因此无法告诉您更多信息。

【讨论】:

  • 刚刚向 Command 添加了一个构造函数。现在它的所有子类都想要一个带参数的构造函数
  • 这个 firstWord 应该完成什么?是的,如果您没有默认构造函数,那么所有子类都必须使用适当的参数调用 super()。每个子类是否不同?
  • 每个子类都有一个执行方法,它覆盖了抽象类(它的超类)中的一个执行方法。各种execute方法的内容需要用到抽象类中的变量,并且能够改变。现在他们不能,所以程序不能正常工作。
  • 我编辑了上面的代码,以便在子类中打印之前设置 firstWord。它仍然打印出空值。这次我也删除了摘要。
猜你喜欢
  • 2021-08-30
  • 1970-01-01
  • 2016-05-10
  • 1970-01-01
  • 1970-01-01
  • 2011-09-27
  • 2010-09-19
  • 2015-06-09
  • 1970-01-01
相关资源
最近更新 更多