Matroids Matheplanet Forum Index
Moderiert von matph
Informatik » Programmieren » Java: Schnittstelle initialisieren
Druckversion
Druckversion
Autor
Universität/Hochschule J Java: Schnittstelle initialisieren
curious_mind
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 10.11.2012
Mitteilungen: 470
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Themenstart: 2021-05-13


Hallo,

ich habe jetzt meine erste Schnittstelle (interface) versucht zu implementieren, dabei sind Fragen offengeblieben.

Hier meine Klassen:
Java
interface Druckbar {
    void drucken();
}
 
class Behaelter {
    OwnLinkedList<Druckbar> dieElemente = new OwnLinkedList<Druckbar>();
    {
        dieElemente.addLast(new Student());
        dieElemente.addLast(new WissAng());
        dieElemente.addLast(new VerwAng());
    }
 
    public void alle_drucken() {
        OwnLinkedList<Druckbar>.ListIterator iterator = dieElemente.listIterator();
 
        while (iterator.hasNext()) {
            Druckbar e = iterator.next();
            e.drucken();
        }
    }
}
 
Java
public class Student implements Druckbar{
    private String Name = "Michael Mantis";
    private String Matrikelnummer = "23098209";
 
    public void drucken(){
        System.out.println(getClass()+", Name: "+Name+", Matrikelnr.: "+Matrikelnummer);
    }
}
Java
public class VerwAng implements Druckbar{
    private int Personalid = 453;
    private String Lohn = "2359 €";
 
    public void drucken(){
        System.out.println(getClass()+", Personal-ID: "+Personalid+", Lohn: "+Lohn);
    }
}
Java
public class WissAng implements Druckbar{
    private final String Personalid = "W241";
    private String Fachbereich = "theoretische Physik";
 
    public void drucken(){
        System.out.println(getClass()+", Personal-ID: "+Personalid+", Fachbereich: "+Fachbereich);
    }
}
Java
public class TestBehaelter {
    public static void main(String[] args) {
 
        Behaelter Dings = new Behaelter();
        Dings.alle_drucken();
    }
}

... und ne eigene LinkedList-Klasse mit einem eigenen Iterator (falls nötig, poste ich die auch)


Fragen, die aufkamen:
1.) Wieso akzeptiert er in der Behaelter-Klasse die drei "dieElemente.addLast(...)" Anweisungen nur, wenn ich sie in geschweifte Klammern setze (Initialisierungsblock)? Ich hab das einfach probiert und dann ging's, aber mir ist nicht klar, wieso er ohne die Klammern meint, er kenne "addLast" nicht mehr.

2.) Wieso bestand er darauf, dass drucken-Methoden in der Studenten- u. Mitarbeiterklassen "public" sind? Es spielt sich doch alles im gleichen Paket ab...

Danke schon mal.🙂




Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
DerEinfaeltige
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.02.2015
Mitteilungen: 2867
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.1, eingetragen 2021-05-13


2021-05-13 12:20 - curious_mind im Themenstart schreibt:

Fragen, die aufkamen:
1.) Wieso akzeptiert er in der Behaelter-Klasse die drei "dieElemente.addLast(...)" Anweisungen nur, wenn ich sie in geschweifte Klammern setze (Initialisierungsblock)? Ich hab das einfach probiert und dann ging's, aber mir ist nicht klar, wieso er ohne die Klammern meint, er kenne "addLast" nicht mehr.

2.) Wieso bestand er darauf, dass drucken-Methoden in der Studenten- u. Mitarbeiterklassen "public" sind? Es spielt sich doch alles im gleichen Paket ab...


1.) Weil der class body selbst keine Statements enthalten kann.

2.) Aus der Dokumentation:
All abstract, default, and static methods in an interface are implicitly public, so you can omit the public modifier.

drucken ist also public und eine konkrete Implementierung muss grundsätzlich mindestens so sichtbar sein wie die originale Methode.


-----------------
Why waste time learning when ignorance is instantaneous?
- Bill Watterson -



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
curious_mind
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 10.11.2012
Mitteilungen: 470
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.2, vom Themenstarter, eingetragen 2021-05-13


2021-05-13 13:12 - DerEinfaeltige in Beitrag No. 1 schreibt:
1.) Weil der class body selbst keine Statements enthalten kann.
Verstehe ich nicht. Kann man nur Variablen oder Objekte erstellen, aber diese nicht manipulieren?

2021-05-13 13:12 - DerEinfaeltige in Beitrag No. 1 schreibt:
2.) Aus der Dokumentation:
All abstract, default, and static methods in an interface are implicitly public, so you can omit the public modifier.
Hm, irgendwie syntaktisch inkonsequent, aber danke - das erklärt's.



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
DerEinfaeltige
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.02.2015
Mitteilungen: 2867
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.3, eingetragen 2021-05-13


2021-05-13 14:53 - curious_mind in Beitrag No. 2 schreibt:
2021-05-13 13:12 - DerEinfaeltige in Beitrag No. 1 schreibt:
1.) Weil der class body selbst keine Statements enthalten kann.
Verstehe ich nicht. Kann man nur Variablen oder Objekte erstellen, aber diese nicht manipulieren?


