无法声明私有的抽象方法

我想这样做,但我做不到。 这是我的情景和理性。 我有一个测试用例的抽象类,它有一个名为test()的抽象方法。 test()方法由子类定义; 它是用某个应用程序的逻辑实现的,例如CRMAppTestCase extends CompanyTestCase 。 我不希望直接调用test()方法,我希望超类调用test()方法,而子类可以调用一个调用它的方法(并且还做其他工作,比如设置当前例如,在执行测试之前的日期时间)。 示例代码:

 public abstract class CompanyTestCase { //I wish this would compile, but it cannot be declared private private abstract void test(); public TestCaseResult performTest() { //do some work which must be done and should be invoked whenever //this method is called (it would be improper to expect the caller // to perform initialization) TestCaseResult result = new TestCaseResult(); result.setBeginTime(new Date()); long time = System.currentTimeMillis(); test(); //invoke test logic result.setDuration(System.currentTimeMillis() - time); return result; } } 

然后扩展这个….

 public class CRMAppTestCase extends CompanyTestCase { public void test() { //test logic here } } 

然后叫它….

 TestCaseResult result = new CRMAppTestCase().performTest(); 

私有方法不是多态的(你不能inheritance它们),所以将私有方法抽象是没有意义的。 使方法抽象意味着您必须在子类中覆盖和实现它,但由于您不能覆盖私有方法,因此您也不能将它们变为抽象。

你应该protected它而不是private

私有对你定义方法的类来说是私有的; 甚至子类也看不到私有方法。

我想指出,Java选择是不要让抽象的私有方法实现(例如在C ++中你可以并且是可取的 )。 说私有方法一般不是多态的,只是不知道调用和定义方法是两种不同的机制 – 虽然子类永远不能调用超类的私有方法,但它们能够定义它。 混合这两者是一种常见的误解,请注意。

我没有足够的声誉来评论,这就是我写答案的原因。

我想这样做,但我做不到

更改此项将需要重写编译器,这是不可能的。

你意识到为什么它永远不会起作用,对吧? 子类不能覆盖私有方法,但它是抽象的,表示它们必须。 第二十二条军规。

‘private’表示该方法只能由类调用。 因此必须在类上定义,因此不能是抽象的。 如果你想在别处定义方法,你将不得不使用私有的东西。

您不能拥有private abstract方法,因为子类无法看到超类的私有成员。 您需要protected您的test方法。

abstract意味着您将要在子类中定义方法

private表示子类不会看到该方法

怎么可以编译?

如果该方法最终公开,请将其声明为public abstract,就是这样。

您应该将“测试”方法声明为“受保护”以实现您的目标。 但它仍然可以从课程的包中访问。