Konstruktoren Sichtbarkeit

babuschka

Top Contributor
Hallo Community,
hier in diesem Fall gibt es verschiedene Pakete, die zum Schluss über die Main Methode dann wieder "verknüpft" werden damit gewisse sachen passieren können. Um dies machen zu können muss man ja die einzelnen Pakete importieren wenn es notwendig ist. Und die Konstruktoren müssen public sein, damit sie überhaupt gefunden werden können. Nun meine Frage müssen die Konstruktoren auch public sein, obwohl z.B. alle Klassen in einem Paket sind, damit sie sichtbar sind? Also die Importierung der Pakete fällt dann weg. Aber das mit public bringt mich durcheinander. Bitte um Antwort.

Beispiel: Strategy Muster

Java:
Interface Beissen(für Beissverhalten):

Interface: Beissverhalten
package beissen;

public interface Beissen {

    void beissen();
}


Beisst(implementiert Interface Beissen)

package beissen.beissverhalten;
import beissen.Beissen;

public class Beisst implements Beissen{

    public Beisst(){
    }

    public void beissen() {
        System.out.println("Ich kann beissen!");
    }
}



BeissNicht (implementiert Interface Beissen):

package beissen.beissverhalten;
import beissen.Beissen;

public class BeisstNicht implements Beissen{

    public BeisstNicht(){
    }
    
    public void beissen() {
        System.out.println("Ich kann nicht beissen!");
    }
}



Interface Bellen (Für Bellverhalten):

package bellen;

public interface Bellen {

    void bellen();
}



Bellt (implementiert Interface Bellen):

package bellen.bellverhalten;
import bellen.Bellen;

public class Bellt implements Bellen{

    public Bellt(){
    }

    public void bellen() {
        System.out.println("Ich kann bellen!");
    }
}



BelltNicht(implementiert Interface Bellen)

package bellen.bellverhalten;
import bellen.Bellen;

public class BelltNicht implements Bellen{

    public BelltNicht(){
    }

    public void bellen() {
        System.out.println("Ich kann nicht bellen!");
    }
}



Hund (abstract ist die Basisklasse):

import bellen.Bellen;

public abstract class Hund {

    Bellen bellen;
    Beissen beissen;

    public abstract void anzeigen();

    public Hund(){
    }

    public Hund(Beissen beissen, Bellen bellen){
    this.beissen=beissen;
    this.bellen=bellen;
    }

    public void drucke1(){
    beissen.beissen();
    }

    public void drucke2(){
    bellen.bellen();
    }

    public void setBeissen(Beissen beissen) {
        this.beissen = beissen;
    }

    public void setBellen(Bellen bellen) {
        this.bellen = bellen;
    }
}



Pekinese (erbt von Hund):

package hund.hundArt;
import hund.Hund;

public class Pekinese extends Hund {

    public Pekinese(){

    }

    @Override
    public void anzeigen() {
        System.out.println("Ich bin Pekinese!");
    }
}



Pitbull (erbt von Hund):

package hund.hundArt;
import hund.Hund;

public class Pitbull extends Hund{

    public Pitbull(){
    }

    @Override
    public void anzeigen() {
        System.out.println("Ich bin Pitbull!");
    }
}



Main Methode:

package strategyhund;

import beissen.beissverhalten.BeisstNicht;
import bellen.bellverhalten.BelltNicht;
import hund.Hund;
import hund.hundArt.Pekinese;

public class Main {

    public static void main(String[] args) {
    Hund meinHund1=new Pekinese();
    meinHund1.anzeigen();

    meinHund1.setBeissen(new BeisstNicht());
    meinHund1.setBellen(new BelltNicht());

    meinHund1.drucke1();
    meinHund1.drucke2();
    }
}
 

nrg

Top Contributor
public -> überall sichtbar
protected -> für die Kindklassen sichtbar
"nichts" -> im Package sichtbar
private -> nur in der eigenen Klasse sichbar (gekapselt)
 

function

