【问题标题】:Why is there a private access modifier in an abstract class in Java, even though we cannot create an instance of an abstract class?为什么在 Java 的抽象类中存在私有访问修饰符,即使我们无法创建抽象类的实例?
【发布时间】:2011-03-21 01:09:06
【问题描述】:

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

}

【问题讨论】:

    标签: java abstract-class private


    【解决方案1】:

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

    我没有。你是从哪里得到这个想法的?

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

    抽象类。

    【讨论】:

      【解决方案2】:

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

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

       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)。但请注意,这些都是非常简单的示例,但如果chargeBattery 是一个 500 行的方法,那么在其他两种方法中都编写它会很麻烦。

      【讨论】:

      • 你说服了我!
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        和非抽象类一样,没有区别。

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

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

        【讨论】:

          猜你喜欢
          • 2018-06-26
          • 2012-11-14
          • 2011-07-05
          • 1970-01-01
          • 2013-09-18
          • 2019-04-07
          • 1970-01-01
          • 2014-03-08
          相关资源
          最近更新 更多