繁体   English   中英

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

[英]Why is there a private access modifier in an abstract class in Java, even though we cannot create an instance of an abstract class?

我知道在abstract class 中将方法声明为private不是一个好的编码习惯。即使我们不能创建abstract class 的实例,为什么private访问修饰符在abstract class 中可用,以及 scope 是什么它在abstract class 中? abstract class 中使用的private访问说明符在什么情况下?

查看此代码,其中Vehicle class 是抽象的, Car extends 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 创建汽车 class

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 
 }

}

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

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

 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行方法,那么用其他方法编写它将是一件麻烦事。

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

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

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

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

我不。 你在哪里得到这个想法?

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

抽象类。

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

package arrayafter;

public abstract class Abstract_Demo {

    abstract void display();

    private void display1() {
        System.out.println("Private Method");
    }

    final void display2() {
        System.out.println("final Method");
        display1();
    }

    public static void display3() {

        System.out.println("Static methods");
    }

}
package arrayafter;

import java.util.Scanner;

public class Practice extends Abstract_Demo{

    public static void main(String[] args) {
        
        Practice pr=new Practice();
        pr.display();
        pr.display2();
        Abstract_Demo.display3();
    }

    @Override
    void display() {
        // TODO Auto-generated method stub
        System.out.println("Abstract method");
        
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM