Public/Private und wie importieren?

Status
Nicht offen für weitere Antworten.

A3XX

Bekanntes Mitglied
HI

Zwei Fragen wieder:

a) Was ist der Unterschied zwischen Publik und Private? Also eigentlich verstehe ich das schon, bezieht sich ja immer darauf wo man siche gerade befindet oder? Eine private Variable in einer Methode ist nur in der Methode zugänglich aber eine private Variable in der Klasse für die ganze Klasse gelle?
Kann man eigentlich in einer Methode eine Variable so publik machen, dass sie auch für andere Klassen zugänglich ist?

Und eigentliche Frage dazu:
Wieso muss man gewisse Methoden (wie z.B. paint oder z.b. actionPerformed) public machen?

b) was bedeutet der Stern beim importieren?
z.B. import java.awt.event.*
aber wieso schreibt man dann java.applet.Applet und nicht java.applet.*
?
 
B

Beni

Gast
Du kannst nie in eine Methode "hineingreiffen", deshalb kann man von aussen auch keine Variablen einer Methode sehen (kommt noch hinzu, dass diese Variablen nur existieren, wenn die Methode am arbeiten ist).

Diese Methoden müssen public sein, damit sie von anderen Klassen aufgerufen werden können. (oder woher wird denn wohl "paint" aufgerufen ?)

Der * bedeutet: alles was in diesem Package ist (einfach eine Schreibweise für die Faulenzer).

Und die letzte Frage: das macht jeder wie er will.
 

pogo

Bekanntes Mitglied
methode die public sind sind im komplette package sichtbar.
private methoden sind nur in der aktuellen klasse sichtbar.
 

L-ectron-X

Gesperrter Benutzer
Das Schlüsselwort, das sich auf die Klasse bezieht, in der man sich gerade befindet heißt "this".
private und public Variablen gibts in Java nur außerhalb von Methoden, also im Klassenrumpf.
Variablen in Methoden, den so genannten lokalen Variablen werden diese Schlüsselwörter nicht vorangesetzt. Das würde zu einem Compiler-Fehler führen. Lokale Variablen werden nach Beenden der Methode in der sie programmiert sind wieder zerstört.
Die Schlüsselwörter public und private regeln die Zugriffsrechte/Sichtbarkeiten auf Instanzvariablen und Methoden.
Ist eine Variable oder Methode als public deklariert, ist sie von "außen" sichtbar, und es kann auf sie zugegriffen werden. Ist eine Variable oder Methode als private deklariert kann sie nur innerhalb der Klasse benutzt werden. Zugriffe von "außen" werden dann mit einem Compiler-Fehler quittiert.
Es ist richtig und guter Programmierstil, wenn nur Methoden einer Klasse auf ihre Instanzvariablen Zugriff haben.
Das heißt, dass die Instanzvariablen privat deklariert werden und damit nur die Methoden der Klasse in der sie deklariert sind Zugriff auf sie haben. Die Methoden können dann private oder public deklariert werden, je nach dem, ob sie von "außen" benutzt werden sollen oder nicht.

Die paint()-Methode aus java.applet.Applet ist deshalb in Deinen Programmen public zu programmieren, weil Du Deine Applets eben von java.applet.Applet ableitest. Deine Applet-Klasse hat also alle Eigenschaften und Methoden der überschriebenen Originalklasse geerbt. Um die Fähigkeit der paint()-Methode in Deinem Applet zu nutzen, musst Du sie überschreiben. Dazu schreibst Du in Deinen Applets den genauen Wortlaut der Originalmethode.
Also:
Code:
public void paint(Graphics g) {
    //was die Methode machen soll
}
Wenn Du sie private machen würdest, hättest Du in diesem Moment eine neue Methode deklariert, die nichts mehr mit paint() aus java.applet.Applet zu tun hat. In diesem Fall dürfte der Compiler schon melden, dass die Methode verkehrt überschrieben wurde.
Kann man eigentlich in einer Methode eine Variable so publik machen, dass sie auch für andere Klassen zugänglich ist?
Nein, das geht nicht. Das könnte auch zu Inkonsistenzen führen und das Programm schlicht weg unbrauchbar machen.
was bedeutet der Stern beim importieren?
Das Sternchen ist ein Platzhalter und steht für alle Klassen innerhalb eines Packages.
Wenn Du also java.awt.* importierst, machst Du dem Java-Compiler damit alle in dem Package java.awt untergebrachten Klassen bekannt. Gäbe es das Sternchen nicht, müsste jede zu verwendende Klasse in Deinem Programm extra aufgerufen werden, was Dir mehr Tipparbeit beschert.

