在构造函数

时间:2016-02-04 00:25:44

标签: java methods constructor

我是新手。所以,我找不到确切的词来解释我想做什么。我会尽力解释。

我创建了一个扩展一些基类的类。在基类中,我有一些方法使用对象特定信息来运行。我的意思是我们用构造函数定义。

因此,在扩展我的基类的类中,我使用super创建了一个构造函数,我可以在构造函数中调用一些基类方法,以便在创建对象后自动运行。

就像那样:

class Base {
    String someInfo;

    Base(String someInfo) {
        this.someInfo = someInfo;
    }

    String someMethod() {
        return someInfo;
    }
}

class MClass extends Base {

    MClass(String someInfo) {
        super(someInfo);
        someMethod();
    }
}

1 个答案:

答案 0 :(得分:1)

你的问题更多的是关于理论,而不是实践。

在实践中 - 你可以。但你不应该这样做。这是关于代码嗅觉和难以发现的错误的可能性。看看这个样本

class Base {
  private final String t;
  private final int length;
  Base(String t) {
    this.t = t;
    length = this.t.length();// here you'll got NullPointerException
  }
}
class Override {
   Override() {
     super(calculate());
   }
   String calculate() {
     return "Override";
   }
}
class OverrideB {
  private final String b = "some string";
  OverrideB() {
  }
  String calculate() {
    return b;
  }
}

在当前示例中,当您尝试创建OverrideB个实例时,您将获得NullPointerException - 因为b当前未被实例化(您可以自己检查 - 它是关于构造函数调用的顺序)。 但你必须有选择来避免这个问题:

  • 私有方法(它们不能被覆盖,只能隐藏在子类中)
  • 最终方法(与私有相同的情况,但它们甚至可以隐藏,并且它们可用于所有子类)

PS根据班级名称约定,您应将mClass命名为MClass