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 从基本构造函数调用基本方法的主要内容,如果未能解决你的问题,请参考以下文章

派生类中的基本构造函数调用

在 perl 中调用基本构造函数

php获取调用本方法的上个方法,php堆栈,函数入库

《设计模式之禅》之模板方法模式

设计模式——模板方法模式

从Java中的构造函数调用抽象方法可以吗? [复制]