Erste Schritte Umstieg von PHP - Deklaration

elf

Neues Mitglied
Guten Tag,

ich bin ein völliger Neuling in Java, habe aber bereits einiges an Programmiererfahrung in PHP gesammelt. Nun gibt es in PHP keine Variablen Deklaration, etc., was mir nun den Umstieg ein wenig erschwert.

Mein Problem ist, denke ich, ziemlich simpel:
Wenn ich eine Variable mit einer Elternklasse deklariere, scheine ich nur Zugriff auf die Eigenschaften und Methoden eben jener Elternklasse zu haben. Natürlich wird jeder etwas weiter fortgeschrittene Java Entwickler mit diesem Verhalten rechnen, mich verwirrt es.
Hier ein Beispiel. Ich weiß nicht, ob es etwas taugt:
Java:
public abstract class Fruit 
{
    public String color = "undefined";
}

public class Banana extends Fruit
{
    public String color = "yellow";
}

public class Apple extends Fruit
{
    public String color = "red";
}

public class FruitApp 
{
	public static void main(String[] args) 
	{	
		// Store an unknown Fruit
		Fruit fruit 	= new Banana();
		// Store a Banana
		Banana banana 	= new Banana();
		// Store an Apple
		Apple apple 	= new Apple();
		
		// Store all kinds of fruits
		Fruit[] fruitbowl = {banana, apple};
		
		// undefined
		System.out.print(fruit.color+"\n");
		// yellow
		System.out.print(banana.color+"\n");
		// undefined
		System.out.print(fruitbowl[0].color+"\n");
		// undefined
		System.out.print(fruitbowl[1].color+"\n");
	}
}

Warum enthält banana.color plötzlich "undefined"? Natürlich weil es wohl eine Variable mit dem Typ Fruit ist. Aber wie mache ich es sonst, wenn ich im Vorhinein genau sagen kann, welchen Untertyp eine Variable hat? Das Selbe mit dem Array.

Ich hoffe, irgendwer kann mir das erklären. Mir fehlen leider die Stichwörter für den erfolgreichen Einsatz einer Suchmaschine. Seid bitte nett, ich bin wirklich absolut neu was Typisierung betrifft.

lg
elf
 
Zuletzt bearbeitet:
Warum enthält banana.color plötzlich "undefined"? Natürlich weil es wohl eine Variable mit dem Typ Fruit ist. Aber wie mache ich es sonst, wenn ich im Vorhinein genau sagen kann, welchen Untertyp eine Variable hat?

z.B. so:

Java:
public public abstract class Fruit {
	public abstract String getColor();
}
 
public class Banana extends Fruit{
    private String color = "yellow";

	@Override
	public String getColor() {
		return color;
	}
}
 
public class Apple extends Fruit{
	private String color = "red";

	@Override
	public String getColor() {
		return color;
	}
}
 
public class FruitApp {
    public static void main(String[] args) 
    {   
        // Store an unknown Fruit
        Fruit fruit     = new Banana();
        // Store a Banana
        Banana banana   = new Banana();
        // Store an Apple
        Apple apple     = new Apple();
        
        // Store all kinds of fruits
        Fruit[] fruitbowl = {banana, apple};
        
        System.out.print(fruit.getColor()+"\n");
        System.out.print(banana.getColor()+"\n");
        System.out.print(fruitbowl[0].getColor()+"\n");
        System.out.print(fruitbowl[1].getColor()+"\n");
    }
}
 
Lass bei Banana und Apple die neudeklaration weg, denn Attribute kann man nicht überschreiben! Die von Fruit erbenden Klassen besitzen ja schon das geerbte "color". Also musst du nur den Wert neu setzen.
Java:
public class Banana extends Fruit
{
    Banana() {
        color = "yellow";
    }
}
public class Apple extends Fruit
{
    Apple() {
        color = "red";
    }
}
 
Dein Array ist vom Typ Fruit, daher wird die color Eigenschaft von Fruit genommen.

Soll dein Beispiel irgendwas Polymorphie ähnliches sein? Das macht man in der Regel anders.
 
EDIT:
So macht das ganze etwas mehr sinn:

Java:
public abstract class Fruit {
    private String color;
    
    public Fruit(String color) {
    	this.color = color;
	}
    
    public String getColor() {
		return color;
	}
}

Java:
public class Banana extends Fruit {
	public Banana() {
		// call the fruit constructor
		super("yellow");
	}
}

Java:
public class Apple extends Fruit {
	public Apple() {
		// call the fruit constructor
		super("red");
	}
}
Zu langsam 🙁
Und noch den falschen button erwischt 🙂
 
Zuletzt bearbeitet von einem Moderator:
Ich möchte mich doch gerne mal etwas weit aus dem Fenster lehnen aber ist dies nicht ein fall für Shadowing da nämlich die neue Klasse die alte Variable überdeckt ???

Java:
Banana b = new Banana();
System.out.println(b.color());
Fruit f = (Fruit) b;
System.out.println(f);

Lass bei Banana und Apple die neudeklaration weg, denn Attribute kann man nicht überschreiben! Die von Fruit erbenden Klassen besitzen ja schon das geerbte "color". Also musst du nur den Wert neu setzen.
Java:
public class Banana extends Fruit
{
    Banana() {
        color = "yellow";
    }
}
public class Apple extends Fruit
{
    Apple() {
        color = "red";
    }
}
 
[OT]wahhh... also "public Irgendwas irgendwas;" macht wenig Sinn, weil man's von aussen ändern kann wie man will, schlimmstenfalls 'null' zuweisen. "public final Irgendwas irgendwas;" ist da schon sinnvoller.[/OT]
 
Vielen Dank! Ich verstehe jetzt.
PHP hat eine Neudeklaration eines Attributs erlaubt. Bzw. hat es sich so verhalten, als hätte man den neuen Wert im Konstruktor zugewiesen. Mir ging es also um ganz grundlegendes Verhalten bei Vererbung.

Danke nochmal allen, für die Hilfe! Dann kanns jetzt weiter gehen. 😉
 

Neue Themen


Zurück
Oben