Fragen aus einer Java Klausur

ME2002

Mitglied
Hallo,
Folgende Fragen sind aus einer Klausur über Java und Algorithmen, bei welchen ich mir über die Richtigkeit der Korrektur unsicher bin...

1. Enthält Java Zeigerarithmetik?
2. Erlaubt Java Mehrfachvererbung durch Interfaces?
3. Erlaubt Java Mehrfachvererbung? (als allgemeines Statement ohne Eingrenzungen/ Ergänzungen)
4. Welche der folgenden Datenstrukturen sind zum sortieren von numerischen Elementen geeignet: Halde, Binärer Suchbaum, Stapel, AVL Baum?
5. Ist "advance" eine typische Methode von verketteten Listen? (was macht die methode überhaupt?)

Vielen Dank 🙂
 
@ME2002 du musst schon sagen, was du als nicht richtig einschätzt.
Allerdings: Antworten in diesem Forum sind natürlich nicht normativ. Du kannst danach natürlich nicht zu deinem Lehrer/Professor gehen und sagen: "Aber aber... hier im Java Forum haben die gesagt, dass ...".
Du kannst bei den ganzen Fragen, die du genannt hast, selbst Recherche betreiben und uns dann jeweils hier sagen, welche von dir herangezogenen Referenzen belegen können, dass deine Antworten auf die Fragen eigentlich richtig sind. Das können wir dann für uns diskutieren.
 
Gerne, hier eine Konkretisierung und Einschätzung... Thema der Klausur war Java sowie Algorithmen und Datenstrukturen (geläufigen Datenstrukturen in Theorie und Praxis (in Java)).

1. Enthält Java Zeigerarithmetik? (Uni: ja; ich: bin mir nicht sicher, habe aber gegenteiliges geglaubt gelesen zu haben)
2. Erlaubt Java Mehrfachvererbung durch Interfaces? (Uni: nein; Ich: ja, wusste nicht was ich an der Frage falsch verstanden habe, aber Mehrfachvererbung mittels interfaces ist ja eindeutig möglich)
3. Erlaubt Java Mehrfachvererbung? (Uni: ja; Ich: erstmal verstehe ich nicht warum das richtig sein soll, aber die 2. Nicht, das widerspricht sich doch!? Und abgesehen davon: als allgemeines Statement ohne Eingrenzungen/ Ergänzungen würde ich sagen erstmal nein, weil es suggeriert Mehrfachvererbung wäre grundsätzlich möglich, was aber nicht der Fall ist, sondern nur in dem Spezialfall der Mehrfachvererbung mittels interfaces.Kann man aber natürlich auch anders interpretieren, weil es ja eine Mehrfachvererbung gibt, nur nicht mittels Klassen. Widersprechen würde es sich mit 2. Aber alle mal)
4. Welche der folgenden Datenstrukturen sind zum sortieren von numerischen Elementen geeignet: Halde, Binärer Suchbaum, Stapel, AVL Baum? (Uni: Halde, sonst nichts; Ich: Halde, z.b. durch heap sort, außerdem (im Gegensatz zur Uni) AVL Baum, da nach dem einsortierem ein perfekt balancierte Binärer suchbaum entsteht, der mittels Inorder Sortiert traversiert werden kann oder 'intelligent/effizient' durch binäre suche. Binärer suchbaum: Eher nein, weil kann (bei ungünstiger Reihenfolge) zu Art Liste entwerten, dann Höhe = Anzahl Elemente = Binäre suche nicht möglich.)
5. Ist "advance" eine typische Methode von verketteten Listen? (Uni: ja; Ich: Nein, ich kann diese weder in der Java API finden noch in den Vorlesungsaufzeichnungen, nichtmal mittels Google konnte ich rausfinden was die Methode macht. Da kann man doch nicht von 'typisch' sprechen).

Gerne würde ich weitere Meinungen hören oder korrigiert werden, falls ich etwas übersehen hab.

Vielen Dank 🙂
 
