Pourquoi il y a un modificateur d'accès privé dans une classe abstraite Java, même si nous ne pouvons pas créer une instance d'une classe abstraite?


Je sais que ce n'est pas une bonne pratique de codage, de déclarer une méthode comme private en abstract classe. Même si nous ne pouvons pas créer une instance d'une classe abstract, pourquoi le modificateur d'accès private est-il disponible dans une classe abstract et quelle en est la portée dans une classe abstract? Dans quel scénario le spécificateur d'accès private est-il utilisé dans une classe abstract?

Consultez ce code où Vehicle class est abstrait et Car étend le véhicule.

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");
  }

}

Dans est le même paquet créant une classe de voiture

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 
 }

}
Author: user207421, 2010-07-26

4 answers

Comme une classe abstraite peut contenir des fonctionnalités (par opposition à une interface), elle peut avoir des variables ou des méthodes privées.

Dans votre exemple, vous pourriez faire quelque chose comme

 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() {}

De cette façon, vous pouvez répartir une partie du travail vers d'autres méthodes( vous n'avez donc pas de méthode startEngine à 1000 lignes), mais vous ne voulez pas que les enfants puissent appeler injectFuel séparément car cela n'a pas de sens en dehors du contexte de startEngine (vous voulez vous assurer qu'il est uniquement utilisé y).

, Ou même plus, vous pourriez avoir une méthode privée qui est appelée dans plusieurs autres méthodes publiques, avec des paramètres différents. De cette façon, vous évitez d'écrire le même code deux fois ou plus dans chacune des méthodes publiques, et le regroupement du code commun dans une méthode privée garantit que les enfants n'y accèdent pas (comme s'ils ne pouvaient pas simplement appeler une partie de la méthode publique auparavant). Quelque chose comme ceci:

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

De Cette façon, vos méthodes peuvent avoir accès à la batterie, mais les enfants ne devrait pas jouer avec, et vous n'écrivez pas la même ligne (battery.energy -= value) dans les deux. Notez cependant que ce sont des exemples très simples, mais si dischargeBattery était une méthode de 500 lignes, l'écrire dans les deux autres méthodes serait un problème.

 37
Author: Andrei Fierbinteanu, 2010-07-26 11:49:05

C'est la même chose que dans une classe non abstraite, il n'y a pas de différence.

Ce qui signifie que si rien dans votre classe abstraite n'appelle la méthode privée, vous pouvez tout aussi bien la supprimer, car elle ne sera pas appelée (sauf un mauvais travail de réflexion).

Habituellement, les méthodes privées ne sont utilisées que comme méthodes utilitaires internes qui ont une tâche très spécifique que les autres méthodes de la classe utilisent pour faire leur travail.

 8
Author: Joachim Sauer, 2010-07-26 11:31:55

Je sais que ce n'est pas un bon codage pratique pour déclarer une méthode comme privé dans une classe abstraite.

Je ne sais pas. Où avez-vous eu cette idée?

Quelle en est la portée dans une classe abstraite?

La classe abstraite.

 4
Author: user207421, 2015-10-03 19:32:09

La méthode n'est accessible qu'à partir de la classe abstract. Par exemple, vous pouvez avoir une classe abstraite avec une méthode public final qui utilise une méthode d'assistance privée.

 1
Author: Ronald Wildenberg, 2010-07-26 11:33:10