L-ectron-X
 

A3XX

Bekanntes Mitglied
Danke erstmal für eure umfangreichen Antworten. Aber zwei Dinge noch:

a) Ja ich brauche ja mit Paint dinge aus applet.applet etc. Aber wenn ich paint private mache heisst das ja nur, dass paint einfach in dieser Klasse gebraucht werden kann aber das importieren und überschreiben sollte docha u so klappen? Das kapier ich nicht ganz wieso die public seni muss. Nur weil sie Dinge aus einer anderen Klasse erbt? Dann muss doch einfach die andere Methode public sein oder?! Da hab ich vermutlich nen Denkfehler aber bitte helft mir da auf die Sprünge :)

b) Ok das mit dem Sternchen dacht ich mir so, weil in MySQL ist es dasselbe (* = alles). Aber wieso importiert dann der autor java.awt.* und java.awt.event.*? Eigentilch sollte java.awt.* doch die event Dinge schon haben oder? Und wenn man das * benutzt, gibt es da nicht performanceeinbussen, wenn man nicht genau das richtige package importiert und stattdessen einfach kollektiv alles?
 
B

bygones

Gast
A3XX hat gesagt.:
a) Ja ich brauche ja mit Paint dinge aus applet.applet etc. Aber wenn ich paint private mache heisst das ja nur, dass paint einfach in dieser Klasse gebraucht werden kann aber das importieren und überschreiben sollte docha u so klappen? Das kapier ich nicht ganz wieso die public seni muss. Nur weil sie Dinge aus einer anderen Klasse erbt? Dann muss doch einfach die andere Methode public sein oder?! Da hab ich vermutlich nen Denkfehler aber bitte helft mir da auf die Sprünge :)
Jede Methode die du überschreiben willst muss die selbe Signatur haben wie die zu überschreibende Klasse. D.h. eine public Methode zu überschreiben heißt das die Methode in deiner Klasse auch public sein muss.

A3XX hat gesagt.:
b) Ok das mit dem Sternchen dacht ich mir so, weil in MySQL ist es dasselbe (* = alles). Aber wieso importiert dann der autor java.awt.* und java.awt.event.*? Eigentilch sollte java.awt.* doch die event Dinge schon haben oder? Und wenn man das * benutzt, gibt es da nicht performanceeinbussen, wenn man nicht genau das richtige package importiert und stattdessen einfach kollektiv alles?
Weil du mit dem * nur die Klassen in dem angebenen package, aber nicht deren unterpackages importierst !
 

L-ectron-X

Gesperrter Benutzer
OK, noch mal.
In der Klasse java.applet.Applet gibts eine Methode paint(), die dort bereits schon ererbt wurde. Nämlich von java.awt.Panel. Die erbte von java.awt.Container. Container erbte ihrerseits die paint()-Methode von java.awt.Component.
In allen Fällen ist die Methode public und muss, wenn sie in Deiner Klasse überschrieben werden soll, ebenfalls public sein. Wenn Du statt dessen die Methode als private deklarierst bekommst Du einen Compiler-Fehler. Beim Überschreiben von Methoden muss die Signatur und der Rückgabewert der überschriebenen Methode gleich der Signatur und dem Rückgabewert der Originalmethode sein. Als private deklarierte Methoden in einer Basisklasse können nicht überschrieben werden, da sie in der abgeleiteten Klasse (Subklasse) nicht sichtbar sind.
Code:
public void paint(Graphics g)
zu b)
Das Sternchen steht für die Klassen in einem Package nicht für weitere Packages die in diesem Package implementiert sind. Daher werden mit der Import-Anweisung...
Code:
import java.awt.*;
...auch nur die Klassen des AWT-Packages importiert. Die Klassen im darunterliegenden java.awt.event-Packages sind dem Compiler bis dahin noch verborgen.
Es kommt auch nicht zu Performance-Einbußen oder dazu dass die Klassen mehr Speicherplatz benötigen, wenn man die Klassen mit einem Sternchen importiert. Es geht hier nur um Bequemlichkeit.
Wenn man vom Importieren spricht, meint man eigentlich das Bekanntmachen von Klassen, die man benutzen möchte. Der Compiler erfährt nur, wo er die verwendeten Klassen findet, mehr nicht.

L-ectron-X
 
B

bygones

Gast
L-ectron-X hat gesagt.:
Es kommt auch nicht zu Performance-Einbußen oder dazu dass die Klassen mehr Speicherplatz benötigen, wenn man die Klassen mit einem Sternchen importiert. Es geht hier nur um Bequemlichkeit.
Wenn man vom Importieren spricht, meint man eigentlich das Bekanntmachen von Klassen, die man benutzen möchte. Der Compiler erfährt nur, wo er die verwendeten Klassen findet, mehr nicht.
Und wenn überhaupt dann ja nur beim compilieren, beim ausführen spielen die import anweisungen doch keine Rolle mehr - oder :?: ???:L
 

L-ectron-X

Gesperrter Benutzer
Die import-Anweisungen spielen beim Ausführen des Programmes keine Rolle, denn da hat der Compiler schon ein lauffähiges Programm erstellt um das sich jetzt der Interpreter kümmert. Hier ist der ClassPath und das JRE interessant.
Import-Anweisungen können in einem Quelltext angegeben werden, um sich viel Schreiberei zu ersparen.
Code:
import java.awt.*;

public class MyClass extends Frame {
//was das Programm tun soll
}
...ist das gleiche wie...
Code:
public class MyClass extends java.awt.Frame {
//was das Programm tun soll
}
Man muss im zweiten Beispiel eben nur immer die Packages angeben aus denen die Klassen stammen, die man benutzt.

L-ectron-X
 

Semox

Bekanntes Mitglied
Hallo L-ectron-X und Forum

Was ich dann nicht verstehe ist, wieso macht man sich dann überhaupt jemals die Mühe die Packages anzugeben wenn das nur bis kurz vor dem Compiler reichen soll?

