Java Krass doofe Noobfragen zu Java

DeusExMachina

Lt. Junior Grade
Registriert
Jan. 2008
Beiträge
351
Grüße,

meiner einer ist gezwungen sich mit Java zu beschäftigen (und will das eigentlich auch) aber irgendwo scheinen alle immer so zu tun als wäre das was sie schreiben (Tuts etc) absolut einleuchtend (leider schreiben das immer Leute für die das Einleuchtend ist).

Da ich schon bei C++ was Zuweisungen anging immer bissle, na sagen wir, farbenblind war, hätte ich gelegentlich ein paar fragen zu (wahrscheinlich) ganz Simplen Java sachen.

Ich würde mich freuen, wenn jemand der PLAN hat, so nett wäre mir bei Zeiten unter die Armee zu greifen.

Ich danke schon mal im Voraus.


Und mein erstes Problem:

Requirement 1: Die Klasse besitzt Variablen (Attribute) real und imag zur Speicherung
des Real- und Imaginärteils. Beide sind vom Typ double und private.

Requirement 2: Es gibt einen Konstruktor ohne Parameter (Standardkonstruktor), der die
beiden Attribute mit dem Wert 0.0 vorbelegt.

Requirement 3: Es gibt einen Konstruktor mit zwei double-Parametern, der die Attribute
auf die Parameterwerte setzt.

Soweit hab ich das bisher versucht zu lösen:

Code:
public class Complex {
	
	private double real;
	private double imag;
	
	public Complex(){
		real = 0.0;
		imag = 0.0;
	}

	public Complex (double real, double imag){
		
	}
	

	

}

Ich komme aber garde nicht mit dem Requirement 3 weiter und bin mir auch schrecklich unsicher ob
Code:
public Complex(){
		real = 0.0;
		imag = 0.0;
}

so richtig ist.
 
im constructor mit den 2 paramtern dann

this.real = real;
this.imag = imag;

schon hast die parameter der Klasse gesetzt

edit: wenn du auf die klassenvariablen zugreifen willst solltest du noch public variablen mit getter und setter methoden haben...

edit2: mit this greifst du auf die klassen attribute zu, falls in deiner funktion schon ein parameter mit diesem namen existiert (zum beispiel ein übergabeparameter)
 
Zuletzt bearbeitet:
So z.B.
Code:
    public Complex(double real, double imag)
    {
        this.real = real;
        this.imag = imag;
    }
Standardkonstruktor sieht auch okay aus.
 
Zuletzt bearbeitet:
Zu 3.:

Code:
public Complex (double pReal, double pImag)
{
real = pReal;
imag = pImag;
}
 
Hollowman1985 schrieb:
edit: wenn du auf die klassenvariablen zugreifen willst solltest du noch public variablen mit getter und setter methoden haben...

Was willst du damit sagen? Dass er public Variablen deklarieren soll? Und dazu dann Getter/Setter-Methoden?
Das hat mit der Aufgabe jedenfalls so oder so relativ wenig zu tun. Öffentliche Datenfelder sind quasi generell tabu und Getter/Setter-Methoden sollten nur eingefügt werden, wenn eine direkte Veränderung des Wertes von außen auch nötig ist oder wenn die Methoden mehr können sollen als nur die eine Anweisung.
 
um doppelten Code zu vermeiden (in beiden Konstruktoren wird an die gleichen Variablen zugewiesen) kann man im standard Konstruktor den anderen aufrufen:

Code:
public Complex() {
    this(0.0, 0.0);
}

public Complex(double real, double imag) {
    this.real = real;
    this.imag = imag;
}

Es ist schon sinnvoll auf die Attribute der Klasse immer mit this zuzugreifen anstatt den lokalen Variablen dann irreführende Namen zu geben wenn sie den gleichen Namen hätten wie ein Attribut
 
Danke euch allen für eure Antworten (ich dachte ich hätte schon mal ein danke gepostet aber das hat dann wohl der "Senden drücken vergessen" Button geschluckt).


Nächste doofe frage:

Ich zeuge zwei Complexe Zahlen (werte sind mal erstmal egal):

Code:
public void main(){
	
	Complex z1 = new Complex(1.0,2.0);
	Complex z2 = new Complex(3.0,4.0);
              Complex z = new Complex(0.0, 0.0); //fuer das Ergebnis
	
}

(ich hoffe mal das ist richtig so)

für die Addition gilt dann:

z= z1 + z2 = (a1 + a2) + (b1 + b2)*j ;

(wobei a der Realanteil und b der Imaginärteil der zahl sind) zurück geben will ich z
wobei z selber vom typ Complex sein soll also real und imag enthält (getter und setter Methoden sind mit Eclipse schon erzeugt wurden).

haken tut es jetzt aber hier:

Code:
public Complex add(){
	
	a1 	= getReal(value1); // funzt so nicht
	//für a2 und b weg gelassen
	
	 setReal(z)= (a1 + a2);
	 setImag(z)= (b1 + b2);	
}


Ich seh grad den Baum vor lauter wald nicht mehr und bräuchte mal nen Schubs in die richtige Richtung.
 
Zuletzt bearbeitet:
Code:
public Complex add(Complex c1){
  this.real = this.real + c1.real;
  this.imag = this.imag + c1.imag;
  return this;
}

public static Complex add(Complex c1, Complex c2){
  return new Complex(c1.real + c2.real, c1.imag + c2.imag);
}

Der erste Code addiert die Complex c1 zu der aktuellen Instanz,
also z.B so:
Complex z1 = new Complex(1.0,2.0);
Complex z2 = new Complex(3.0,4.0);
z1.add(z2);

der zweite addiert zwei Complex in einer neuen Instanz, z.B:
Complex z3 = Complex.add(z1, z2);

Edit:
Die brauchst Du wohl auch noch .. :D
Code:
public Complex sub(Complex c1) {
  this.real = this.real - c1.real;
  this.imag = this.imag - c1.imag;
  return this;
}

public static Complex sub(Complex c1, Complex c2) {
  return new Complex(c1.real - c2.real, c1.imag - c2.imag);
}
public Complex mul(Complex c1) {
  double _real = this.real * c1.real - this.imag * c1.imag;
  double _imag = this.real * c1.imag + c1.real * this.imag;
  this.real = _real;
  this.imag = _imag;
  return this;
}

public static Complex mul(Complex c1, Complex c2) {
  return new Complex(c1.real * c2.real - c1.imag * c2.imag, c1.real * c2.imag + c2.real * c1.imag);
}

public Complex div(Complex c1) {
  double d, d1, d2;
  d = c1.real * c1.real + c1.imag * c1.imag;
  if (d == 0) {
    this.real = 0;
    this.imag = 0;
  }
  else {
    d1 = this.real * c1.real + this.imag * c1.imag;
    d2 = this.imag * c1.real - this.real * c1.imag;
    this.real = d1 / d;
    this.imag = d2 / d;
  }
  return this;
}

public static Complex div(Complex c1, Complex c2) {
  double d, d1, d2;
  d = c2.real * c2.real + c2.imag * c2.imag;
  if (d == 0)
    return new Complex(0, 0);

  d1 = c1.real * c2.real + c1.imag * c2.imag;
  d2 = c1.imag * c2.real - c1.real * c2.imag;
  return new Complex(d1 / d, d2 / d);
}

public double abs() {
  return Math.sqrt(real * real + imag * imag);
}
 
Zuletzt bearbeitet:
Schon mal danke, (auch für die anderen Lösungen obwohl ich die mir erst ansehen werde wenn ich es selber versucht hab).

Noch ne Verständnis Frage:

der zweite addiert zwei Complex in einer neuen Instanz, z.B:
Complex z3 = Complex.add(z1, z2);

Hier wird Complex z3 erst dann erzeugt wenn die Methode aufgerufen wird (das Deklarieren in der Main würde also komplett entfallen und der Speicher auch erst dann belegt wenn er gebraucht wird)?

Und ich muss bei Methoden wie auch bei C und C++ die übergebenen Werte mit Reinschreiben aber wozu dann getter und setter? oder werden die automatisch so vorhanden aufgerufen?
 
DeusExMachina schrieb:
Hier wird Complex z3 erst dann erzeugt wenn die Methode aufgerufen wird (das Deklarieren in der Main würde also komplett entfallen und der Speicher auch erst dann belegt wenn er gebraucht wird)?
Ja, aber die nicht statischen Methoden sind "sparsamer", da nur eine Instanz erzeugt werden muss für die Zahl auf die addiert werden soll und eine Instanz die addiert wird.

Bei den statischen Methoden 3 Instanzen: 2 Instanzen der zu addieren Zahlen und eine neu Instanz die das Ergebnis zurückliefert.

Edit:
Man könnte die aber auch so schreiben:
public static Complex add(Complex c1, Complex c2){
c1.real = c1.real + c2.real;
c1.imag = c1.imag + c2.imag;
return c1;
}

aber dann wird wirklich c1 geändert, d.h schreibt man dann z.B:
Complex z1 = new Complex(1.0,2.0);
Complex z2 = new Complex(3.0,4.0);
Complex z3 = Complex.add(z1, z2);
dann ist z1 = z3, also (4.0, 6.0).

DeusExMachina schrieb:
Und ich muss bei Methoden wie auch bei C und C++ die übergebenen Werte mit Reinschreiben aber wozu dann getter und setter? oder werden die automatisch so vorhanden aufgerufen?

Getter/Setter braucht man nur ausserhalb der Klasse, die privat deklarierten Variablen sind nur innerhalb der Klasse sichtbar.
 
Zuletzt bearbeitet:
Zurück
Oben