Der Klassenkörper ist eine Beschreibung eines Typs.
Anweisungen haben dort nichts verloren.

Schon alleine, weil der Compiler nicht wissen kann, ob und wann er diese Anweisungen denn überhaupt ausführen soll.


-----------------
Why waste time learning when ignorance is instantaneous?
- Bill Watterson -



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
curious_mind
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 10.11.2012
Mitteilungen: 470
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.4, vom Themenstarter, eingetragen 2021-05-14


2021-05-13 15:58 - DerEinfaeltige in Beitrag No. 3 schreibt:
Schon alleine, weil der Compiler nicht wissen kann, ob und wann er diese Anweisungen denn überhaupt ausführen soll.
...na dann, wenn er beim Aufruf der Klasse die ganzen Variablen initialisiert, könnte er dann ja auch weitere Statements gleich abarbeiten.

Aber gut, dann weiß ich bescheid. Danke schön.

Achso, noch eine Frage:

Wo sollte dieser Teil
Java
interface Druckbar {
    void drucken();
}
am besten stehen? Ich hatte das jetzt in der Behaelter Datei, s.o.



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
DerEinfaeltige
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.02.2015
Mitteilungen: 2867
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.5, eingetragen 2021-05-14


2021-05-14 09:30 - curious_mind in Beitrag No. 4 schreibt:

...na dann, wenn er beim Aufruf der Klasse die ganzen Variablen initialisiert, könnte er dann ja auch weitere Statements gleich abarbeiten.

Aber gut, dann weiß ich bescheid. Danke schön.


Du scheinst nach wie vor eine merkwürdige Vorstellung einer Klasse zu haben.

Nichtstatische Variablen werden nicht "Beim Aufruf der Klasse" initialisiert, sondern beim Erzeugen eines Objektes.

Die Klasse selbst ist im Wesentlichen nur eine Beschreibung.
In ihr steht, welche Eigenschaften und welche Fähigkeiten ein Objekt des Typs besitzen muss.
(Ähnlich einem Lexikoneintrag oder einer Produktbeschreibung)


Ein Initializerblock enthält übrigens Methoden, die vom Compiler an einer bestimmten Stelle in den Konstruktor eingefügt werden.
Wenn es keinen besonderen Grund gibt, würde ich sie grundsätzlich vermeiden und den entsprechenden Code selbst direkt oder indirekt (init()-Methode) in den Konstruktor einfügen.
In jedem Fall wird auch dieser Block erst und immer dann ausgeführt, wenn ein konkretes Objekt erzeugt wird.


-----------------
Why waste time learning when ignorance is instantaneous?
- Bill Watterson -



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
curious_mind
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 10.11.2012
Mitteilungen: 470
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.6, vom Themenstarter, eingetragen 2021-05-18


Noch eine Rückfrage zum Thema:

Verstehe ich Folgendes richtig?

Wenn man eine Klasse mit Super-Schnittstellen angibt, schreibt man
Java
class Klasse implements SuperSchnittstelleA, SuperSchnittstelleB

Aber wenn man eine Schnittstelle mit Super-Schnittstellen angibt, schreibt man
Java
interface Schnittstelle extends SuperSchnittstelleA, SuperSchnittstelleB

Und wenn man eine Klasse mit Superklasse und Super-Schnittstellentypen hat, schreibt man
Java
class Klasse extends SuperKlasse implements SuperSchnittstelleA, SuperSchnittstelleB

während bei einer Schnittstelle ausschließlich Schnittstellen als Supertyp deklariert werden können (implizit ist Object die Superklasse)?



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
DerEinfaeltige
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.02.2015
Mitteilungen: 2867
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.7, eingetragen 2021-05-18


Ja.

Eine Klasse kann eine andere Klasse erweitern und verschiedene Schnittstellen implementieren.

Eine Schnittstelle wiederum kann andere Schnittstellen erweitern.

Soweit eigentlich alles sprachlich konsistent und logisch.


Und alles, was kein primitiver Typ ist, ist ein Object, bzw. dessen Erbe.


-----------------
Why waste time learning when ignorance is instantaneous?
- Bill Watterson -



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
curious_mind
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 10.11.2012
Mitteilungen: 470
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.8, vom Themenstarter, eingetragen 2021-05-18


Ok, dank dir.👍

Und machst du eine neue Schnittstelle wie eine Klasse in eine eigene Datei?



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
DerEinfaeltige
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.02.2015
Mitteilungen: 2867
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.9, eingetragen 2021-05-18


Schnittstellen können genau wie Klassen in eigenen Dateien stehen oder verschachtelt sein.


-----------------
Why waste time learning when ignorance is instantaneous?
- Bill Watterson -



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
curious_mind hat die Antworten auf ihre/seine Frage gesehen.
curious_mind hat selbst das Ok-Häkchen gesetzt.
Neues Thema [Neues Thema]  Druckversion [Druckversion]

 


Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2021 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]