gpt4 book ai didi

java - 构造函数中的可重写方法调用 - 调用该方法的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-02 06:12:40 28 4
gpt4 key购买 nike

这两个调用有什么区别?应该如何正确完成此操作?

//package test;

public class SomeClass {

public SomeClass() {

doSomething();//Warning - Overridable method call in constructor
SomeClass.this.doSomething();//Seems OK
}

public void doSomething() {
//...
}
}

我想在同一个类中使用doSomething()只是为了方便。我无意稍后覆盖它。一种想法是将其声明为final。但仍不清楚 SomeClass.this.doSomething(); 在这种情况下是否可以安全使用。

最佳答案

编译器警告通知在某种程度上说明了可能发生的情况。如果子类重写 doSomething 方法,它可以在创建类实例时更改行为,这可能是危险的,也可能不是危险的,具体取决于您的设计。请注意,这是一个警告,而不是编译器异常。

为了证明这一点,只需扩展您的代码来测试它:

class SomeClass {

public SomeClass() {

doSomething();//Warning - Overridable method call in constructor
SomeClass.this.doSomething();//Seems OK, but is not
}

public void doSomething() {
System.out.println("parent");
}
}

public class SomeOtherClass extends SomeClass {
@Override
public void doSomething() {
System.out.println("child");
}

public static void main(String[] args) {
SomeClass a = new SomeClass();
SomeOtherClass b = new SomeOtherClass();
}
}

打印:

parent
parent
child
child

如果您只是希望其他类不能重写 doSomething 方法,请将其标记为 final:

class SomeClass {

public SomeClass() {

doSomething();//Warning - Overridable method call in constructor
SomeClass.this.doSomething();//Seems OK
}

public final void doSomething() {
System.out.println("parent");
}
}

然后,如果任何子类尝试覆盖它,编译器将抛出错误:

public class SomeOtherClass extends SomeClass {
@Override
public void doSomething() { //compiler error
System.out.println("child");
}
//...
}

关于java - 构造函数中的可重写方法调用 - 调用该方法的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21761654/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com