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

为什么Java中的抽象类中存在私有访问修饰符,即使我们不能创建抽象类的实例?,java,abstract-class,private,Java,Abstract Class,Private,我知道在abstract类中将方法声明为private不是一个好的编码实践。即使我们不能创建抽象类的实例,为什么抽象类中可以使用私有访问修饰符,以及抽象类中的范围是什么?在哪种情况下,抽象类中使用了私有访问说明符 查看此代码,其中Vehicle类是抽象的,而Car扩展了Vehicle package com.vehicle; abstract class Vehicle { // What is the scope of the private access modifier within

我知道在
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");
  }

}
其中是创建汽车类的同一个包

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 
 }

}

这与非抽象类中的情况相同,没有区别

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


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

只能从抽象类中访问该方法。例如,您可以拥有一个抽象类,该类具有一个使用私有助手方法的
公共final
方法。

因为抽象类可以包含功能(而不是接口),所以它可以具有私有变量或方法

在您的示例中,您可以执行以下操作

 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行的方法,那么在其他两种方法中编写它将是一个麻烦

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

我不知道。你从哪里得到这个主意的

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


抽象类。

你说服了我!