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

标签 java abstract-class private

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

}

最佳答案

由于抽象类可以包含功能(与接口(interface)相反),它可以包含私有(private)变量或方法。

在您的示例中,您可能会执行类似的操作

 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 方法),但您不希望 child 能够单独调用 injectFuel,因为它不会在 startEngine 的上下文之外感知(你要确保它只在那里使用)。

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

 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.
 }

这样你的方法可以使用电池,但 children 不应该乱用它,而且你不要在两者中写相同的行 (battery.energy -= value)其中。但请注意,这些都是非常简单的示例,但如果chargeBattery 是一个 500 行的方法,那么在其他两种方法中都编写它会很麻烦。

关于java - 为什么在 Java 中的抽象类中存在私有(private)访问修饰符,即使我们无法创建抽象类的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3334380/

相关文章:

Angular 6私有(private)方法

java - 如何解释 "StrangeLoop"的所有可能结果值?

java - 我可以在 Java 应用程序中通过 POP3 和 OAuth2 访问 Gmail 邮件吗?

java - 从另一个抽象类扩展的抽象类的重要性是什么

java - 调用抽象类@Activate方法(apache felix)

java - 为什么 Oracle Java 提供的答案在寻址枚举集时使用私有(private)静态修饰符?

JavaScript 文件无法在 Eclipse Web 应用程序中加载和执行

java - 删除某些项目后 ListView 刷新

c# - 如何在C#中使用抽象类

c++ - 专门为私有(private)类(class)的功能?