Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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?
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?
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.
: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]
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) {
}
}
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.
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 ...