2010-07-26 4 views
17

So che non è una buona pratica di codifica dichiarare un metodo come private in una classe abstract. Anche se non è possibile creare un'istanza di una classe abstract, perché è disponibile il modificatore di accesso private all'interno di una classe abstract e qual è lo scopo di esso all'interno di una classe abstract? In quale scenario è lo specificatore di accesso private utilizzato in una classe abstract?Perché esiste un modificatore di accesso privato in una classe astratta in Java, anche se non è possibile creare un'istanza di una classe astratta?

controlla questo codice in cui la classe Vehicle è astratta e Car estende veicolo.

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

} 

All'interno è lo stesso pacchetto la creazione di una classe 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 
} 

} 

risposta

35

Poiché una classe astratta può contenere funzionalità (al contrario di un'interfaccia) può avere variabili o metodi privati.

Nel tuo esempio si potrebbe fare qualcosa di simile

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

In questo modo è possibile diffondere una parte del lavoro ad altri metodi (in modo da non si dispone di un metodo startEngine 1000 la linea), ma non fare vuoi che i bambini siano in grado di chiamare iniettore carburante separatamente poiché non ha senso al di fuori del contesto di startEngine (vuoi assicurarti che sia usato solo lì).

O ancora di più potresti avere un metodo privato che viene chiamato in molti altri metodi pubblici, con parametri diversi. In questo modo si evita di scrivere lo stesso codice due volte o più in ciascuno dei metodi pubblici e il raggruppamento del codice comune in un metodo privato assicura che i bambini non accedano (come non potevano semplicemente chiamare parte del metodo pubblico prima). Qualcosa di simile a questo:

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

questo modo i vostri metodi possono avere accesso alla batteria, ma i bambini non dovrebbero pasticciare con essa, e non si scrive la stessa linea (battery.energy -= value) in ciascuno di essi. Prendi nota però che questi sono esempi molto semplici, ma se scaricareBattery era un metodo a 500 righe, scriverlo in entrambi gli altri metodi sarebbe una seccatura.

+0

mi hai convinto! – JerryGoyal

8

E 'lo stesso che in una classe non astratta, non c'è alcuna differenza.

Ciò significa che se nulla nella tua classe astratta chiama il metodo privato, allora puoi anche rimuoverlo, poiché non verrà chiamato (mettendo a nudo un lavoro di riflessione malvagia).

In genere, i metodi privati ​​vengono utilizzati solo come metodi di utilità interni che hanno un'attività molto specifica che gli altri metodi della classe utilizzano per svolgere il proprio lavoro.

1

È possibile accedere al metodo solo all'interno della classe astratta. Ad esempio, potresti avere una classe astratta con un metodo public final che utilizza un metodo di supporto privato.

4

So che non è una buona pratica di codifica per dichiarare un metodo come privata in una classe astratta.

Io no. Dove hai preso quell'idea?

qual è lo scopo di esso all'interno di una classe astratta?

La classe astratta.