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

2022-09-01 20:02:07

我知道在类中声明方法不是一个好的编码实践。即使我们无法创建类的实例,为什么访问修饰符在类中可用,它在类中的作用域是什么?在类中使用访问说明符的哪种方案?privateabstractabstractprivateabstractabstractprivateabstract

查看此代码,其中类是抽象的并扩展了 Vehicle。VehicleCar

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 
 }

}

答案 1

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

在你的例子中,你可以做一些类似的事情

 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方法),但是您不希望孩子们能够单独调用in 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.
 }

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


答案 2

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

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

通常,私有方法仅用作具有非常具体任务的内部实用工具方法,类中的其他方法使用该任务来完成其工作。


推荐