Java 如何读写抽象类的变量

Java 如何读写抽象类的变量,java,class,variables,abstract,Java,Class,Variables,Abstract,简单地说,我有一个包含几个变量和方法的抽象类。其他类扩展了这个抽象类,但是当我试图通过调用抽象类中的getter方法来读取抽象类中的私有变量时,它返回null作为变量的值 public class JavaApplication { public static void main(String[] args) { NewClass1 n1 = new NewClass1(); NewClass2 n2 = new NewClass2();

简单地说,我有一个包含几个变量和方法的抽象类。其他类扩展了这个抽象类,但是当我试图通过调用抽象类中的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();
    }

}

仍然打印空值。

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

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
    时的情况。这可以通过简单地使用默认值(可能由每个子类确定)或其他方式实现,例如无法执行

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

请发布实际代码。如前所述,您的
子类
类不会编译。为什么“System.out.println(var2)”不在方法中?只需编译代码(
String var2=getVar1();
),将其放在方法中即可。不需要
保护
。好的,我会发布相关部分,但过一段时间我必须删除它。仍然不会编译。您缺少一个右大括号,并且正在尝试打印一个void方法。只是在命令中添加了一个构造函数。现在它的所有子类都需要一个带参数的构造函数这个第一个词应该完成什么?是,如果没有默认构造函数,则所有子类都必须使用适当的参数调用super()。每个子类都有一个execute方法,它覆盖abstrast类(其超级类)中的execute方法。各种执行方法的内容需要使用抽象类中的变量并能够对其进行更改。现在他们不能,所以程序不能正常工作。我编辑了上面的代码,以便在子类中打印第一个字之前设置第一个字。它仍然打印为空。这一次我也删除了摘要。