2010-07-26 12 views
17

Je sais que ce n'est pas une bonne pratique de codage de déclarer une méthode comme private dans une classe abstract. 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?Pourquoi y a-t-il un modificateur d'accès privé dans une classe abstraite en Java, même si nous ne pouvons pas créer une instance d'une classe abstraite?

vérifier ce code où Vehicle classe est abstraite et Car étend Véhicule.

Dans est le même paquet
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"); 
    } 

} 

création d'une classe de voitures

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 
} 

} 

Répondre

35

Étant donné qu'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 pouvez 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 diffuser une partie du travail à d'autres méthodes (de sorte que vous ne disposez pas d'une méthode startEngine 1000 lignes), mais vous ne veulent 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 n'est utilisé que là). Ou encore 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 deux fois le même code 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 appeler une partie de la méthode publique avant). 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 doivent pas jouer avec, et vous ne pas écrire la même ligne (battery.energy -= value) dans les deux d'entre eux. Prenez note 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.

+0

vous m'a convaincu! – JerryGoyal

8

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

Cela signifie que si rien dans votre classe abstraite n'appelle la méthode privée, alors vous pouvez tout aussi bien l'enlever, car elle ne sera pas appelée (révélant un travail de réflexion maléfique).

Généralement, les méthodes privées sont uniquement utilisées en tant que méthodes d'utilitaire interne qui ont une tâche très spécifique que les autres méthodes de la classe utilisent pour effectuer leur travail.

1

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

4

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

Je n'en ai pas. D'où tiens-tu cette idée?

quelle est la portée de celui-ci dans une classe abstraite?

La classe abstraite.