Zuletzt bearbeitet:
1. Enthält Java Zeigerarithmetik?
2. Erlaubt Java Mehrfachvererbung durch Interfaces?
3. Erlaubt Java Mehrfachvererbung? (als allgemeines Statement ohne Eingrenzungen/ Ergänzungen)
4. Welche der folgenden Datenstrukturen sind zum sortieren von numerischen Elementen geeignet: Halde, Binärer Suchbaum, Stapel, AVL Baum?
5. Ist "advance" eine typische Methode von verketteten Listen? (was macht die methode überhaupt?)
nein
nein, bzw. ja, wenn man "implements Interface" dazuzählen möchte
nein
Halde und AVL-Baum
nein
 
  • Arithmetik wäre, wenn ich +1 mitm Pointer/Referenz rechnen kann
  • "implements Interface" ist keine Vererbung
  • Merfach-Vererbung ist innerhalb einer Klasse nicht erlaubt, natürlich kann von einer abgeleiteten Klasse ein weiteres Mal abgeleitet werden
  • eigentlich nur Halde
  • Es könnte sein, dass mit "advance" null-Elemente vorne und hinten gemeint sind, ich meine aber Java regelt das anders
 
1. Zeiger Arithmetik : in java Dokumenten die ich so lese, kannst du referenz und Pointer gleich setzen im Sinne der Referenz , der java "Pointer" ist aber nicht gleich zu setzen mit dem C Pointer
2. ja, durch default Methoden kann man eine mehrfach Vererbung erreichen über Umwege, dies entspricht nicht der klassischen mehrfach Vererbung wie man sie in c++kennt aber es geht
3. in Klassen inklusive records und enums ist es verboten und nicht möglich
durch interface default Methoden könnte man es hinbiegen, ich weiß auch nicht wo man die mehrfach Vererbung bräuchte.. meistens braucht man sie dann wenn man die einfach Vererbung versaubeutelt hat
5. Was das advance sein soll weiß ich nicht, vllt das mit den nulls? java regelt es meines Erachtens intern, und um das mal zu erwähnen.. was java intern macht ist jeden java Programmierer scheiß egal, wenn ich zb in der liste ne sort Methode hernehme dann will ich be sortierte liste haben, mir is aber egal wie oder durch was es sortiert wurde, wenn es mich interessiert dann schau ich mir das in der Dokumentation an und suche genau das raus... was soll so ne klausurfrage
 
ich kann mehrere Interfaces in einer Klasse implementieren, ja - aber nicht vererben.

Java:
interface S {
    String text();
    default int countLetters() {
        return (int) text().chars().filter(Character::isLetter).count();
    }
}

interface N {
    int value();
    default int countDigits() {
        return Integer.toString(Math.abs(value())).length();
    }
}

class C implements S, N {
    public String text() { return "Text"; }
    public int value() { return 42; }
    public static void main(String[] args) {
         C c = new C();
         System.out.printf("Letters: %d, Digits: %d%n", c.countLetters(), c.countDigits());
    }
}
Hier wird eindeutig der Code aus den Typen S und N an den Typ C vererbt.
 
S und N sind interfaces und das ist eine Realisierung, nicht Vererbung. Andernfalls hätte man sich um das Diamond-Problem kümmern müssen.
 
Zuletzt bearbeitet:
Ja aber das mit der Zeigerarithmetik ist def. falsch...

Viel schlimmer ist allerdings, dass ich vorhin eine Mücke in meinem Zimmer gesehen habe - und das bei +1°C ! wie geht das?
 
Vielen Dank für die vielen Antworten..
Also wie ich das bis jetzt verstanden habe...

