Vererbung null aus Elternklasse "dominant"?

Tobse

Top Contributor
Hi,
ich habe folgende Situation:
Java:
public abstract class Foo {
    public int[] FIELD1=null;
    // Das =null muss da stehen
}
Java:
public class Extra extends Foo {
    public int[] FIELD1=new int[] { ... };
}
Java:
public class Worker {
    private Foo container;
    public Worker(Foo con, ...) {
         this.container=con;
         ...
    }
    public void doSomething() {
         ...
         int[] id=(aus Stream gelesen);
         if (compare(id, this.container.FIELD1)) {
             ...
         }
    }
}
Java:
public class Start {
    public static void main(String[] args) {
        Worker w=new Worker(new Extra(), ...);
        ...
        w.doSomething();
        ...
    }
}
Compiliert korrekt.
Bie der ausführung:
Code:
!'#%§~ bratzel => Worker @Line10: NullPointerException

Aber warum? Die Instanz von Extra überschreibt ja das Null der Elternklasse. Wenn ich im Konstruktor von Extra das array ausgebe kommt auch was.
Aber die referenz von FIELD1 auf Extra scheint im Worker nicht zu fruchten.

Bitte zerr mich da mal jmd. vom Schlauch runter ;).
 

hdi

Top Contributor
Du meinst wohl eher:

Java:
public class Extra extends Foo {
    /* public int[] */ FIELD1=new int[] { ... };
}

oder war die erneute Deklarierung einer bereits in der Vaterklasse deklarierten Variable für dieses Szenario absichtlich herbeigeführt?
 
G

Gast2

Gast
this.container ist vom Typ Foo, also sagst du ihm explizit dass er die Variable aus Foo nutzen soll.

Warum hast du die Variable eigentlich doppelt deklariert? Einmal in der Klasse Foo reicht. Die Klasse Extra kann die Variable dann ja noch umsetzen.
 
B

Beni

Gast
Deine Extra Klasse hat einfach ein zusätzliches Feld, jetzt gibt es Foo.FIELD1 und Extra.FIELD1. Anders als Methoden werden Felder aber nicht überschrieben, wenn du auf das Foo.FIELD1 zugreiffst, greiffst du immer auf Foo.FIELD1 zu.

Entweder packst du den Zugriff auf dieses FIELD1 in eine (abstrakte) Methode die du dann überschreiben kannst (oder musst), oder deine Extra Klasse ruft "FIELD1 = new ..." im Konstruktor auf.

Ganz egal welche Lösung du wählst, nicht konstante Felder sollten in jedem Fall "private" und nicht "public" sein.
 

Tobse

Top Contributor
Das mit der Doppelten deklarierung stand nch so im Quellcode wiels vorher ein Interface war, aber da war das gleiche Problem.
Ganz egal welche Lösung du wählst, nicht konstante Felder sollten in jedem Fall "private" und nicht "public" sein.
Ich kann die ja nicht konstant machen, weil ich sie sonst in Extra nichtmehr überschreiben kann. Und private will ich die nicht machen, weil ich dann 20 getter machen muss, die mir nichts erleichtern.