Welcher Grund steht dem vor, daß die Java Entwickler die Paketangabe nicht längst hinausgeschmissen haben? Es muß einen Grund geben... Ich hoffe jemand mir kann das erklären. (-:

Liebe Grüße
SemoX
 

Fu3L

Top Contributor
Semox hat gesagt.:
Hallo L-ectron-X und Forum

Was ich dann nicht verstehe ist, wieso macht man sich dann überhaupt jemals die Mühe die Packages anzugeben wenn das nur bis kurz vor dem Compiler reichen soll?

Welcher Grund steht dem vor, daß die Java Entwickler die Paketangabe nicht längst hinausgeschmissen haben? Es muß einen Grund geben... Ich hoffe jemand mir kann das erklären. (-:

Liebe Grüße
SemoX

Such mal in der Java-api nach der Klasse Date. Du wirst nicht nur eine finden. Welche soll der Compiler also nehmen? java.util.Date? java.sql.Date? Deshalb sagst du dem Compiler explizit, welche du haben möchtest, entweder durch

Code:
java.util.Date datum = new java.util.Date();

oder halt

Code:
import java.util.Date;
 

Murray

Top Contributor
Packages schaffen Namensräume - so schafft man es, dass jeder Java-Entwickler seine Klasse nennen kann, wie er will: solange er ein eindeutiges Package verwendet, gibt es keine Nameskonflikte.
Gäbe es keine Packages, dann könnte es weder im JDK zwei Lists geben (java.awt.List und java.util.List), noch dürfte irgendwo auf der Welt jemand eine Klasse names List schreiben. Und noch schlimmer: SUN könnte niemals neue Klassen einführen, ohne Gefahr zu laufen, dadurch irgendein Programm auf der Welt nicht mehr funktionieren zu lassen, weil dort bereits eine Klasse dieses Namens existiert.
 

Schandro

Top Contributor
Beim Überschreiben von Methoden muss die Signatur und der Rückgabewert der überschriebenen Methode gleich der Signatur und dem Rückgabewert der Originalmethode sein. Als private deklarierte Methoden in einer Basisklasse können nicht überschrieben werden, da sie in der abgeleiteten Klasse (Subklasse) nicht sichtbar sind.
Eine kleine Ergänzung dazu:
Code:
public class DeleteMe{
	public static void main(String[] args){

		new A(){
			public void überschreibMich(){}
		};
		new A(){
			protected void überschreibMich(){}
		};

		/*new A(){ // einziges was nicht geht
			private void überschreibMich(){}
		};*/


		new InnerA(){
			public void überschreibMich(){}
		};
		new InnerA(){
			private void überschreibMich(){}
		};
		new InnerA(){
			protected void überschreibMich(){}
		};
	}

	static class InnerA{
		private void überschreibMich(){}
	}
}

abstract class A{
	protected abstract void überschreibMich();
}

Die Sichtbarkeitstufe muss gleich oder höher sein zum überschreiben.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Methoden Vererbung private Attribute/public Methoden Java Basics - Anfänger-Themen 4
J Klasse wird als private erkannt obwohl sie public deklariert ist Java Basics - Anfänger-Themen 3
D Klassenvariablen standardmäßig private oder public? Java Basics - Anfänger-Themen 2
B public/private nur 1x schreiben Java Basics - Anfänger-Themen 3
T public-private problem Java Basics - Anfänger-Themen 5
K Kapselung public / private verständis problem Java Basics - Anfänger-Themen 17
N public class -> public method -> variable private? Java Basics - Anfänger-Themen 10
G field public/private wann Java Basics - Anfänger-Themen 11
J Public / Private Keys speichern bzw. lesen? Java Basics - Anfänger-Themen 8
G GUI Controls private oder public Java Basics - Anfänger-Themen 6
G Variablen public oder private? Java Basics - Anfänger-Themen 9
S private public Java Basics - Anfänger-Themen 5
R private / public Frage Java Basics - Anfänger-Themen 7
G Public ,private,protected Java Basics - Anfänger-Themen 1
A public/private/etc. Zusatz weglassen Java Basics - Anfänger-Themen 2
U public, private, protected und "default access" - Java Basics - Anfänger-Themen 14
H private anstatt public Java Basics - Anfänger-Themen 2
H public und private Java Basics - Anfänger-Themen 5
C Kann mir jemand sagen warum public void unzulässig ist? Java Basics - Anfänger-Themen 2
Say public/default Interface Java Basics - Anfänger-Themen 9
berserkerdq2 Habe eine Klasse, welche public ist, diese hat eine public Methode, die nicht static ist. Wenn ich nun versuche aufzurufen Probleme? Java Basics - Anfänger-Themen 8
Denix The public type Main must be defined in its own fileJava(16777541) Java Basics - Anfänger-Themen 13
melaniemueller Datenkapselung Sichtbarkeit public Java Basics - Anfänger-Themen 4
NaZuRe Geld(Wert) von der public static void main in die public static void Blackjack Java Basics - Anfänger-Themen 2
S public static boolean Java Basics - Anfänger-Themen 4
Vamecruft Compiler-Fehler public static void zu static String ändern Java Basics - Anfänger-Themen 2
D public ArrayList(Collection<? extends E> c); Java Basics - Anfänger-Themen 2
J Methoden Methoden einer public class AutoCompleteTextField verwenden Java Basics - Anfänger-Themen 14
G Klassen Mit fremder Klasse auf public Methode zugreifen Java Basics - Anfänger-Themen 23
C Was macht `public class ClassName<T extends Comparable<T>>`? Java Basics - Anfänger-Themen 14
Javafan01 Dateiname und Public class Java Basics - Anfänger-Themen 4
C Methoden Unterschied zwichen public int, public static int und public static void Java Basics - Anfänger-Themen 2
A Methoden Unterscheid zwischen public und ohne Java Basics - Anfänger-Themen 9
J Frage zu: public static void main (String[]args) Java Basics - Anfänger-Themen 1
L RSA Public Key einlesen Java Basics - Anfänger-Themen 0
K Public Attribute oder getter - funktioniert leider beides hier nicht Java Basics - Anfänger-Themen 5
V Was bewirkt das Schlüsselwort extends in Verbindung mit class bzw. public class ? Java Basics - Anfänger-Themen 2
I Methoden public void paintComponent (Graphics g) Java Basics - Anfänger-Themen 4
M public static int in ActionListener Java Basics - Anfänger-Themen 6
L Was genau macht "public static void" ? Java Basics - Anfänger-Themen 12
B ja ja schon wieder einer mit einer public static void main(string[] args) Frage... Java Basics - Anfänger-Themen 8
D neue public static class variablen in array speichern? Java Basics - Anfänger-Themen 6
T Variablen Getter-Setter vs Public Variable? Java Basics - Anfänger-Themen 5
K modifier public Java Basics - Anfänger-Themen 3
T Wie vergleiche ich die Jahre aus der while Schleife die in ( public class) fuer cbx geschrieben sind Java Basics - Anfänger-Themen 5
W Klassen Fehler bei public void setLabelText(JLabel label, String text) Java Basics - Anfänger-Themen 11
T Java Code Hilfe - public void xxx() Java Basics - Anfänger-Themen 2
T public void - Problem Java Basics - Anfänger-Themen 10
R public static void Rückgabe Java Basics - Anfänger-Themen 5
P Compiler-Fehler public static void main, Grundloses Problem Java Basics - Anfänger-Themen 4
N Java UML: Eine Frage zu public-Variablen Java Basics - Anfänger-Themen 19
P Erste Schritte public oder static oder wie? Java Basics - Anfänger-Themen 7
J public enum? in Java Java Basics - Anfänger-Themen 9
C Erste Schritte felder, die public final sind Java Basics - Anfänger-Themen 6
B main methode ohne public Java Basics - Anfänger-Themen 5
W Frage public protected konstruktor Java Basics - Anfänger-Themen 6
V public Variablen vs Getter + Setter Java Basics - Anfänger-Themen 4
S Frage zu public static Java Basics - Anfänger-Themen 29
J "public int x" - Zugriff von anderer Klasse (selbes Package) nicht möglich?! Java Basics - Anfänger-Themen 4
E Methoden public static void main(String[] args) Java Basics - Anfänger-Themen 9
O Was bedeutet public class value? Java Basics - Anfänger-Themen 3
I Methoden Problem If/Else; Public Void Java Basics - Anfänger-Themen 6
S Warum sind Attribute der Klasse java.awt.Point public? Java Basics - Anfänger-Themen 3
K OOP Attribute von Klasse in die public class übertragen? Java Basics - Anfänger-Themen 7
T Kapselung: public-Methoden in protected-Klassen Java Basics - Anfänger-Themen 3
F public variable erstellen, & darauf zugreifen Java Basics - Anfänger-Themen 12
B Variablen Variablen in try / catch "public" machen? Java Basics - Anfänger-Themen 3
X enum Fehlermeldung "The public type Day must be defined in its own file" Java Basics - Anfänger-Themen 8
B Public boolean einfügen Java Basics - Anfänger-Themen 12
R jLabel lässt sich nicht public setzen?? Java Basics - Anfänger-Themen 15
Hamstinator public static. Gute Idee? Java Basics - Anfänger-Themen 6
-horn- public static double[][][] NAME() nur per RETURN Wertrückgabe möglich? Java Basics - Anfänger-Themen 20
S Public-Klassen und Dateien Java Basics - Anfänger-Themen 5
StickToFreak Fehler mit public class Java Basics - Anfänger-Themen 13
K konstruktur als public definieren Java Basics - Anfänger-Themen 11
StickToFreak public class problem ôÔ Java Basics - Anfänger-Themen 3
H eine als public deklariete Variable wird nicht gefunden Java Basics - Anfänger-Themen 6
T Konstruktor mit oder ohne public-Bezeichner? Java Basics - Anfänger-Themen 4
T Geht so was? public void verkaufe (<X implements Produkt& Java Basics - Anfänger-Themen 8
P immer "public class". ? Java Basics - Anfänger-Themen 4
A kein zugriff auf variable trotz public? Java Basics - Anfänger-Themen 3
C public static void main(String[] args) Java Basics - Anfänger-Themen 6
D Frage zu public static void main. Java Basics - Anfänger-Themen 4
J public class Java Basics - Anfänger-Themen 15
N Wann muss eine Methode - protected sein wann public wann. Java Basics - Anfänger-Themen 5
G Vor oder hinter public static void main. ? Java Basics - Anfänger-Themen 8
G (Anfängerproblem) Problem mit dem Aufruf von public-Methoden Java Basics - Anfänger-Themen 3
O Unterschied zwischen static und public Java Basics - Anfänger-Themen 2
D Zugriff auf attribut anderer Klasse privat/public? Java Basics - Anfänger-Themen 9
B Warum manchmal public class und manchmal nur class Java Basics - Anfänger-Themen 3
A Javadoc nur bei public Klassen? Java Basics - Anfänger-Themen 3
T rotes herz public void paint(Graphics g) Java Basics - Anfänger-Themen 2
G Was ist public static void main(String[] args)? Java Basics - Anfänger-Themen 12
P public enum ";"expected Java Basics - Anfänger-Themen 7
B public und protected Java Basics - Anfänger-Themen 11
G <identifier> expected bei public void final Java Basics - Anfänger-Themen 3
R public Klassen Java Basics - Anfänger-Themen 12
I public Verständnisfrage Java Basics - Anfänger-Themen 5
F Warum sind Interface-Methoden public? Java Basics - Anfänger-Themen 19
C public void keyPressed(KeyEvent e) Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben