如何在调用父构造函数之前覆盖子 class 中的父 class 属性?
How to overwrite parent class property in child class before parent constructor is called?
我有一个 BaseClass
和 public static String
xxx 属性。 BaseClass
构造函数需要用 xxx 属性 调用一些方法。并且有一个 ChildClass
应该重写 BaseClass
xxx 属性 但是如果我在 ChildClass
构造函数中这样做就太晚了。
如何更改 BaseClass
xxx 属性 以便 BaseClass
构造函数将使用来自 ChildClass
xxx 的值?
BaseClass {
public statis Strin xxx = "";
public void BaseClass()
{
open(xxx);
}
}
ChildClass extends Baseclass {
// Need to rewrite this value to be used by BaseClass constructor
public statis String xxx = "something else"
}
BaseClass
仍然使用它自己的值,而不是构造函数中来自 ChildClass
的值。
可以使用 child class 中的 static
块。
static {
xxx = "something else";
}
这将在构造函数之前调用。
- 如果BaseClass构造器需要使用class里面声明的值:
class BaseClass {
public statis Strin xxx = "Hello";
public BaseClass()
{
System.out.println(xxx);
}
}
class ChildClass extends BaseClass {
{
xxx = "Bye";
}
public ChildClass(){
System.out.println(xxx);
}
}
new ChildClass()
会输出
Hello
Bye
- 如果 BaseClass 构造函数也应使用 ChildClass 重置的值,则 child class 应更新为:
class ChildClass extends BaseClass {
static {
xxx = "Bye";
}
public ChildClass(){
System.out.println(xxx);
}
}
new ChildClass()
会输出:
Bye
Bye
您可能不想更改基类使用的值。
无法覆盖静态字段。您可以使用非静态字段来实现,并将静态字段保留为默认值,如下所示:
class BaseClass {
public static String DEFAULT_XXX = "";
protected final String xxx;
public BaseClass()
{
this(DEFAULT_XXX);
}
protected BaseClass(String xxx)
{
this.xxx = xxx;
open(xxx);
}
}
class ChildClass extends BaseClass {
public ChildClass()
{
super("something else");
}
}
我有一个 BaseClass
和 public static String
xxx 属性。 BaseClass
构造函数需要用 xxx 属性 调用一些方法。并且有一个 ChildClass
应该重写 BaseClass
xxx 属性 但是如果我在 ChildClass
构造函数中这样做就太晚了。
如何更改 BaseClass
xxx 属性 以便 BaseClass
构造函数将使用来自 ChildClass
xxx 的值?
BaseClass {
public statis Strin xxx = "";
public void BaseClass()
{
open(xxx);
}
}
ChildClass extends Baseclass {
// Need to rewrite this value to be used by BaseClass constructor
public statis String xxx = "something else"
}
BaseClass
仍然使用它自己的值,而不是构造函数中来自 ChildClass
的值。
可以使用 child class 中的 static
块。
static {
xxx = "something else";
}
这将在构造函数之前调用。
- 如果BaseClass构造器需要使用class里面声明的值:
class BaseClass {
public statis Strin xxx = "Hello";
public BaseClass()
{
System.out.println(xxx);
}
}
class ChildClass extends BaseClass {
{
xxx = "Bye";
}
public ChildClass(){
System.out.println(xxx);
}
}
new ChildClass()
会输出
Hello
Bye
- 如果 BaseClass 构造函数也应使用 ChildClass 重置的值,则 child class 应更新为:
class ChildClass extends BaseClass {
static {
xxx = "Bye";
}
public ChildClass(){
System.out.println(xxx);
}
}
new ChildClass()
会输出:
Bye
Bye
您可能不想更改基类使用的值。
无法覆盖静态字段。您可以使用非静态字段来实现,并将静态字段保留为默认值,如下所示:
class BaseClass {
public static String DEFAULT_XXX = "";
protected final String xxx;
public BaseClass()
{
this(DEFAULT_XXX);
}
protected BaseClass(String xxx)
{
this.xxx = xxx;
open(xxx);
}
}
class ChildClass extends BaseClass {
public ChildClass()
{
super("something else");
}
}