为什么在Java中的抽象类中存在私有访问修饰符,即使我们无法创建抽象类的实例?

我知道在abstract类中将方法声明为private不是一个好的编码实践。 即使我们无法创建abstract类的实例,为什么private访问修饰符在abstract类中可用,它在abstract类中的范围是什么? 在哪种情况下, abstract类中使用的private访问说明符?

看看这个代码,其中Vehicle类是抽象的, Car扩展了Vehicle。

 package com.vehicle; abstract class Vehicle { // What is the scope of the private access modifier within an abstract class, even though method below cannot be accessed?? private void onLights(){ System.out.println("Switch on Lights"); } public void startEngine(){ System.out.println("Start Engine"); } } 

Within是创建Car类的相同包

 package com.vehicle; /* * Car class extends the abstract class Vehicle */ public class Car extends Vehicle { public static void main(String args[]){ Car c = new Car(); c.startEngine(); // Only startEngine() can be accessed } } 

由于抽象类可以包含function(而不是接口),因此它可以包含私有变量或方法。

在你的例子中,你可能会做类似的事情

  public void startEngine(){ injectFuel(); igniteSpark(); // etc. my understanding of engines is limited at best System.out.println("Start Engine"); } private void injectFuel() {} private void igniteSpark() {} 

这样你可以将一些工作传播到其他方法(所以你没有1000行startEngine方法),但你不希望孩子能够分别调用injectFuel,因为它在外面没有意义startEngine的上下文(你想确保它只在那里使用)。

或者甚至更多你可能有一个私有方法,在其他几个公共方法中调用,具有不同的参数。 这样就可以避免在每个公共方法中编写相同的代码两次或更多次,并将公共代码分组为私有方法,确保子代不访问它(就像他们之前不能只调用公共方法的一部分一样) )。 像这样的东西:

  public void startEngine() { dishargeBattery(50); System.out.println("Start Engine"); } public void startRadio() { dischargeBattery(20); } private void dischargeBattery(int value) { battery.energy -= value; //battery should probably be a private field. } 

这样你的方法可以访问电池,但是孩子们不应该弄乱它,并且你不会在它们中写入相同的行( battery.energy -= value )。 请注意,这些都是非常简单的例子,但如果dischargeBattery是500行方法,那么用其他方法编写它将是一件麻烦事。

它与非抽象类相同,没有区别。

这意味着如果你的抽象类中没有任何东西调用私有方法,那么你也可以删除它,因为它不会被调用(禁止一些邪恶的reflection工作)。

通常,私有方法仅用作内部实用程序方法,这些方法具有一个非常特定的任务,该类中的其他方法用于完成其工作。

我知道在抽象类中将方法声明为私有不是一个好的编码实践。

我不。 你在哪里得到这个想法?

抽象类中它的范围是什么?

抽象类。

只能从抽象类中访问该方法。 例如,您可以使用带有public final方法的抽象类,该方法使用私有帮助器方法。