Klassen constructor Rückgabewert

Nookie

Mitglied
Hallo.

Ich habe eine kleine Klasse entworfen welche ich mit einer Minimum und Maximum zahl füttern kann und die mir anschliessend einen Wert der dazwischen liegt zurückgeben soll.

Ich rufe die Klasse so auf:

rand rando = new rand(min,max);

nun muss ich aber noch explizit die funktion rand.roll() aufrufen damit meine Zufallszahl zurückkommt da der Compiler scheinbar keinen constructor mit Rückgabewert zulässt?

Wie machen andere Klassen sowas?

mfg
 
nun muss ich aber noch explizit die funktion rand.roll() aufrufen damit meine Zufallszahl zurückkommt da der Compiler scheinbar keinen constructor mit Rückgabewert zulässt?

Wie machen andere Klassen sowas?

mfg

Das ist richtig. Entweder erstellst du dir eine Instanz der Klasse und rufst dann roll() auf oder aber du machst die Methode statisch, was bei Utility-Klassen erlaubt ist. Dann könntest du die Methode mit DeineKlasse.methode(min, max); aufrufen und auch einen Rückgabewert entgegennehmen.
 
Der "Rückgabewert" eines Konstruktors ist immer die Klasse.
:autsch: Hoffentlich nicht... ich hätte nämlich manchmal auch gerne Instanzen einer Klasse. 😉
z.B. eine der Klasse RandomNumber
Java:
public class RandomNumber extends Number implements Comparable<Number> {
	private static final long serialVersionUID = 6539973018780199660L;

	private final double value;

	public RandomNumber(double min, double max) {
		double mn = Math.min(min, max);
		double mx = Math.max(min, max);
		double range = mx - mn;
		value = Math.random() * range + mn;
	}

	@Override
	public int intValue() {
		return (int) value;
	}

	@Override
	public long longValue() {
		return (long) value;
	}

	@Override
	public float floatValue() {
		return (float) value;
	}

	@Override
	public double doubleValue() {
		return value;
	}

	@Override
	public int compareTo(Number o) {
		return Double.compare(value, o.doubleValue());
	}

	@Override
	public boolean equals(Object obj) {
		if(this == obj) {
			return true;
		}
		if(obj instanceof Number) {
			Double d = ((Number) obj).doubleValue();
			return Double.valueOf(value).equals(d);
		}
		return false;
	}

	@Override
	public int hashCode() {
		return Double.valueOf(value).hashCode();
	}

	@Override
	public String toString() {
		return String.valueOf(value);
	}
}
[OT]Fehlt nur noch, dass man in der Klasse Number abstrakte Metoden für +, -, *, / und % definiert, welche die JVM entsprechend aufrufen kann, wenn im Code z.B. [c]Number a = (Number) b + (Number) c[/c] auftaucht, dann könnte man mit allen Numbers rechnen statt nur mit Integer, Double usw. Aber so wie's jetzt ist, kommt man leider um ein <Number>.doubleValue() o.ä. leider nicht drum rum.[/OT]
 
Zuletzt bearbeitet von einem Moderator:
Wenn wir ehrlich sein wollen, hat jeder Konstruktor den Rückgabetyp
Code:
void
. Aber das wird nun wohl mehr verwirren als helfen.
 
Wenn wir ehrlich sein wollen, hat jeder Konstruktor den Rückgabetyp
Code:
void
. Aber das wird nun wohl mehr verwirren als helfen.
Das verwirrt insoweit, dass es nicht stimmt. Denn wenn wir ganz ehrlich sind können wir Konstruktoren nicht mal direkt aufrufen, das geschieht nämlich mit dem Schlüsselwort new (oder per Reflection) und dieses liefert entweder ein Objekt (eine Instanz) der Klasse zurück oder es fliegt 'ne Exception. Und wenn wir noch ehrlicher sind, klingt Schandros Aussage auch mehr nach 'nem flüchtigen Versprecher, denn im Gegensatz zu "Klasse", ist "void" wahrhaftig grober Unfug.
Wie mag so ein Konstruktor wohl eigentlich aussehen?
Java:
class MyClass {
  public MyClass MyClass() {
  }

  // oder
  public void MyClass() {
  }

  // ist das alles Quark? Sieht er in Wirklichkeit etwa so aus?
  public static MyClass <init>(Object ... parameter) {
  }
}
 
Zuletzt bearbeitet von einem Moderator:
Dann schau doch einfach in den Bytecode, wenn du mir nicht glaubst. Der Standardkonstruktor einer von Object erbenden Klasse sieht so aus:
Java:
public void <init>() {
	0: aload_0
	1: invokespecial java/lang/Object."<init>":()V
	4: return
}
Nur über Reflection lässt er sich als normale Methode mit dem Namen "<init>" nicht ansprechen.
 
Euch ist schon bewusst das wir uns hier um subforum "Java Basics - Anfänger-Themen" befinden? Lasst bitte dieses ganze Gerede über Bytecode und Reflection usw... Das interessiert den Fragesteller zurecht nicht, und wenn dann verwirrt es eher als das es irgendwas nützen würde. Schlussendlich ist nur wichtig das
Code:
new Klasse(...)
immer eine Instanz der Klasse zurückgibt. Ob das nun 100% korrekt technisch ausgedrückt ist oder nicht interessiert nicht.
 
Dann schau doch einfach in den Bytecode, wenn du mir nicht glaubst. Der Standardkonstruktor einer von Object erbenden Klasse sieht so aus:
Java:
public void <init>() {
	0: aload_0
	1: invokespecial java/lang/Object."<init>":()V
	4: return
}
Nur über Reflection lässt er sich als normale Methode mit dem Namen "<init>" nicht ansprechen.

Aber auch nur weil der NEW Bytecode vorher die Instanz erzeugt und dann der Konstruktor aufgerufen wird 😛 *klugs*******
 
man könnte auch noch zwischen clinit und init unterscheiden ...
in clinit wird dann das ausgeführt was im source im [c]static { }[/c] block der klasse steht ... zumindest so mal auf StackOverflow gelesen ...
 

Zurück
Oben