2012-03-03 132 views
1

我正在學習構造函數,並且我大部分都理解它們,但是我一定不能理解它。我也完全不明白this。但是,下面這段代碼是應該使用這些構造函數:瞭解構造函數和「this」

默認的構造函數,這將被用來填補矩陣隨機雙打

構造函數需要一個文件對象,指向包含一個文件 矩陣,

構造函數需要一個字符串,其中包含文件

構造這需要型矩陣的值的名稱,並使得它的一個副本

構造這需要一個二維數組,並複製其值

而更多一些,具有靜態乘法方法沿。我應該使用在main中找到的命令。但是我不太明白如何使用String作爲唯一的參數來完成它被告知的構造函數,而且其他的如默認構造函數使用隨機雙擊來填充數組。我想我應該在我的代碼中使用更多this,但我不太確定。

我主要只需要能夠設置一個矩陣,用隨機雙精度填充m1矩陣,再用m2矩陣再做一次,然後用靜態乘法來乘它們,然後輸出結果矩陣。謝謝。 (我只是一個3×3的矩陣,最初我應該將矩陣的大小設置爲在文本文件中找到的矩陣的大小,但我也可以指定我想要的大小,對此我。而對於亂碼對不起。這得到了所有混亂了,而我試圖找出這個東西出來,恐怕進一步改變它的。)

public class Matrix { 

     double A[][] = new double[3][3] 


     // Matrix file name 
     public Matrix(String name) { 
      this(new File(name)); 
     } 

     // Matrix random fill 
     public Matrix() { 
      for (int i = 0; i < 3; i++) 
      for (int j = 0; j < 3; j++) 
       this.A[i][j] = (min + Math.random() * (max - min)); 
     } 

     // Matrix copy 
     public Matrix(double[][] A) { 
      private double[][] arrcopy = new double[3][3]; 
      private double[][] array = new double[3][3]; 
      array = A; 

      for(int i = 0; i < 3; ++i){ 
       for(int j = 0; j < array[i].length; ++j) { 
        arrcopy[i][j] = array[i][j]; 
       } 
      } 
     } 

     // Set array from text file 
     public Matrix(File a) { 

      File f = a; 
      Scanner inputStreamOne = null; 

      try{ 
       inputStreamOne = new Scanner(f); 
      } 

      catch(FileNotFoundException e){ 
       System.out.printf("Error\n"); 
      } 

      double arrayOne[][] = new double[3][3]; 

      while(inputStreamOne.hasNextInt()) { 
       for(int i = 0; i < 3; ++i){ 
        for(int j = 0; j < arrayOne[i].length; ++j){ 
        arrayOne[i][j] = inputStreamOne.nextInt(); 
        } 
       } 
      inputStreamOne.close(); 
      } 
     } 

     // Gets array in file from string name 
     public Matrix(String a) { 

      String inputOne = a; 
      Scanner inputStreamOne = null; 

      try{ 
       inputStreamOne = new Scanner(new File(inputOne)); 
      } 

      catch(FileNotFoundException e){ 
       System.out.printf("Error\n"); 
      } 



      while(inputStreamOne.hasNextInt()){ 
       for(int i = 0; i < size; ++i){ 
        for(int j = 0; j < arrayOne[i].length; ++j){ 
        arrayOne[i][j] = inputStreamOne.nextInt(); 
        } 
       } 
      inputStreamOne.close(); 
      } 

     } 

     public static multiply 

     public static void main(String args[]) { 
      Matrix m = new Matrix("matrix1.txt"); 
      Matrix m2 = new Matrix("matrix2.txt"); 
      Matrix r = Matrix.multiply(m, m2); 
      r.output(...); 
     } 
    } 
+0

你能詳細說明爲什麼你覺得你需要更多地使用'this'嗎? – IceMan 2012-03-03 06:26:51

回答

0

在構造函數或方法this引用當前對象。在一個構造函數中,如果你只使用一個空的this(也就是說this而不是.method),那麼它指向具有不同類型簽名的同一對象的另一個構造函數。

像Java中的任何函數一樣,構造函數可以被重載。也就是說,由於Java的類型系統,只要具有不同的類型簽名,就可以擁有多個名稱相同的函數。

在上述例子中,一個構造採用單個串和其他需要兩個。 Java不會奇蹟般地知道如何處理傳遞給不同構造函數的數據。你需要做的是在每個方法中編寫代碼,以便生成的對象是相同的。 (從技術上講,你不必這樣做,但它是很好的形式(通常重載的構造函數用於設置默認值或爲了便於其他程序員的使用))

+0

好的,這確實有一點幫助,謝謝!但是,我只允許使用'main'中的命令,所以我唯一可以調用的構造函數就是使用String作爲參數的構造函數。我是否會在我調用'main'的構造函數中調用隨機填充構造函數? – 2012-03-03 06:30:27

+0

假設你所有的構造函數都是'public',那麼你可以從main調用它們中的任何一個。被調用的是基於你傳入的參數。所以如果你沒有傳入任何參數,那麼隨機填充一個會被調用。 – zellio 2012-03-03 06:31:54

+0

嗯,當然是的,我確實明白,理想情況下這就是我所想要的。但是我的教授說我們應該可以通過使用我已經寫在'main'中的內容來編寫程序。這就是我遇到麻煩的地方。因爲沒有提供任何參數的構造函數。所以,我已經被'main'所調用的內容所限制,而沒有增加任何內容(當然,除了在輸出方法中更改「...」外)。 – 2012-03-03 06:38:01