Bekanntes Mitglied
ok also der konstruktor muss public sein, wenn du ihn von überall aufrufen willst. wenn alle klassen im gleichen package liegen kannst du ihn auch protected setzen, dadurch kann er nur innerhalb des packages aufrufen. private kann man ihn setzen allerdings kann dadurch das objekt nicht mehr initialisiert werden, bietet sich zb an wenn alle methode der klasse statisch sind...
 

martin2p

Mitglied
Hallo!

Sorry dass ich das Thema nochmals aufgreife aber ich beschäftige mich derzeit ebenfalls mit der Sichtbarkeit Protected und habe festgestellt dass die Aussage das Methoden die mit dem Zugriffsoperator protected versehen sind nur zum Teil in abgeleitetend Klassen in anderen Packages benutzt werden können.

Dies betrifft "normale" Methoden, da funktioniert es bei mir tadellos. Bei Konstruktoren wiederum funktioniert es bei mir nicht - obwohl dieser ja auch eine Methode darstellt.

Ist des so gewollt?

Java:
package tiere1;

public class Ziege {

    public int gewicht;
    public String geschlecht;
    
    //Konstruktor:
    protected Ziege(int gewicht, String geschlecht) {
        this.gewicht = gewicht;
        this.geschlecht = geschlecht;
    }
    
    //Methode:
    protected void ausgabe() {
        System.out.println("Ausgeben");
    }
}


Code:
package tiere2;
import tiere1.Ziege;

public class Geislein extends Ziege {
    
    int alter;
    
    //eigener Konstruktor:
    protected Geislein(int gewicht, String geschlecht, int alter) {
        super(gewicht, geschlecht);
        this.alter = alter;       
    }
    
    public static void main(String[] args) {
        
        //Konstruktor Aufruf:
        Ziege bambi = new Ziege(20, "Geislein");
        
        Geislein geislein = new Geislein(10, "Geislein", 5);
        
        //Methode Aufruf
        geislein.ausgabe();   
  }
}

-> jetzt kreidet mir die IDE an das "new Ziege(20, "Geislein");" nicht sichtbar sei und auf public geändert werden müsse.


Grüße, Martin.
 

martin2p

Mitglied
Hallo :)
ja wenn ich die Sichtbarkeit vom Konstruktor im Package tiere1 auf public setze kann ich diesen auch im Package tiere2 nutzen.

Aber genau das wundert mich:
Wieso darf der Konstruktor in diesem Falle nicht protected sein aber eine gewöhnlich Methode schon? (Wenn ich sie in einem anderen Package nutzen möchte.)
 

martin2p

Mitglied
Ich habe noch etwas recherchiert... offenbar müssen Konstruktoren immer auf public gesetzt werden, wenn sie von außerhalb aufgerufen werden sollen, da sie spezielle Methoden sind.

Da sie von außen erreichbar sein müssen, mag man vermuten, dass Konstruktoren immer public deklariert werden. Dies ist im 'Normalfall' auch so. Es gibt jedoch auch Ausnahmen. Ein Beispiel dafür ist der Konstruktor eines Singletons, der private deklariert und über eine statische Methode aufgerufen wird. Siehe hierzu den Artikel unter → Design Patterns/Singleton-Pattern.

Würde mich trotzdem mal interessieren warum wieso weshalb
 

KonradN

Super-Moderator
Mitarbeiter
Würde mich trotzdem mal interessieren warum wieso weshalb
Also aus meiner Sicht sind da nicht wirklich Unterschiede.

Der Zugriff auf den Konstruktor, der erlaubt ist, ist aus der eigentlichen Klasse heraus. Also Geisslein kann von Ziege erben und da kann dann der Konstruktor den protected Konstruktor nutzen per super Aufruf. Du kannst aber nicht das new Ziege(..) in Geisslein nutzen, denn darauf kannst Du eben nicht zugreifen.

Aber das ist doch bei anderen Dingen auch so, also egal ob Methode oder Feld. Machen wir einfach ein kleines Beispiel:

Nehmen wir eine Super Klasse "Parent" mit protected Elementen in pkg1:
Java:
package pkg1;

public class Parent {

    protected String field;

    protected Parent() {}
    
    protected void method() {}
}