Ohne die doppelte deklarierung heissts
Code:
C:\...Datei...\x.java:6: <identifier> expected
    HEADER_OBJECT=new int[] {
                 ^
Das machts nich besser :|
 
B

Beni

Gast
Java:
public class Extra extends Foo{
  FIELD1 = new ... // Zuweisungen ausserhalb einer Methode funktionieren nicht (Ausnahme: es wird ein neues Feld angelegt).

  public Extra(){
    FIELD1 = new ... // im Konstruktor darfst du
  }
}

Falls der Hinweis nicht hilft: poste die ganzen Klassen und nicht nur Ausschnitte.
 
G

Gast2

Gast
Hier deklarieren:
Java:
public class Foo {
	public String s = null;
}

Hier neu setzen:
Java:
public class Extra extends Foo {
	public Extra() {
		s = "Extra"; // oder in nem initializer block
	}
}

Und so nutzen:
Java:
public class Main {
	public static void main(final String[] args) {
		Foo f = new Extra();
		System.out.println(f.s);
	}
}
Setter solltest du dir aber auf jedenfall auch noch zulegen.
 

Tobse

Top Contributor
OK, ich pack das alles mal in den konstruktor.
Setter solltest du dir aber auf jedenfall auch noch zulegen.
Die brauchts in diesem Fall hier nicht, weil das eigentlich auch Enums sein könnten, klappt aber aus dem besagtne grund auch nicht ...

Jap, das mit dem Konstruktor hat geklappt. In Java wünsche ich mir manchmal einfach die schönen anonymen objekte aus JS, die sind soooo cool xD. Danke für deine Hilfe.
 

hdi

Top Contributor
Und private will ich die nicht machen, weil ich dann 20 getter machen muss, die mir nichts erleichtern.

Datenkapselung Note: 6!

In der Tat, Getter erleichtern gar nichts. Sie sind nur ein nötiger Seiteneffekt. Bei der Kapselung geht's um die Setter. Und dass du die nicht brauchst, das kann dir vielleicht jetzt so vorkommen. Aber wehe, du willst im Nachhinein noch irgendeine Art Kontrollabfrage bei der Zuweisung einer Variablen integrieren.

Die brauchts in diesem Fall hier nicht, weil das eigentlich auch Enums sein könnten
hat damit übrigens auch gar nichts zu tun.
 

Tobse

Top Contributor
In der Tat, Getter erleichtern gar nichts. Sie sind nur ein nötiger Seiteneffekt. Bei der Kapselung geht's um die Setter. Und dass du die nicht brauchst, das kann dir vielleicht jetzt so vorkommen. Aber wehe, du willst im Nachhinein noch irgendeine Art Kontrollabfrage bei der Zuweisung einer Variablen integrieren.
Der Sinn von Getter und Setter ist mir durchaus bekannt. Allerdings sollen diese Werte nicht geändert werden. Die sollten von mir aus [c]public static final[/c] sein, das ist hier aber nicht möglich, wegen der vererbung.
Alles was diese Klassen sollen, ist die möglichkeit geben, den Worker mit anderen Werten rechnen zu lassen. Und die muss ich 1 mal definieren, und damit wars das. Es handelt sich bei diesen arrays um IDs in WMA-Dateien. Die ändern sich nicht so, dass ich die im programmablauf ändern müsste.
 

hdi

Top Contributor
Achso, ich verstehe. Ich denke in dem Fall bräuchten wir (oder sagen wir mal ich) genauere Informationen über den Sinn und die Verwendung dieser Datenstrukturen im Programm, um dir ein passenderes Design vorzuschlagen. Konstanten (statische Dinge im Allgemeinen) lassen sich nun mal nicht vererben, wie du gemerkt hast.
 

Tobse

Top Contributor
Es geht hier im Generellen um das ASF-Format. In diesen Dateien sind Audio/Video Informationen in form von "objekten" gespeichert. Das sieht dann z.B so aus:
Code:
Field         | Size (Byte)
--------------+--------------
Object ID     | 16
--------------+--------------
Object Size   | 8
--------------+--------------
Field1 Length | 4
--------------+--------------
Field1        | s.o.
--------------+--------------
Field2 Length | 4
--------------+--------------
Field2        | s.o.
usw.
Um jetzt entscheiden zu können um was für ein Objekt, also um welche informationen, es sich handelt, gibt es die GUID. Das sind 16 byte, da gibts kein bestimmtes muster.
In ASF Dateien ist pro objekt genau 1 ID definiert. Das WMA-Format "erbt" von ASF, nur das dort anderee IDs für die gleichen Informationen gelten. Um jetzt mit einer Klasse mehrere Datei-Formate lesen zu können wollte ich diese IDs extrahieren und bin dabei an der Java vererbung gescheitert. Diese weise schien mir die einzig sinnvolle zu sein... es funktioniert auf alle fälle.
 
G

Gast2

Gast
In Java wünsche ich mir manchmal einfach die schönen anonymen objekte aus JS,
Gibts doch in Java auch? Oder meinst du was anderes als:
Java:
		Foo f = new Foo() {
			{
				s = "Anonymer Foo";
			}
		};
		System.out.println(f.s);
???:L
 

Tobse

Top Contributor
Diese Schreibweise war mir nicht bekannt. In JS ist das ja
Code:
var obj={
    foo: bar,
    x: "y"
};
Aber in Java hab ich auf diese Weise nichts hinbekommen.
EDIT:
Anonyme Objekte in Java kannte ich auch davor, aber dass da nochmal ein {} reinmuss, da bin ich nich draufgekommen.
 

hdi

Top Contributor
Dieses {} im Klassenrumpf schimpft sich (nicht-statischer) Initialisierungs-Block. Das hat erstmal nichts mit anonymen Klassen zu tun, das lässt sich an jeder beliebigen (top-level) Stelle innerhalb jedes Klassen-Rumpfes schreiben. Solche Init-Blöcke werden im Zuge der Instanz-Variablen-Initialisierung ausgeführt. (d.h. zwischen (implizitem) super-Aufruf im Konstruktor und den restlichen Anweisungen im Konstruktor)
 
G

Gast2

Gast
Der
Code:
{ }
-Block ist für die Initialisierung der Instanz da. Nennt sich auch double brace initialization wenn ich da jetzt nichts verwechsele.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Zrebna Wieso sollte man Null-Prüfungen nicht mit Optional-Objekten nutzen? Allgemeine Java-Themen 13
Zrebna SonarLint: Warum kein Null-Referencing-CodeSmell-Hint hier? Allgemeine Java-Themen 23
OnDemand Java String in Hashmap als Key NULL Allgemeine Java-Themen 27
8u3631984 Argument Captor liefert NULL zurück Allgemeine Java-Themen 2
E Class.getResourceAsStream() gibt null zurück Allgemeine Java-Themen 2
Zrebna Gibt es eine Möglichkeit eine NPE zu vermeiden, wenn null returned wird? Allgemeine Java-Themen 3
J Zahlen Abstand zur Null bestimmen Allgemeine Java-Themen 11
C javax.mail.Message message.setreplyto() null setzen (keine replyto Adresse) Allgemeine Java-Themen 25
S An internal error occurred during: Launching null argument Allgemeine Java-Themen 1
S Validation Null aber nicht Blank und muss Email sein Allgemeine Java-Themen 22
L Google Guice Field Injection returns null Allgemeine Java-Themen 2
E RMI NULL-Pointer-Exeception wenn der RMI-Proxy eine Methode deligiert Allgemeine Java-Themen 2
J Java Objekte = null, Garbagecollector Allgemeine Java-Themen 12
N MsgPack - Null Check Allgemeine Java-Themen 5
T JasperReports mit Null Pointer Allgemeine Java-Themen 3
DanielsLPecke Compiler-Fehler Warum ist der String null? Allgemeine Java-Themen 10
M Warten bis Variabel nicht null ist Allgemeine Java-Themen 18
Thallius Simple JSON Parser Error null Allgemeine Java-Themen 6
M Null byte in verschiedenen charsets Allgemeine Java-Themen 2
S Lambda Ausdrücke: @FunctionalInterface Instanzen auf null prüfen Allgemeine Java-Themen 9
B [Android] EditText-Object ist null - Nimmt nicht den Wert des enthaltenen Textfeldes ein Allgemeine Java-Themen 2
D Java Process OutputStream ist null Allgemeine Java-Themen 4
O log4j, Problem bei Ausgabe null-Wert Allgemeine Java-Themen 0
T InvalidClassException - Read null attempting to read class descriptor for object Allgemeine Java-Themen 8
D Problem mit führender Null bei Schlüsselerzeugung Allgemeine Java-Themen 5
T Variablenübergabe liefert immer null Allgemeine Java-Themen 13
K Image beim catchen ist immer null Allgemeine Java-Themen 9
B Load of Known null Value Allgemeine Java-Themen 9
W Kleine Frage zu Null-Pinter-Exception Allgemeine Java-Themen 21
T Array Sortieren (null Werte ans Ende) Allgemeine Java-Themen 2
S Null Pointer Exception bei BufferedReader Allgemeine Java-Themen 4
M Objekt prüfen auf null ->Invocation Target Exception??? Allgemeine Java-Themen 2
E Queue: Wie kann hier ein null-Pointer Exception auftreten?! Allgemeine Java-Themen 11
I newInstance() liefert null zurück Allgemeine Java-Themen 4
R Attribut null Allgemeine Java-Themen 6
C Regex: Zahl ohne führende Null Allgemeine Java-Themen 13
E rückgabewert ist immer null Allgemeine Java-Themen 2
N List auf null prüfen Allgemeine Java-Themen 2
TiME-SPLiNTER Von Unix, InputStreams und Null Bytes Allgemeine Java-Themen 2
R dateFormat - Uhr fängt nicht bei null an Allgemeine Java-Themen 2
P Null in ArrayList Allgemeine Java-Themen 3
N Strings mit null wiedergabe Splitten Allgemeine Java-Themen 4
mongole Formatter + null Allgemeine Java-Themen 4
X Prozess-Objekt nach Ausführung der destroy-Methode null oder nicht null ? Allgemeine Java-Themen 10
A Umgang mit null Allgemeine Java-Themen 16
L Object = null? Allgemeine Java-Themen 16
L null pointer exception Allgemeine Java-Themen 10
nrg Leere Objektreferenz mit != null vergleichen Allgemeine Java-Themen 4
J Null Pointer in der compare-Methode des Comparators? Allgemeine Java-Themen 18
T Set.contains() auch false wenn value == null? Allgemeine Java-Themen 4
D Matrix, ArrayList, null-Zellen Allgemeine Java-Themen 6
F Hibernate speichern - Null Allgemeine Java-Themen 5
knuckles12 null pointer exception bei arrays Allgemeine Java-Themen 6
T WeakHashMap: Wie "null" effizient abfangen? Allgemeine Java-Themen 5
N Null Durchblick in Java, Jobwechsel? Allgemeine Java-Themen 19
M nichtreferenzierte Objekte auf NULL setzen -> Performance Allgemeine Java-Themen 4
S JFreeChart LineChart Punkte über NULL Werte hinweg verbinden Allgemeine Java-Themen 5
N Array mit null Werten filtern Allgemeine Java-Themen 5
S Combobox --> liefer null? Allgemeine Java-Themen 3
A java.net.UnkownHostException: null bei jar-File Allgemeine Java-Themen 16
B Null Pointer Exception bei Canvas-objekt-Aufruf Allgemeine Java-Themen 12
H NullPointerException trotz Abfangen von null? Allgemeine Java-Themen 9
R if (obj == null || obj.isEmpty()) Allgemeine Java-Themen 21
P <null> in einer DB abfragen Allgemeine Java-Themen 4
G Nicht abgefangene Null-Pointer-Exception Allgemeine Java-Themen 2
P Image auf einem Panel mit null-Layout Allgemeine Java-Themen 8
M getResourceAsStream immer null Allgemeine Java-Themen 4
R Array komplett auf null setzen Allgemeine Java-Themen 10
A JasperReport Detail bringt null bei Datenübergabe Allgemeine Java-Themen 4
S Null Pointer Exception Allgemeine Java-Themen 10
S instanceof und null Allgemeine Java-Themen 7
M Führende Null in einem Datum Allgemeine Java-Themen 3
L null != null ? Allgemeine Java-Themen 16
Redfrettchen Rückgabe nicht sinnvoll: Exception oder null zurück? Allgemeine Java-Themen 9
B Null- oder IllegalArgumentException Allgemeine Java-Themen 12
C ImageIO die read-Methode liefert mir ein null- Wert zurück Allgemeine Java-Themen 10
K Exception im Konstruktor / Objekt == null Allgemeine Java-Themen 7
Z bedeutung (übersetzung) von null? Allgemeine Java-Themen 5
T Exception im Constructor -> null-Referenz zurückgeben Allgemeine Java-Themen 6
C Objekte null setzen? Allgemeine Java-Themen 7
P Abstrakte Elternklasse als Listener Allgemeine Java-Themen 6
eisioriginal Java Beans und deren Elternklasse Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben