Benennung des Pakets
Paketnamen sollten Konflikte mit anderen Paketen vermeiden. Die Auswahl eines Namens, der sowohl sinnvoll als auch eindeutig ist, ist ein wichtiger Aspekt des Paketdesigns. Programmierer auf der ganzen Welt entwickeln jedoch Pakete, und es gibt keine Möglichkeit zu wissen, wer den Namen des Pakets verwendet hat. Die Auswahl des einzigen Paketnamens ist also ein Problem. Wenn wir feststellen, dass ein Paket nur in unserer Organisation verwendet wird, können wir einen internen Schiedsrichter haben, um sicherzustellen, dass kein Name -Konflikt zwischen den Projekten besteht.
Aber für die ganze Welt ist dieser Ansatz nicht praktisch. Packungskennungen sind alle einfachen Namen und eine bessere Möglichkeit, um sicherzustellen, dass der Paketname darin besteht, einen Internet -Domain -Namen zu verwenden. Wenn das Unternehmen, in dem wir arbeiten, Magic.lnc ist und der Domainname des Unternehmens Magic C.com ist, sollte die Erklärung des Attributpakets lautet:
Paket com.magic.attr; Beachten Sie, dass die Bestandteile der Domänennamen hier in umgekehrter Reihenfolge des herkömmlichen Domainnamens angeordnet sind.
Wenn wir diese Idiom übernehmen, werden die von uns verwendeten Paketnamen mit Ausnahme des möglichen Konflikts innerhalb unserer Organisation nicht im Widerspruch zu anderen stehen. Wenn es in unserer Organisation tatsächlich einen Konflikt gibt (wahrscheinlich ein großes Unternehmen), können wir spezifischere Domainnamen verwenden, um sich weiter zu qualifizieren. Viele große Unternehmen haben interne Subdomains wie Ost und Europa, die verwendet werden können, um den Namen des Pakets weiter zu qualifizieren:
Paket corn.magic.japan.attr;
Die Verwendung dieser Lösung kann den Paketnamen sehr lang machen, aber es ist relativ sicher. Programmierer, die diese Technik verwenden, wählen nicht denselben Paketnamen, und Programmierer, die diese Technik nicht verwenden, wählen nicht den von uns verwendeten Namen.
Paketzugriff
Bei der Erklärung der Barrierefreiheit von Klassen auf höchstem Niveau und Schnittstellen auf der Top-Ebene in Paketen gibt es zwei Optionen: Paketzugriff (Paket) und öffentlicher Zugang (öffentlich). Klassen oder Schnittstellen, die mit der Öffentlichkeit geändert wurden, können mit Out-of-Package-Code zugegriffen werden, während Typen, die nicht mit der Öffentlichkeit dekoriert sind, Paketumfang haben: Sie können durch andere Codes im selben Paket zugegriffen werden. Aber sie sind auch für Out-of-Package-Codes versteckt, auch in Subpackage-Codes. Bei der Erklärung von Typen sollten wir nur die Typen deklarieren, die andere Programmierer als öffentlich verwenden müssen, und die Typen verbergen, die zu den Implementierungsdetails des Pakets gehören. Diese Technologie bietet uns große Flexibilität, und da Programmierer nicht auf diese Art von Implementierungsdetails angewiesen sind, auf die sie nicht zugreifen können, können wir sie frei ändern, wenn wir die Implementierungsdetails ändern möchten.
Klassenmitglieder, die nicht als öffentlich, geschützt oder privat erklärt werden, können direkt mit jedem Code innerhalb des Pakets zugegriffen werden, sind jedoch von außerhalb des Pakets versteckt. Mit anderen Worten, der Standardzugangsmodifikator ist "Paket", mit Ausnahme der Mitglieder der Schnittstelle, und der Standard -Zugriffsmodifikator ist "öffentlich".
Auf Felder oder Methoden, die in einem Paket nicht privat erklärt werden, können von allen anderen Code in diesem Paket zugegriffen werden, sodass Klassen im selben Paket als "freundlich" oder "vertrauenswürdig" gelten. Auf diese Weise können wir ein Anwendungsrahmen definieren, das vordefinierten Code und Platzhaltercode kombiniert, wobei der Platzhaltercode durch eine Unterklasse der Framework -Klasse überschrieben wird. Vordefinierte Codes können Paketzugriffsmodifikatoren verwenden, damit andere Kooperationscodes im Paket direkt auf sie zugreifen können. Bei Nutzern außerhalb des Packens sind diese Codes jedoch nicht zugänglich. Die Unterpackungen der Pakete, in denen sich diese Codes befinden, sind jedoch nicht vertrauenswürdig und umgekehrt. Beispielsweise kann der mit dem Paketzugriffsmodifikator im Paket DIT geänderte Code vom Code in seinem untergeordneten Paket dit.dat nicht zugegriffen werden und umgekehrt.
Daher definiert jeder Typ drei verschiedene Verträge:
Barrierefreiheit und Deckmethode
In Unterklassen können nur Methoden überschrieben werden, die in Superklassen zugänglich sind. Wenn auf eine Methode in der Superklasse nicht zugegriffen werden kann, kann die Methode nicht in der Unterklasse überschrieben werden, selbst wenn die Methode in der Unterklasse denselben Namen wie die Methode hat. Wenn eine Methode zur Laufzeit aufgerufen wird, berücksichtigt das System seine Zugänglichkeit und bestimmt somit fest, welche Implementierung ausgeführt wird.
Das folgende speziell konstruierte Beispiel wird deutlicher erklärt. Angenommen, wir deklarieren eine abstrakte Basisklasse im P1-Paket:
Paket P1; {Ab ab abab public Abstract Class AbstractBase private void pri () {print ("stractbase.pri ()"):} void pac () {print ("stractbase.pac ()");} geschütztes void prob () {print ("stractbase.pro ();} public void () {); void show () pri (); pac (); pro (); Pub (); }}In dieser Klasse definieren wir 4 Methoden mit jeweils einen anderen Zugriffsmodifikator, und der Körper der Methode identifiziert sich nur. Die Methode zeigt diese 4 Methoden auf dem aktuellen Objekt nacheinander auf. Bei der Anwendung dieser Methode auf verschiedene Subklassenobjekte kann erläutert werden, welche Implementierung dieser Methoden aufgerufen wird.
Jetzt definieren wir den Klassenbeton, der die AbstractBase -Klasse erweitert, sich jedoch im P2 -Paket befindet:
Paket P2; Import P1.abstractBase Public Class Concretel erweitert AbstractBase {public void pri () {print ("concretel.Pri ()");} public void pac () {print ("concretel.pac ()"); pub () {print ("concretel.pub ()");}}Die 4 Methoden in der Superklasse werden in dieser Klasse neu eingebracht und ihre Implementierungen werden geändert, was berichtet, dass sie zur Betrügerklasse gehören. Gleichzeitig wurden ihre Zugriffsrechte in die Öffentlichkeit geändert, damit andere Code zugreifen können. Führen Sie den folgenden Code aus
New Concretel (). Show ():
Die folgende Ausgabe wird erzeugt:
AbstractBase.Pri () AbstractBase.pac () Concretel.Pro () Concretel.pub ()
Da die private Methode PRI nicht durch Unterklassen (oder andere Klassen) zugegriffen werden kann, ruft die Show -Methode immer die Implementierung der PRI -Methode in der AbstractBase -Klasse auf. Auf die PAC -Methode mit Paketzugriffsberechtigungen in der AbstractBase -Klasse kann nicht von Concretel zugegriffen werden, so Die Pro -Methode und die Pub -Methode sind in der Betonklasse sowohl zugänglich als auch überschrieben, sodass die Showmethode die Implementierung dieser beiden Methoden in der Betonklasse aufruft.
Folgen Sie unserem Fuß, der Klasse Concrete2 bedeutet, um den Klassenbeton zu erweitern, und dann setzen wir es in das gleiche Paket P1 wie die AbstractBase -Klasse ':
Paket P1; Import P2.Concretel Public Class Concrete2 erweitert Concretel {public void pri () {print ("concrete2.Pri ()");} public void pac () {print ("concrete2.pac ()");} public void pro () {print ("concrete2.Pro ();}; }Da Methoden in Concretel öffentliche Zugriffsrechte haben, können sie in Concrete2 zugegriffen werden, und auf jede Methode in Beton2 deckt seine entsprechenden Methoden getrennt ab. Da Concrete2 und AbstractBase im selben Paket sind, kann auch die Methode AbstractBase.pac in Concrete2 zugegriffen werden, und auf die Methode Concrete2.pac kann überschrieben werden. Rufen Sie die Show -Methode im Concrete2 -Objekt auf, und das Druckergebnis lautet wie folgt:
AbstractBase.Pri () Concrete2.pac () Concrete2.Pro () Concrete2.pub ()
Schließlich definieren wir die Klasse Concrete3, um die Klasse Concrete2 zu erweitern und sie in Paket P3 zu setzen:
Paket P3 Import P1.Concrete2; public class Concrete3 extends Concrete2{ public void pri(){print("Concrete3.pri()");} public void pac Q{print("Concrete3.pac()");} public void pro(){print("Concrete3.pro()");} public void pub(){print("Concrete3.pub()");} } Call the show method on the Concrete3 -Objekt und das Druckergebnis lautet wie folgt: AbstractBase.Pri () Concrete3.pac () Concrete3.Pro () Concrete3.pub ()Hier schaut Methode concrete3.pac so aus, als ob es die unzugängliche AbstractBase.pac -Methode überschreibt, aber tatsächlich überschreibt Methode Concrete3.pac die Methode Concrete2.pac und Methode Concrete2.pac überschreibt die Methode AbstractBase.pac, so Methode concrete3.pac indirekt. Durch die Neuanklage der PAC -Methode in Klassenbeton2 als öffentliche Zugriffsberechtigungen kann sie von jeder Unterklasse zugegriffen und überschrieben werden. ''