Dann eine abgeleitete Klasse Child, die von Parent erbt. Dadurch erbt sie auch die protected Element und kann darauf Zugreifen. Aber das sind sozusagen die Zugriffe über die neue Klasse und nicht über die Parent Klasse selbst:

Java:
package pkg2;

import pkg1.Parent;

public class Child extends Parent {

    public Child(Parent parent) {

        // Erlaubte Zugriffe auf protected Elemente der Super Klasse
        super();
        this.field = "Test";
        method();

        // Nicht erlaubte Zugriffe auf protected Elemente der Super Klasse:
        //Parent newParent = new Parent();
        //parent.field = "test";
        //parent.method();
    }
}

Du kannst also die Kommentare entfernen und schauen, was für Fehler du bekommst -> Das Verhalten gleicht sich aus meiner Sicht durchaus.

Wenn man möchte, dann kann man das auch nachlesen. In der JLS findet sich das in 6.6.2. Details on protected Access
 

Marinek

Bekanntes Mitglied
Also aus meiner Sicht sind da nicht wirklich Unterschiede.

Da gibt es auch keine unterschiede. Keine Ahnung, was die IDE von @martin2p hier macht oder nicht, aber

Aber genau das wundert mich:
Wieso darf der Konstruktor in diesem Falle nicht protected sein aber eine gewöhnlich Methode schon? (Wenn ich sie in einem anderen Package nutzen möchte.)

Der Konstruktor der Elternklasse ist in einem anderen Paket und protected. Also kann man darauf nicht zugreifen.

Der Konstrukturor der Kindklasse befindet sich im gleichen Package, wie die Main Methode. Daher kann ich darauf zugifen.

Wegen der Vererbung kann nun auf die Methode "ausgabe()" zugegriffen werden, weil die Kindklasse darauf zugriff hat, aufgrund der Vererbung UND die Methode sich damit im gleichen Package befindet aus sicht der main-Methode.

Das funktioniert ja mit sem super() aufruf auch.

Sehe hier insgesammt keinen unterschied bei Konstruktoren und Methoden.
 
Zuletzt bearbeitet:

martin2p

Mitglied
Hallo :)

vielen Dank für die Antworten. Ich benutze nun vermehrt Eclipse sowie vorher Visual Studio Code - beide zeigen mir diese Meldung an wegen der Sichtbarkeit.

Du kannst aber nicht das new Ziege(..) in Geisslein nutzen, denn darauf kannst Du eben nicht zugreifen.

Und genau das macht anscheinend die Konstruktor-Methode speziell im Vergleich zu anderen Methoden.

Ich werde vorerst dabei bleiben und den Konstruktor auf public belassen wenn ich diesen brauche um neue Instanzen in anderen Packages zu erstellen.

Also Geisslein kann von Ziege erben und da kann dann der Konstruktor den protected Konstruktor nutzen per super Aufruf.
Genau des habe ich bei Geislein gemacht, gell.
Ich dachte halt nur dass der gewöhnliche Aufruf des Eltern-Konstruktors mit dem "new" - Schlüsselwort auch als protected funktioniert. Weil ja im Internet und auch in meinem Lernheft die allgemeine Aussage herrscht:

Protected: Zugriff aus anderem Paket? Ja aber nur über abgeleitete Klassen
Hier fehlt es quasi an einer genaueren Erläuterung für Anfänger wie mich ;-)

Denn der Anfänger denkt: Das quasi nach Logik der Vererbung mir in der Kindklasse alles genau so zur Verfügung steht wie in der Elternklasse und ich die selbe Ausdrucksweise anwenden kann :)

Aber des geht mit protected in dieser Form nicht.

Vielen Dank an euch! :)
 

Nouser

Mitglied
Hier fehlt es quasi an einer genaueren Erläuterung für Anfänger wie mich
Steht in der JLS für diejenigen, die es ganz genau wissen wollen.
Demzufolge kannst du einen protected Konstruktor mit
a) super() aufrufen (wie schon von anderen gesagt)
b) der Instanziierung einer anonymen Klasse.
Java:
Ziege bambi = new Ziege(20, "Geislein") {};
 

martin2p

Mitglied
Hallo,

ich habe jetzt geschnallt wie es mit dem protected Konstuktor in der Kindklasse funktioniert - ich musste noch etwas rumprobieren:

Java:
//Aufruf des protected Konstruktors aus Elternklasse
    public Geislein(Ziege papa) {
        super(10, "männlich");
    }

Jetzt meckert die IDE auch nicht mehr rum, jedoch kann ich die Instanz namens papa mit dem Gewicht von 10 und geschlecht männlich nicht in der Konsole ausgeben lasssen :(

Also in der Mainmethode der Kindklasse kennt es diese variable "papa" nicht, obwohl der Konstruktor auf public eingestellt ist.

Methode aus der Elternklasse:
Code:
//Methode:
    public void ausgabe() {
        System.out.println("Ausgeben");
    }

In der Kindklasse:
Code:
public static void main(String[] args) {
        
        //Aufruf des Konstruktors der Kindklasse:
        Geislein geislein = new Geislein(10, "weiblich", 5);
        
        //Methode Aufruf
        geislein.ausgabe();
        papa.ausgabe();  ->funktioniert nicht, papa wird nicht gefunden.
 

KonradN

Super-Moderator
Mitarbeiter
Also Du wirfst hier extrem viel durcheinander ...

Erst einmal der Ziege Parameter: Das ist vermutlich von meinem Beispiel übernommen und da war dies nur hinzugefügt, um aufzeigen zu können, dass auf die protected Members einer Instanz der Super-Klasse auch nicht zugegriffen werden kann. Also dass das Verhalten von dem Konstruktor dem Verhalten von den Klassen-Members gleicht. In der Regel macht so ein Parameter keinen Sinn (Es sei denn, Du hast sowas wie ein Copy Constructor. Und das macht dann auch nur Sinn, wenn Du auch einen entsprechenden Konstruktor in der Super Klasse hast. Und dann wäre das etwas wie:
Java:
    public Geislein(Ziege papa) {
        super(papa);
    }

Also in der Mainmethode der Kindklasse kennt es diese variable "papa" nicht, obwohl der Konstruktor auf public eingestellt ist.
Wie soll es die auch geben. Das war ja auch nur ein Parameter eines Konstruktors. Der Gültigkeitsbereich von Parametern sollte bekannt sein. Und das hat nichts mit der Sichtbarkeit von Konstruktoren oder Membern einer Klasse zu tun.
 

martin2p

Mitglied
Okay ich begebe mich hier in Java-Tiefen die momentan noch zu viel für mich sind ;-)

Wie soll es die auch geben. Das war ja auch nur ein Parameter eines Konstruktors. Der Gültigkeitsbereich von Parametern sollte bekannt sein. Und das hat nichts mit der Sichtbarkeit von Konstruktoren oder Membern einer Klasse zu tun.

Stimmt Parameter lassen sich schlecht mit einer Method ausgeben, des wird mir jetzt auch bewusst. Ich hatte dies garnicht als solche in dem Augenblick erkannt, da ich Parameter nur in Form von typendeklaration + bezeichner in Klammern hinter einer Methode und Konstruktor kenne.

Hinweg ist die Freude über den rotlosen Quelltext 😂
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Verschiedene Konstruktoren mit gleichen Datentypen Java Basics - Anfänger-Themen 8
C Konstruktoren und Variablen Java Basics - Anfänger-Themen 42
lougoldi Verkettung von Methoden und Konstruktoren Java Basics - Anfänger-Themen 4
J Konstruktoren und Grafik Java Basics - Anfänger-Themen 3
A Cannot find symbol mit Konstruktoren Java Basics - Anfänger-Themen 27
L Brauche Hilfe beim arbeiten mit Konstruktoren Java Basics - Anfänger-Themen 20
C Objekte und Konstruktoren Java Basics - Anfänger-Themen 2
M Methodenaufrufe im Konstruktoren Java Basics - Anfänger-Themen 31
A Konstruktoren Vererbung Java Basics - Anfänger-Themen 3
W Vererbung, abstract und Konstruktoren Java Basics - Anfänger-Themen 30
M Vererbung Konstruktoren mit festen Werte Java Basics - Anfänger-Themen 2
F Mehrere Konstruktoren? Wofür? Java Basics - Anfänger-Themen 21
J Konstruktoren in Initialisierungsblöcke Java Basics - Anfänger-Themen 6
T Konstruktoren Java Basics - Anfänger-Themen 25
D was bedeutet this. bei Konstruktoren? Java Basics - Anfänger-Themen 4
C Konstruktoren und Vererbung Java Basics - Anfänger-Themen 2
C Die Klasse Menge mit Konstruktoren und einfachen Methoden Java Basics - Anfänger-Themen 5
F Mehrere Konstruktoren Java Basics - Anfänger-Themen 10
G Was ist der Nutzen von generischen Konstruktoren? Java Basics - Anfänger-Themen 4
Q Methoden Konstruktoren anlegen Java Basics - Anfänger-Themen 5
B Objekte in Konstruktoren übergeben Java Basics - Anfänger-Themen 5
D Zähler nicht sichtbar (Thema: Konstruktoren) Java Basics - Anfänger-Themen 2
A Überladen von Konstruktoren Java Basics - Anfänger-Themen 2
V Konstruktoren Java Basics - Anfänger-Themen 15
C Klassen StackOverflow bei erster Nutzung von Klassen/Konstruktoren Java Basics - Anfänger-Themen 9
F Konstruktoren Java Basics - Anfänger-Themen 4
M Erste Schritte Verständnis Problem Konstruktoren Java Basics - Anfänger-Themen 13
Y Klassen, Vererbung, Konstruktoren Java Basics - Anfänger-Themen 13
B Klassen Unterschied Konstruktoren. Java Basics - Anfänger-Themen 3
C Erste Schritte Konstruktoren verstehen Java Basics - Anfänger-Themen 7
W OOP Konstruktoren Erklärung Java Basics - Anfänger-Themen 14
N Abarbeitungsreihenfolge von Konstruktoren Java Basics - Anfänger-Themen 12
O Klassen und Konstruktoren Java Basics - Anfänger-Themen 7
V Konstruktoren -> Funktionsaufrufe Java Basics - Anfänger-Themen 7
Q Konstruktoren und Methoden Java Basics - Anfänger-Themen 2
C Konstruktoren Java Basics - Anfänger-Themen 7
J Konstruktoren Java Basics - Anfänger-Themen 10
M Konstruktoren & Veerbung Java Basics - Anfänger-Themen 6
T Konstruktoren Java Basics - Anfänger-Themen 6
P Enum Attribut in Konstruktoren Java Basics - Anfänger-Themen 10
R Vererbung Konstruktoren nicht erkannt Java Basics - Anfänger-Themen 17
H Klassen, Konstruktoren, Instanzen etc Java Basics - Anfänger-Themen 6
J OOP Konstruktoren, setMethode, getMethode usw. Java Basics - Anfänger-Themen 7
A überladene Konstruktoren Java Basics - Anfänger-Themen 7
L Frage zu Konstruktoren und dem this Operator Java Basics - Anfänger-Themen 16
W 2 Konstruktoren Java Basics - Anfänger-Themen 8
B Vererbung und Konstruktoren Java Basics - Anfänger-Themen 33
N Vererbung von Konstruktoren mit Parametern Java Basics - Anfänger-Themen 7
S Konstruktoren verketten Java Basics - Anfänger-Themen 6
A Konstruktoren sollen sich gegenseitig aufrufen Java Basics - Anfänger-Themen 10
K Kann man Private-Konstruktoren doch aurufen? Java Basics - Anfänger-Themen 8
E Konstruktoren und Methoden Java Basics - Anfänger-Themen 10
E OOP individual + standard-Konstruktoren Java Basics - Anfänger-Themen 9
S Konstruktoren? Java Basics - Anfänger-Themen 5
K Konstruktoren Java Basics - Anfänger-Themen 13
H Konstruktoren – super! Java Basics - Anfänger-Themen 3
L Geschachtelte Konstruktoren Java Basics - Anfänger-Themen 4
hdi Kleine Design/Convention Frage zu Konstruktoren Java Basics - Anfänger-Themen 4
J Vererbung und Konstruktoren Java Basics - Anfänger-Themen 14
J Problem mit Konstruktoren Java Basics - Anfänger-Themen 2
G Überladen von Konstruktoren mit unterschiedlichen Datentypen Java Basics - Anfänger-Themen 4
H Befehl mit Konstruktoren Java Basics - Anfänger-Themen 2
L Konstruktoren bei Vererbung Java Basics - Anfänger-Themen 13
Z wie kann ich überladene Konstruktoren "umleiten"? Java Basics - Anfänger-Themen 11
D Blöde(?) Frage zu Konstruktoren und set-Methoden Java Basics - Anfänger-Themen 3
G Interface und Konstruktoren Java Basics - Anfänger-Themen 3
G Frage zu Konstruktoren Java Basics - Anfänger-Themen 12
G Verständnisfrage zu Konstruktoren Java Basics - Anfänger-Themen 5
G Konstruktoren Java Basics - Anfänger-Themen 9
A Konstruktoren überladen Java Basics - Anfänger-Themen 9
H Konstruktoren + Hilfe Java Basics - Anfänger-Themen 12
H Konstruktoren werden nie geerbt Java Basics - Anfänger-Themen 3
O Vor-/Nachteile/Unterschiede von Konstruktoren und Methoden Java Basics - Anfänger-Themen 3
Bierhumpen 2 Konstruktoren Java Basics - Anfänger-Themen 15
T mehrere Konstruktoren für eine Klasse Java Basics - Anfänger-Themen 7
J Instantvariablen und Konstruktoren Java Basics - Anfänger-Themen 2
Y Vererben - Konstruktoren Java Basics - Anfänger-Themen 2
Z übergabe von string[] an konstruktoren oder methoden Java Basics - Anfänger-Themen 3
L Klassen, Vererbung und Konstruktoren Java Basics - Anfänger-Themen 10
S Frage zu Konstruktoren Java Basics - Anfänger-Themen 7
G Problem mit Gültigkeit von Variabeln und Konstruktoren Java Basics - Anfänger-Themen 4
C Konstruktoren Java Basics - Anfänger-Themen 4
G Konstruktoren (was, wozu, wieso, warum) Java Basics - Anfänger-Themen 4
K Sichtbarkeit protected: Attribute trotzdem aufrufbar. Java Basics - Anfänger-Themen 4
A OOP Komposition per Package-Sichtbarkeit Java Basics - Anfänger-Themen 2
melaniemueller Datenkapselung Sichtbarkeit public Java Basics - Anfänger-Themen 4
C Sichtbarkeit in Pakten Java Basics - Anfänger-Themen 2
Y JFrame sichtbarkeit Java Basics - Anfänger-Themen 4
Y Panels sichtbarkeit Java Basics - Anfänger-Themen 3
J Sichtbarkeit und Zugriff Java Basics - Anfänger-Themen 9
A Sichtbarkeit in Methoden/Listen Java Basics - Anfänger-Themen 3
W Sichtbarkeit vom Variablen, Klassen usw. Java Basics - Anfänger-Themen 3
M Sichtbarkeit - Modifier Java Basics - Anfänger-Themen 13
P Klasse mit eingeschränkter Sichtbarkeit Java Basics - Anfänger-Themen 3
J Sichtbarkeit Variable in Schleife Java Basics - Anfänger-Themen 5
C OOP Aufruf von Methoden höherer Sichtbarkeit Java Basics - Anfänger-Themen 10
S Sichtbarkeit Problem Java Basics - Anfänger-Themen 10
J Sichtbarkeit von Objecten in JSP's Java Basics - Anfänger-Themen 7
L sichtbarkeit von checkboxen Java Basics - Anfänger-Themen 2
C OOP Vererbung und Sichtbarkeit Java Basics - Anfänger-Themen 14

Ähnliche Java Themen

Neue Themen


Oben