2016-04-01 9 views
2

Ich versuche, ein Objekt "rationale Zahl" zu initiieren, die einen Zähler , einen Nenner q und ihr Verhältnis r speichert. Dieser Code führt zu einer falschen Antwort.Wie initiiere ich ein Java-Objekt mit einer Variablen?

class Rational { 
    int p, q; 
    double ratio; 

    public Rational(){ 
     this.p = 0; 
     this.q = 1; 
     this.ratio = this.p/(double)(this.q); 
    } 

    public static void main (String[]arg) { 
     Rational r1 = new Rational(); 

     r1.p = 1; 
     r1.q = 7; 
     // r1.ratio = r1.p/(double)(r1.q); //"this line" 
     System.out.println (r1.p + "/" + r1.q + " = " + r1.ratio) ; 
    } 
} 

Uncommentment "diese Linie" löst das Problem. Wie definiert man ein Objekt, so dass this.r automatisch jedes Mal aktualisiert wird, wenn this.p oder this.q geändert wird?

Antwort

2

Mit diesem Konstruktor können Sie Ihre Rational-Klasse hinzufügen:

public Rational(int p, int q){ 
this.p = p; 
this.q = q; 
this.ratio = this.p/(double)(this.q); 
} 
1

Sie sollten ein Verfahren zum Aktualisieren sie zum Beispiel

public void Update(int p, int q) 
{ 
    this.p = p; 
    this.q = q; 
    this.ratio = p/q; 
} 

Sie haben fügen Sie es nennen, wo Sie Werte p und q jetzt und löschen diese beiden Linien ändern sich. Dies soll es lösen :)

2
class Rational { 
    int p; 
    int q; 
    double ratio; 

    public Rational(){ 
     this.p = 0; 
     this.q = 1; 
     this.ratio = this.p/(double)(this.q); 
    } 

    public void setP(int p) { 
     this.p = p; 
     this.ratio = this.p/(double)(this.q); 
    } 

    public void setQ(int q) { 
     this.q = q; 
     this.ratio = this.p/(double)(this.q); 
    } 


    public static void main (String[]arg) { 
     Rational r1 = new Rational(); 

     r1.setP(1); 
     r1.setQ(7); 
     System.out.println (r1.p + "/" + r1.q + " = " + r1.ratio) ; 
    } 
} 
4

Meiner Meinung nach ist der einfachere Weg ist eine Funktion namens Verhältnis zu definieren, nicht eine Variable.

class Rational { 
private int p, q; 


public Rational(){ 
    this.p = 0; 
    this.q = 1; 
} 

public double ratio(){ 
    return (double)p/(double)q; 
} 

//define the getters and setters for p and q 
} 

und dann, wenn Sie das Verhältnis wollen, sollten Sie die Methode aufrufen: myRational.ratio()

+2

Sie sollten 'return (double) p/(double) q;' verwenden, um eine ganzzahlige Division zu vermeiden. –

+0

du hast Recht, danke – vincent

1

Sie sind nicht Ihr Verhältnis variable Aktualisierung nach p und q seting, so Verhältnis bleibt 0. Sie sollten Nutzen Sie die Kapselung.

Es sollte so aussehen:

class Rational { 

    private int p, q; 
    private double ratio; 

    public Rational(){ 
     this.p = 0; 
     this.q = 1; 
     updateRatio(); 
    } 

    private updateRatio() { 
     ratio = p/(double)q; 
    } 

    public setQ(int q){ 
     this.q =q; 
     updateRatio(); 
    } 

    public getQ(){ 
     return q; 
    } 

//make getters and setters for variable p too 

    public getRatio(){ 
     return ratio; 
    } 

    public static void main (String[]arg) { 
     Rational r1 = new Rational(); 

     r1.setQ(1); 
     r1.setP(7); 
     System.out.println (r1.getQ() + "/" + r1.getP() + " = " + r1.getRatio()) ; 
    } 
} 
3

beste Wette in den meisten Fällen ist die Klasse Rational unveränderlich zu machen, so dass Sie müssen nicht mit inkonsistenten Zuständen umgehen und müssen nicht Logik hinzufügen Aktualisiere abgeleitete Felder, wenn sich der Status ändert. Das heißt, Sie wollen ein anderes Rational? Konstruiere es einfach. Zeitraum. Es würde wie folgt aussehen:

class Rational { 
    final int p; 
    final int q; 
    final double ratio; 

    public Rational(int p, int q){ 
    this.p = p; 
    this.q = q; 
    this.ratio = this.p/(double)(this.q); 
    } 

    public static void main (String[]arg) { 
    Rational r1 = new Rational(1, 7); 
    System.out.println (r1.p + "/" + r1.q + " = " + r1.ratio) ; 
    } 
} 

Bonus können Sie Felder privat machen und setzen sie Getter für eine gekapselte Design.

Verwandte Themen