Java 从基本构造函数调用基本方法
Posted
技术标签:
【中文标题】Java 从基本构造函数调用基本方法【英文标题】:Java call base method from base constructor 【发布时间】:2011-08-28 19:44:33 【问题描述】:如何从 Super::Super() 调用 Super::printThree? 在下面的示例中,我改为调用 Test::printThree。
class Super
Super()
printThree(); // I want Super::printThree here!
void printThree() System.out.println("three");
class Test extends Super
int three = 3
public static void main(String[] args)
Test t = new Test();
t.printThree();
void printThree() System.out.println(three);
output:
0 //Test::printThree from Super::Super()
3 //Test::printThree from t.printThree()
【问题讨论】:
【参考方案1】:你不能——这是一个在子类中被覆盖的方法;您不能强制进行非虚拟方法调用。如果您想以非虚拟方式调用方法,请将方法设为私有或最终方法。
一般来说,正是因为这个原因,在构造函数中调用非最终方法是一个坏主意——子类构造函数主体还没有被执行,所以你实际上是在一个没有'的环境中调用一个方法' t 已完全初始化。
【讨论】:
【参考方案2】:您在这里违反了动态调度和继承背后的整个想法。只是不要这样做(无论如何在java中很难规避)。而是将函数设为私有和/或最终函数,这样它就不会在继承的类中被覆盖
【讨论】:
【参考方案3】:如果Super
需要确保printThree()
未被覆盖,则该方法需要声明为final
。或者,Test
中的覆盖方法可以决定调用被覆盖的方法(如果选择):
@Override
void printThree() super.printThree();
如果基类没有将方法标记为final
,它就放弃了不让派生类覆盖它并随心所欲地做事的权利。
【讨论】:
除了他不想调用继承类中的super方法而是反过来。所以super
的想法显然行不通,因为他的 Super 类的 super 是 Object。
@Voo - 同意,我只是指出可能的情况。他想要的东西是不可能的。以上是关于Java 从基本构造函数调用基本方法的主要内容,如果未能解决你的问题,请参考以下文章