1. Zeiger Arithmetik: kann man wohl in beide richting hindrehen, sodass für beide antworten sich argumentieren lässt...
2. Mehrfachvererbung durch Interfaces: Ja möglich (Uni Antwort falsch) weil selbst in der Java doc von "Vererbung" die Rede ist.
3. Allgemein Mehrfachvererbung: nein (Uni Antwort falsch) weil es per se nicht möglich ist (im Gegensatz zu cc & co (normalerweise würde man denke dass sie genau diesen unterschieden abfragen wollen, aber scheinbar nicht 🙂)
5. Scheinbar lässt sich erahnen was gemeint ist... Aber als "typisch" würde ich diese Methode nicht bezeichnen...
 
da bei 5. das Lisen Interface und die Liste ansich keine Methode BESITZT die advance heißt , kann man nicht von typisch reden

Zeiger Arithmetik..,. also bitte die frage ist intern oder nicht... natürlich gibts intern zeiger arithmetik ( klassiker null POINTER exception ) aber für java code hat man referenzen nach der JLS , das wort "pointer" ist in dem sinn als referenz zu sehen also, es gibt keine zeiger arithmetik, es gibt referenzen aber das wars
 
Java:
  interface MyString {
    public default String getMyString() {
      return "this is a default String";
    }
  }

  class MyImplementedClass implements MyString {
    @Override
    public String getMyString() {
      return super.getMyString(); //das funktioniert nicht.
    }
  }
du kannst mit "super" nicht unterscheiden was die "oberklasse" ist bei mehrfachvererbung... was tust du denn wenn du 2 interfaces mit dem default gleichen methoden namen hast ?

du schreibst auch bei C++ davor aus welcher klasse es benutzt werden sollte um es zu unterscheiden, dh hier musst du MyString.getMyString() benutzen ... wenn du zb ein INterface mit namen X hast dann kannst du nicht entscheiden aus welchem es die default methode benutzen sollte deswegen musst du da unterschieden und "super" kennt keinen unterscshied in der hinischt
 
Zeiger Arithmetik: kann man wohl in beide richting hindrehen, sodass für beide antworten sich argumentieren lässt...
Nein eine echte Zeiger Arithmetik gib es bei Java nicht.

Pointer auf Pointer gibt es zb nicht.
Pointer addition ... gibt es auch nicht.

Java ist Call by call by Vallue, nicht call by Reference wie zb. C/C++
 
Zuletzt bearbeitet:
Pointer auf Pointer gibt es zb nicht.
Pointer addition ... gibt es auch nicht.
es gibt es halt intern, die JVM ist in C geschrieben dh intern gibt es diese, jedoch wie schon erwähnt ... einen java programmierer interessiert es nicht wie es intern von java geregelt wird
 
Edit: Heh, da hab ich den Compiler unterschätzt. Entweder das, oder das wurde irgendwann geändert und ich hab nichts davon mitbekommen.
 
Zuletzt bearbeitet:

hier wird das erklärt wie man die methoden unterscheiden kann des interfaces


Java:
class D implements B, C
{
   @Override
   public void foo()
   {
      B.super.foo();
      //C.super.foo();
   }
}

da hast du übrigens auch dein super

EDIT: jetzt auch noch die JLS wo auch von vererbung die rede ist ( weil interfaces nur spezielle abstrakte klassen sind zum einen wird da auch die "einzigartigkeit" von methoden in abstrakten klassen verwiesen)

Java:
Note that methods are overridden on a signature-by-signature basis. If, for example, an interface declares two public methods with the same name (§9.4.2), and a subinterface overrides one of them, the subinterface still inherits the other method.

The third clause above prevents a subinterface from re-inheriting a method that has already been overridden by another of its superinterfaces. For example, in this program:

interface Top {
    default String name() { return "unnamed"; }
}
interface Left extends Top {
    default String name() { return getClass().getName(); }
}
interface Right extends Top {}

interface Bottom extends Left, Right {}

ist in 9.4.1 von oracles JLS ...
 
Zuletzt bearbeitet von einem Moderator:

hier wird das erklärt wie man die methoden unterscheiden kann des interfaces


Java:
class D implements B, C
{
   @Override
   public void foo()
   {
      B.super.foo();
      //C.super.foo();
   }
}

da hast du übrigens auch dein super
Ja, hatte ich mittlerweile getestet. Das hatte ich anders in Erinnerung.
 
es gibt es halt intern, die JVM ist in C geschrieben dh intern gibt es diese, jedoch wie schon erwähnt ... einen java programmierer interessiert es nicht wie es intern von java geregelt wird
ja und deshalb braucht man mit einem Anfänger auch nicht darüber Diskutieren das verwirrt ihm nur und er wird es in seinen Arbeiten falsch wider geben.
 
ja und deshalb braucht man mit einem Anfänger auch nicht darüber Diskutieren das verwirrt ihm nur und er wird es in seinen Arbeiten falsch wider geben.
was ist da verwirrend?

es wurde schon 5 mal geschrieben dass java ansich keine Pointer Arithmetik hat wie C, es gibt Referenzen und keine Pointer im sinne von C


ABER
intern gibt es diese da die Java virtual machine in C geschrieben ist und diese Benutzt pointer

warum vorenthalten ? in einer klausur kann der Prof da nicht dagegen sprechen
 
was ist da verwirrend?

es wurde schon 5 mal geschrieben dass java ansich keine Pointer Arithmetik hat wie C, es gibt Referenzen und keine Pointer im sinne von C


ABER
intern gibt es diese da die Java virtual machine in C geschrieben ist und diese Benutzt pointer

warum vorenthalten ? in einer klausur kann der Prof da nicht dagegen sprechen
es geht um die Sprache und nicht um die JVM.

Was die JVM kann ist ein anderes Thema. Ist hier nicht gefragt.
 
Zuletzt bearbeitet:
2. Mehrfachvererbung durch Interfaces: Ja möglich (Uni Antwort falsch) weil selbst in der Java doc von "Vererbung" die Rede ist.
Ich würde bzgl. "Uni Antwort falsch" nochmal auf @httpdigest verweisen. Bloß, weil das in der JLS (nicht Javadoc) so definiert ist, heißt das nicht, dass das im Sinne der von Euch verwendeten Definition der Fall sein muss. Einfach mal nachfragen, warum das so bewertet wurde. Es könnte auch sein, dass die zwei Antworten einfach nur vertauscht wurden.

5. Scheinbar lässt sich erahnen was gemeint ist... Aber als "typisch" würde ich diese Methode nicht bezeichnen...
In einer verketteten Liste hast Du gar keine andere Möglichkeit, als von einem Element zum nächsten zu gehen.
 
es gibt es halt intern, die JVM ist in C geschrieben dh intern gibt es diese, jedoch wie schon erwähnt ... einen java programmierer interessiert es nicht wie es intern von java geregelt wird
dann könnte man ja auch argumentieren, dass die JVM intern ja Turing-vollständig is und alle Antworten somit bejaht werden könnten. 😉
 
dann könnte man ja auch argumentieren, dass die JVM intern ja Turing-vollständig is und alle Antworten somit bejaht werden könnten. 😉
ich würde es nicht so formulieren...

die JVM ist in C geschrieben und ist Turing komplett
sowie Java das in der JVM ist turing komplett, und somit ist alles damit umsetzbar, was halt mit ner turing maschine umsetzbar ist


bestes Beispiel dafür : Kotlin
Kotlin ist eine Sprache die ansich "wenig" mit java zu tun hat wenn man auf die Syntax schaut... schon von der Fancy syntax her möchte man glauben...
jedoch wird der Kotlin code umgewandelt in java code umgewandelt und in der JVM ausgeführt also ist es theoretisch möglich alles zu bejahren FALLS ... es irgend wer implementiert hat... und das is nicht der fall bei allem .. niemand hats implementiert und auch eine Turing maschine kann kein programm ausführen das nicht geschrieben ist
 
Es kommt also auf die betrachtete Abstraktionsebene an (hier: JAVA), theoretisch wäre alles sicherlich möglich, sonst gäb es ja auch keine Bezeichnungen dafür...
 
Nur um keine Verwirrung aufkommen zu lassen:
Ob eine Sprache Call by Value und/oder Call by Reference hat / unterstützt ist unabhängig von der Frage, ob eine Sprache Zeiger hat.

C hat kein Call by Reference aber sehr wohl Zeiger. Call by Reference kam erst mit C++.
C# hat Call by Reference aber die Sprache selbst hat keine Zeiger. (Nur indirekt, durch das marshaling / P/invoke gehst Du mit Zeigern und/oder Handles um, aber im eigentlichen c# hast du da keine direkte Zeigerarithmetik.) (*)

Das einfach nur als eine kleine Klarstellung, weil das halt mit erwähnt wurde als Begründung.

(*) c# hat einen unsafe Mode - den lassen wir hier einmal außen vor. Die Möglichkeiten dort wurden von C# Version zu C# Version immer erweitert bis hin zu wirklichem Umgang mit Zeigern. Generell (auch in C) bezieht sich das daher auf "ursprüngliche" Varianten der Sprache.

Edit: Ergänzung, da neue Spezifikationen ggf. mehr eingeführt haben (Bei C# ist die sauf jeden Fall so).
 
Zuletzt bearbeitet:
Nur um keine Verwirrung aufkommen zu lassen:
Ob eine Sprache Call by Value und/oder Call by Reference hat / unterstützt ist unabhängig von der Frage, ob eine Sprache Zeiger hat.

C hat kein Call by Reference aber sehr wohl Zeiger. Call by Reference kam erst mit C++.
C# hat Call by Reference aber die Sprache selbst hat keine Zeiger. (Nur indirekt, durch das marshaling / P/invoke gehst Du mit Zeigern und/oder Handles um, aber im eigentlichen c# hast du da keine direkte Zeigerarithmetik.) (*)

Das einfach nur als eine kleine Klarstellung, weil das halt mit erwähnt wurde als Begründung.

(*) c# hat einen unsafe Mode - den lassen wir hier einmal außen vor. Die Möglichkeiten dort wurden von C# Version zu C# Version immer erweitert bis hin zu wirklichem Umgang mit Zeigern. Generell (auch in C) bezieht sich das daher auf "ursprüngliche" Varianten der Sprache.

Edit: Ergänzung, da neue Spezifikationen ggf. mehr eingeführt haben (Bei C# ist die sauf jeden Fall so).
Richtig aber es geht ja um Java nicht C/C++ oder C#

und in Java gibt es keine Zeigerarithmetik das was die Uni hier sagt ist
meiner Meinung nach flasch.

Post #4
1. Enthält Java Zeigerarithmetik? (Uni: ja; ich: bin mir nicht sicher, habe aber gegenteiliges geglaubt gelesen zu haben)
 
Richtig aber es geht ja um Java nicht C/C++ oder C#
In meinem Beitrag ging es nicht um die konkrete Fragestellung sondern lediglich um einen Zusammenhang zu Call by Value und Call by Reference auf die Frage "Hat Java (oder irgend eine andere Sprache) eine Zeigerarithmetik" - und diese Fragestellungen sind unabhängig voneinander und das habe ich an einem Beispiel aufgezeigt. (Und wenn die Beispiele ggf. diskutiert werden - man könnte hier zur not eine neue Sprache C#' erstellen, welche von C# abgeleitet ist und die unsafe Zeigerarithmetik einfach weglässt. Nur falls da noch jemand Diskussionsbedarf sehen sollte - so eine Diskussion will ich nicht führen.)

Und dieser Zusammenhang war in #20 erkennbar (so war die Aussage zumindest zu verstehen).

Damit ist für mich dieser Punkt aber erledigt. Mögliche weitere Diskussionen (so wie jemand möchte) ansonsten in einem separaten neuen Thread - das ersparrt den Moderatoren das Abspalten. Denn es ist ja ganz offensichtlich Konsens, dass es nicht zum eigentlichen Thema des Threads gehört.
 
Richtig aber es geht ja um Java nicht C/C++ oder C#
naja die sprachen C C++ wurden nur angeführt weil die Begriffe

"C pointer" => purer pointer wie mans "versteht" und kennt
"java pointer" => synonym für Referenzen im sinne von java referenzen

verwechselt wurden vom TE weil er "da was gelesen hat" und dads wollte ich damit erklären und verständlich machen

die UNI hat somit nicht recht... da man bei der Zeiger bzw pointerarithmetik zb pointer addieren kann oder pointer hochzählen kann dies geht NICHT in java ( falls es eine implementierung dazu gibt in zukunft könnte es möglich sein.. das war das kotlin beispiel dass man eine sprache ziemlich umbauen kann ) aber im moment nicht bzw nicht in dem aktuellen java
 
So nun nochmal die Frage hat die Uni recht oder nicht? Ja oder Nein?
Das wurde doch schon genügend diskutiert mit diversen Ansätzen...

Dabei ist wichtig, dass man die Definitionen beachtet, die ggf. von Seiten der Universität gesetzt wurden, siehe dazu auch die Aussage (zu einem anderen Punkt):
Ich würde bzgl. "Uni Antwort falsch" nochmal auf @httpdigest verweisen. Bloß, weil das in der JLS (nicht Javadoc) so definiert ist, heißt das nicht, dass das im Sinne der von Euch verwendeten Definition der Fall sein muss. Einfach mal nachfragen, warum das so bewertet wurde. Es könnte auch sein, dass die zwei Antworten einfach nur vertauscht wurden.

Ansonsten gilt zu dem Punkt ggf:
es wurde schon 5 mal geschrieben dass java ansich keine Pointer Arithmetik hat wie C, es gibt Referenzen und keine Pointer im sinne von C
Und man kann sich immer die JLS nehmen und da einfach mal nach "Pointer" suchen. Dann hätte man ggf. eine Erkenntnis, was die Sprache angeht, die bei Java Themen "üblich" ist.

Ansonsten einfach mit Google suchen, die x Treffer, die einem zusagen, anschauen und die x+n Positionen (hoffentlich mit Argumenten) gegenüber stellen um dann selbst zu x+n+y möglichen Positionen zu kommen (inkl. möglichen Argumenten für die einzelnen Positionen). Dann ist man auf jeden Fall super vorbereitet um mit einem Professor oder Dozent in ein Gespräch zu gehen. Wichtig ist: Das Wissen wurde dann erarbeitet und verstanden (hoffentlich). Ob eine Aussage einer Uni richtig oder falsch ist, ist da eigentlich nebensächlich.
 
Finde ich nicht wenn er da Punkte abgezogen bekommt.
deswegen hast du ANSPRUCH auf eine Klausuren einsicht um die dementsprechende bewertung zu sehen, wenn du dann eine JLS ausschnitt hinlegst der exakt das bestätigt was man hingeschrieben hat, dann hat man den punkt verdient, insofern man den JLS ausschnitt nicht missinterpretiert hat

du musst halt auch sagen die Profs sind menschen, irren ist menschlich

und was ich von meiner UNI sagen kann... dass die auf dem neuesten stand sind ist nicht immer gegeben...mir wurde das "var" schlüsselwort im 5ten semester gezeigt das ist schon etwas mager
 
Gott bewahre...

Bitte nicht zurück zu den Dinos. 😀
naja es ist halt ein grund warum es zb viele Sprachen gibt, viele Linux Distributionen .... viele Forks von öffentlichen projekten

weil es immer einen gibt der sagt "das mag ich aber nicht so"

zb spontan fällt mir da bjarne stroustrup (?) ein der zu java gesagt hat "ich kann es nicht verstehen warum alle java programmierer keien operator überladung durchführen dürfen nur weil sich eine person gedacht hat dass man diese nicht braucht" ... tatsächlich braucht man sie nicht unbedingt ABER manche finden es so schicker/ besser und ab dann gehts los mit unterschiedlichen ansätzen
 
Finde ich nicht wenn er da Punkte abgezogen bekommt.
Also für mich ist es nicht einmal nebensächlich, wenn jemand Anderes Punkte abgezogen bekommt.

Dem TE ging es um eine Lernkontrolle -> Also da ggf. einfach weiter den Stoff erarbeiten, dann bekommt er eine klare Sichtweise mit Argumenten. Und wenn sowas Punktabzug gibt, dann kann man in eine Argumentation gehen. Fehler passieren ... auch an Universitäten ... auch bei Professoren ...

Wir können hier im Forum nur die Sache selbst betrachten, unsere Sichtweise darlegen und Argumente bringen. Eine Bewertung einer Uni, einer Professors, eines Dozenten, einer Aufgabe, ... ist uns nur begrenz möglich - wir haben nun einmal nur eine kleine Aussage, die richtig sein kann oder sogar schon falsch. Und es ist nur ein kleiner Ausschnitt der - im entsprechenden Kontext - schon richtig sein könnte auch wenn man bei einem "üblichen Kontext" eher sagen würde, dass eine Aussage falsch ist.

Aber wiede rviel zu viel Off Topic. Der Weg ist klar, Ihr macht das gut, macht mal schön weiter ...

Kobra mihe7 übernehmen sie 🙂
 
Sehe ich genau so. Allein die Tatsache, dass es Zuweisungen an Referenzen gibt, ist noch keine Pointerarithmetik... Was ist das für eine Baumschule
meine klausur frage war "wie wurden generics vor java 8 behandelt" ... du glaubst nicht wie sehr mich das aufgeregt hat dass mir fragen aus der antike gestellt wurden

aber anscheinend sit das heutzutage noch wichtig mit java 17 bzw java 18
 

Zurück
Oben