Instanzprobleme

Status
Nicht offen für weitere Antworten.

virtualAudio

Aktives Mitglied
Hi,

folgender Code funktioniert leider nicht wie er soll. Nach einem Aufruf von UserNoteTester.main bekommen wir die Ausgabe:
note 19 cents 35
Note: 0 - 0cents.

Im Konstruktor hat er noch die richtigen Werte, zurück in der Main - Methode haben die Instanzvariablen aber auf einmal 0 Werte. Warum?

Danke für eure Mühen!

Beste Grüße,
Andy


Code:
public class UserNote {

	private int note;		// die Note die der User singt
	private int cents;		// Differenz der übergebenen Userfrequenz zu dieser Usernote
	private static float referenz_A;	// tuning
	
	
	
	/*
	 * KONSTRUKTOR (int midinote, int cent)
	 */
	public  UserNote(int n, int c) {
		this.note = n;
		this.cents =c;
		
		if (c>49||c<-50){
			int posneg = (int)Math.signum(c);
			int semitones = (int)(Math.abs(c)/100f+0.5)*posneg;
			this.note += semitones;
			this.cents = c-semitones*100;
		}
		System.out.println("note " + note + " cents " + cents);
	}
	
	
	
	public UserNote(float hz, int refNote, float ref_A){
		referenz_A = ref_A;
		int userGesungeneNote = (int)-(12*logDualis(referenz_A/hz)-57);
		int cents = (int)(1200*logDualis(hz/PitchDetection.hzOfNote(userGesungeneNote)));
		int userMidinote = userGesungeneNote;
		int diff = userGesungeneNote%12 - refNote%12;
		int dazu; //zur refNote dazuaddieren um auf die 'angepasste' Usernote zu kommen
		
		if(diff>6){
			dazu = -12+diff;
		}else if(diff<-6){
			dazu =  12+diff;
		}else{
			dazu = diff;
		}
		userMidinote=refNote+dazu;
		new UserNote(userMidinote, cents);
	}

	
	
		
	
	private float logDualis(float wert){
		return (float)(Math.log(wert)/Math.log(2));
	}
	

	public String toString(){
		return "Note: " + this.note + " - " + this.cents + "cents.";
	}



	public int getCents() {
		return this.cents;
	}



	public int getNote() {
		return this.note;
	}
}

Code:
public class UserNoteTester {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		UserNote user = new UserNote(100, 50, 56);
		System.out.println(user.toString());
	}

}
 

Marco13

Top Contributor
Es wird der zweite Konstruktor aufgerufen, und das
new UserNote(userMidinote, cents);
dort am Ende bewirkt nicht das, was du vermutlich erhoffst.

Eine Möglichkeit wäre, den ersten Konstruktor in eine Normale Methode zu verwandeln, z.B.
public void init(int n, int c) { ... }
und DIE dann anstelle des
new UserNote(userMidinote, cents);
am ende des zweiten Konstruktors aufzurufen.
 

Tobias

Top Contributor
Die init() sollte dann aber besser private sein, weil man sonst das schöne Immutable-Pattern zerstören würde...

mpG
Tobias

/klugscheiss

P.S.: Wie man Konstruktor richtig miteinander verbindet, findest du unter "Constructor-Chaining" oder einer eingedeutschten Variante des Begriffs im Lehrbuch deiner Wahl.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben