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

Sri*_*.V. 19 java abstract-class private

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

看看这个代码,其中Vehicleclass是abstract并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");
  }

}
Run Code Online (Sandbox Code Playgroud)

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 
 }

}
Run Code Online (Sandbox Code Playgroud)

And*_*anu 39

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

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

 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() {}
Run Code Online (Sandbox Code Playgroud)

这样你可以将一些工作传播到其他方法(所以你没有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.
 }
Run Code Online (Sandbox Code Playgroud)

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


Joa*_*uer 8

它与非抽象类中的相同,没有区别.

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

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