2017-11-28 5 views
0

Ich habe an einer Aufgabe gearbeitet, und ich bin ziemlich neu in der Programmierung, und ich habe Mühe, den ersten Konstruktor zu verwenden, den ich in der add-Methode gemacht habe. Ich habe beide Konstruktoren getestet, um sicherzustellen, dass sie funktionieren, ich weiß einfach nicht, wie ich sie nennen soll, um sie in der Methode zu verwenden. Der erste Konstruktor soll eine Zahl nehmen und sie in ein Array von booleschen Werten konvertieren, wobei wahr eine 1 ist und false 0 ist. Die booleschen Werte sollen binäre Zahlen darstellen. Der zweite Konstruktor soll einen String aufnehmen und in eine BinaryNumber umwandeln, wie ich es im ersten Konstruktor erstellt habe. Für die add-Methode versuche ich eine vom Benutzer eingegebene Binärzahl zu dem hinzuzufügen, was der Benutzer für den Konstruktor gemacht hat. Vielen Dank für jede Hilfe!Verwenden eines Konstruktors in einer Methode

public class BinaryNumber implements BinaryNumberInterface 
{ 
    public int x; 
    public int input; 
    boolean[] oneZero = new boolean[9]; 
    public BinaryNumber(int input) 
    { 
     if (input < -256 
     || input > 255) 
     { 
      throw new IllegalArgumentException ("Number must be between -256 and 255"); 
     } 

     boolean negative = false; 
     int temp = input; 
     if (input < 0) 
     { 
      negative = true; 
     } 

     for (int i = 7; i >= 0; i --) 
     { 
      if (temp >= Math.pow (2, i)) 
      { 
       oneZero [i] = true; 
       temp -= Math.pow(2, i); 
      } 
     } 

     if (negative == true) 
     { 
      this.negate(); 
     } 
    } 

    public BinaryNumber(String num) 
    { 
     int integer = 0; 

     for (int i = num.length() - 1; i >= 0; i --) 
     {      
      String substring = num.substring (i, i + 1); 

      if (substring.equals("1") 
      && num.length() - i != 9) 
      { 
       integer += Math.pow (2, num.length() - i - 1); 
      } 

     } 

     if (num.length() == 9) 
     { 
      String substring1 = num.substring (8); 

      if (substring1.equals("1")) 
      { 
       integer = integer * -1; 
      } 
     }  

     BinaryNumber num2 = new BinaryNumber(integer); 
    } 

    public BinaryNumber add(BinaryNumber input) 
    { 

    } 
} 

Antwort

0

für Anruf ein Konstruktor einer Klasse können Sie dies tun:

this(parameter1, parameter2, ...); 

aber ist ratsam, nicht Konstrukteuren als Methoden. Sie sollten Konstruktoren verwenden, um Attribute mit Werten und Methoden zur Manipulation dieser Attribute zu initialisieren.

0

Dies ist nicht so, wie Konstruktoren in Java arbeiten. Ihr Konstruktor, der mit einem int arbeitet, wird korrekt geschrieben, aber Ihr String-Konstruktor wird nicht funktionieren. Sie erstellen eine BinaryNumber-Instanz und setzen niemals ihr Bit-Array (oneZero) und erstellen dann eine neue BinaryNumber-Instanz am Ende des Konstruktors, die einfach verschwindet. Was Sie versuchen, wird Konstruktorüberladung genannt. Um den int-Konstruktor aufzurufen, müssen Sie this(int) in der ersten Zeile Ihres String-Konstruktors aufrufen. Ich würde empfehlen, ein wenig mehr darüber zu lesen, wie Konstruktoren arbeiten: https://www.javatpoint.com/constructor

Um Ihre Add (Binary Number) -Methode arbeiten zu lassen, verwenden Sie die Bit-Arrays beider Binärzahlen, die Sie hinzufügen. Zum Beispiel, wenn Sie das tun

BinaryNumber a = new BinaryNumber(10); 
BinaryNumber b = new BinaryNumber(18); 
BinaryNumber sum = a.add(b); 

in der Methode Add a:

public BinaryNumber add(BinaryNumber input){ 
    /* 
    this is a reference to a's array of bits 
    oneZero 
    //this is a reference to b's array of bits 
    input.oneZero 
    */ 
    BinaryNumber result = new BinaryNumber(0); 
    //add logic to add the numbers here and set result to the sum of a + b 
    return result; 
} 

EDIT: Es kam nur zu mir, dass der einfachste Weg für Sie Ihren Zeichenfolgenkonstruktor zu implementieren wäre, Verwenden Sie eine Factory-Methode, da Sie nicht einfach Parameter laden, würde es wahrscheinlich besser funktionieren. Hier ist, wie Sie es tun

public static BinaryNumber fromString(String input){ 
    int integer = 0; 

     for (int i = num.length() - 1; i >= 0; i --) 
     {      
      String substring = num.substring (i, i + 1); 

      if (substring.equals("1") 
      && num.length() - i != 9) 
      { 
       integer += Math.pow (2, num.length() - i - 1); 
      } 

     } 

     if (num.length() == 9) 
     { 
      String substring1 = num.substring (8); 

      if (substring1.equals("1")) 
      { 
       integer = integer * -1; 
      } 
     } 
    return new BinaryNumber(integer); 
} 

und rufen Sie es mit BinaryString a = BinaryString.fromString("10100");

0

einen Konstruktor aufrufen new MyClass(...) aus einem anderen Konstruktor wird nicht auf magische Weise this mit der neuen Instanz ersetzen, so erstellt.

Ich glaube, Sie wollen, ist dies:

public BinaryNumber(String num) { 
    int integer = 0; 

    // calculate what integer is 

    this(integer); 
} 

aber in Java, muss verschachtelte Konstruktoraufrufe die erste Aussage im äußeren Konstruktor sein.

Die Abhilfe ist dies:

public BinaryNumber(String num) { 
    this(stringToInteger(num)); 
} 

private static int stringToInteger(String num) { 
    int integer = 0; 

    // calculate what integer is 

    return integer; 
} 
Verwandte Themen