2010-07-26 7 views
17

Ich weiß, dass es keine gute Programmierpraxis ist, eine Methode als private in einer abstract Klasse zu deklarieren. Auch wenn wir keine Instanz einer abstract-Klasse erstellen können, warum ist der Zugriffsmodifizierer private innerhalb einer abstract-Klasse verfügbar, und was ist der Umfang davon innerhalb einer abstract-Klasse? In welchem ​​Szenario wird der Zugriffsspezifizierer private in einer abstract Klasse verwendet?Warum gibt es einen privaten Zugriffsmodifikator in einer abstrakten Klasse in Java, obwohl wir keine Instanz einer abstrakten Klasse erstellen können?

überprüfen Sie diesen Code wo Vehicle Klasse ist abstrakt und Car erweitert Fahrzeug.

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

} 

im gleichen Paket ist eine Car-Klasse

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 
} 

} 

Antwort

35

Da eine abstrakte Klasse Funktionalität enthalten kann (im Gegensatz zu einer Schnittstelle), kann sie private Variablen oder Methoden enthalten.

In Ihrem Beispiel könnte tun Sie so etwas wie

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

diese Weise können Sie einen Teil der Arbeit zu anderen Methoden verbreiten können (so dass Sie nicht eine 1000 Linie startEngine Methode haben), aber Sie tun nicht wollen, dass die Kinder injectFuel separat aufrufen können, da es außerhalb des Kontexts von startEngine keinen Sinn ergibt (Sie wollen sicherstellen, dass es nur dort verwendet wird).

Oder noch mehr Sie haben vielleicht eine private Methode, die in mehreren anderen öffentlichen Methoden mit anderen Parametern aufgerufen wird. Auf diese Weise vermeiden Sie, den gleichen Code zweimal oder öfter in jeder der öffentlichen Methoden zu schreiben, und wenn Sie den gemeinsamen Code in einer privaten Methode gruppieren, stellen Sie sicher, dass die Kinder nicht darauf zugreifen (als könnten sie nicht einfach einen Teil der öffentlichen Methode aufrufen)). Etwas wie folgt aus:

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

Auf diese Weise Ihre Methoden Zugriff auf die Batterie haben kann, aber die Kinder sollten nicht mit Zohan an, und Sie nicht die gleiche Linie (battery.energy -= value) in beide schreiben. Beachten Sie jedoch, dass dies sehr einfache Beispiele sind, aber wenn es sich bei der Entladebatterie um eine 500-Zeilen-Methode handelt, wäre es schwierig, sie in beide anderen Methoden zu schreiben.

+0

Sie haben mich überzeugt! – JerryGoyal

8

Es ist das gleiche wie in einer nicht-abstrakten Klasse zu schaffen, gibt es keinen Unterschied.

Das bedeutet, dass, wenn nichts in Ihrer abstrakten Klasse die private Methode aufruft, Sie es genauso gut entfernen können, da es nicht aufgerufen wird (was einige schlechte Reflektionsarbeit entbindet).

Normalerweise werden private Methoden nur als interne Hilfsmethoden verwendet, die eine sehr spezifische Aufgabe haben, die die anderen Methoden in der Klasse verwenden, um ihre Arbeit zu erledigen.

1

Die Methode kann nur innerhalb der abstrakten Klasse aufgerufen werden. Beispielsweise könnten Sie eine abstrakte Klasse mit einer public final-Methode verwenden, die eine private Hilfsmethode verwendet.

4

Ich weiß, es ist keine gute Codierung Praxis ein Verfahren, wie privat in einer abstrakten Klasse zu erklären.

ich nicht. Woher hast du diese Idee?

was ist der Umfang innerhalb einer abstrakten Klasse?

Die abstrakte Klasse.

Verwandte Themen