Zugriffsrechte und Packages Allgemeine Informatik I Wintersemester 2013/14 Karsten Weihe Schnitt: Sascha Weiß Mit freundlicher Unterstützung des elc der TU Darmstadt
Komplexer Typ Klasse Interface
Standardbibliothek
Standardbibliothek java java.awt java.awt.color java.awt.font java.awt.geom java.lang java.lang.regex java.util javax org java.io
Standardbibliothek java.lang.string java.awt.graphics java.awt.color.color
Importieren import java.util.*; import java.awt.color.color; import java.awt.color.*;
Importieren import java.awt.graphics; Graphics graphic; // java.awt.graphics
Importieren import java.awt.*; Graphics graphic; Color color; // java.awt.graphics // java.awt.color.color
Importieren import java.awt.*; Graphics graphic; Color color; // java.awt.graphics // java.awt.color.color
Importieren import java.*; import java.lang.*; // Implizit importiert // Implizit importiert
Eigene Packages Am Anfang jeder Quelldatei, die zu meinpackage gehören soll, die Zeile: package meinpackage; Muss erste Zeile sein Nur eine package-zeile in jeder Quelldatei
Quelldatei in Package package meinpackage; class X {... } interface A {... }...
Quelldatei ohne Package Quelldatei ohne package-zeile? Ø Bildet für sich allein ein namenloses Package Ø Nur für kleine Spielereien sinnvoll Ø Alles Folgende gilt sinngemäß auch für Quelldateien ohne package-zeile
In jeder Quelldatei Eine public-klasse oder ein public- Interface Ø Außerhalb des Packages sichtbar Ø Klassenname = Dateiname Beliebig viele Hilfsklassen/-interfaces Ø Nicht außerhalb des Packages sichtbar
In jeder Quelldatei // Datei B.java: class A {... } public class B {... } class C {... }
Warum Packages? Aufeinander bezogene komplexe Typen bilden eine Gruppe Klassen / Interfaces sind durch diese Gruppierung leichter auffindbar Privilegierter Zugriff innerhalb des Packages Namenskonflikte kontrollierbar
Namenskonflikte Beispiel: X und Y exportiert von meinpackage1 X und Z exportiert von meinpackage2
Namenskonflikte import meinpackage1; import meinpackage2; Y y = new Y (); Z z = new Z (); X x = new X ();
Namenskonflikte import meinpackage1; import meinpackage2; meinpackage1.x x1 = new X (); meinpackage2.x x2 = new X ();
Namenskonflikte Zwei komplexe Typen mit demselben Namen: Im selben Package: geht gar nicht In unterschiedlichen Packages: mit Packagenamen vorneweg ok
Namenskonventionen Firmen und Institutionen: Der umgedrehte Domain-Name Unzulässige Zeichen è Underscore de.tu_darmstadt.informatik.algo.ai1
Zugriffsrecht: public public class X1 { public int a; public final double b = 3.14; public static Color c; public static final char D = A : }
Zugriffsrecht: public X1 z = new X1 (); z.a = 123; z.c = new Color ( Color.RED ); System.out.print ( z.a ); System.out.print ( z.b ); System.out.print ( z.c ); System.out.print ( z.d );
Zugriffsrecht: public X1 z = new X1 (); z.a = 123; z.c = new Color ( Color.RED ); System.out.print ( z.a ); System.out.print ( z.b ); System.out.print ( z.c ); System.out.print ( z.d );
Zugriffsrecht: public public class X2 { public int m1 () {... } public static double m2 () {... } public void m3 () {... } }
Zugriffsrecht: public X2 z = new X2 (); System.out.print ( z.m1() ); System.out.print ( z.m2() ); System.out.print ( X.m2() ); z.m3 ();
Zugriffsrecht: public X2 z = new X2 (); System.out.print ( z.m1() ); System.out.print ( z.m2() ); System.out.print ( X.m2() ); z.m3 ();
Zugriffsrecht: private public class X3 { private int a; private final double b = 3.14; private static Color c; private static final char D = A : }
Zugriffsrecht: private X3 z = new X3 (); z.a = 123; z.c = new Color ( Color.RED ); System.out.print ( z.a ); System.out.print ( z.b ); System.out.print ( z.c ); System.out.print ( z.d );
Zugriffsrecht: private X3 z = new X3 (); z.a = 123; z.c = new Color ( Color.RED ); System.out.print ( z.a ); System.out.print ( z.b ); System.out.print ( z.c ); System.out.print ( z.d );
Zugriffsrecht: private public class X4 { private int m1 () {... } private static double m2 () {... } private void m3 () {... } }
Zugriffsrecht: private X4 z = new X4 (); System.out.print ( z.m1() ); System.out.print ( z.m2() ); System.out.print ( X.m2() ); z.m3 ();
Zugriffsrecht: private X4 z = new X4 (); System.out.print ( z.m1() ); System.out.print ( z.m2() ); System.out.print ( X.m2() ); z.m3 ();
Zugriffsrecht: private class X5 { private int n; private void m1 () {... } public void m2 ( X5 a ) {... } }
Zugriffsrecht: private public void m2 ( X5 a ) { n = 1; m1 (); a.n = 2; a.m1 (); }
Zugriffsrecht: private public void m2 ( X5 a ) { n = 1; m1 (); a.n = 2; a.m1 (); }
Zugriffsrecht: protected public class X6 { public int n1; private int n2; protected int n3; public void m1 () {... } private void m2 () {... } protected void m3 () {... } }
Zugriffsrecht: protected public class Y { public void m4 () { X6 a = new X6 (); a.n1 = 1; a.n2 = 2; a.n3 = 3; } } // public // private // protected
Zugriffsrecht: protected public class Y { public void m5 () { X6 a = new X6 (); a.m1 (); a.m2 (); a.m3 (); } } // public // private // protected
Zugriffsrecht: protected public class Z extends X { public void m6 () { X6 a = new X6 (); a.n1 = 1; // public a.n2 = 2; // private a.n3 = 3; // protected!!! } }
Zugriffsrecht: protected public class Z extends X { public void m6 () { X6 a = new X6 (); a.m1 (); // public a.m2 (); // private a.m3 (); // protected!!! } }
Packages und Zugriffsrechte Sichtbarkeit von Attributen und Methoden: Mit public: überall sichtbar Mit private: nur innerhalb der Klasse Mit protected: im Package und in abgeleiteten Klassen Ohne alles: innerhalb des Packages
Packages und Zugriffsrechte In der Klasse Im ganzen Package In abgeleiteten Klassen Überall private --- protected public