2016-06-27 190 views
0

我是一個嘗試使用不同文件中定義的類的新手Java程序員。所以,我寫了這兩個.java文件:如何從另一個類中定義的類創建數組

首先,有MyLibrary.java:

package mymainprogram; 

public class MyLibrary { 
    public class MyRecord { 
     int number; 
     char letter; 
    } 

    public static int TriplePlusThree(int input_number) {    
     return ((input_number*3) + 3); 
    } 
} 

然後,MyMainProgram.java:

package mymainprogram; 

import java.util.Scanner; 

public class MyMainProgram { 
    public static void main(String[] args) { 
     Scanner keyread = new Scanner(System.in); 

     System.out.print("Enter Number to Process: "); 
     int num = keyread.nextInt(); 
     int result = MyLibrary.TriplePlusThree(num); 
     System.out.println("3x + 3 = "+result); 

     String letters = "ABCDEFGHIJ"; 
     MyLibrary.MyRecord[] TenRecs = new MyLibrary.MyRecord[10]; 

     for (int i = 0; i < 10; i++) { 
      TenRecs[i].number = i;  //NullPointerException here 
      TenRecs[i].letter = letters.charAt(i);   
     } 
    } 
} 

我沒有使方法工作得很好的問題;現在我的目標是創建一個數組,其中每個成員都有一個整數和字符。 (注意:我不是在尋找更好的方法來實現這個目標,我只是用這個簡單的例子來試圖實現這個目標)。

當我試圖運行我的程序,我得到:

java.lang.NullPointerException

我研究這個,發現this page,它說:

If we try to access the objects even before creating them, run time errors would occur. For instance, the following statement throws a NullPointerException during runtime which indicates that [this array] isn't yet pointing to [an] object. The objects have to be instantiated using the constructor of the class and their references should be assigned to the array elements in the following way.

studentArray[0] = new Student(); 

所以,我想這樣做在我的主程序中:

MyRecordArray[0] = new MyLibrary.MyRecord(); 

但它給出了這個錯誤:

an enclosing instance that contains MyLibrary.MyRecord is required

該錯誤信息導致我this Stack Exchange question,它說:

you have to create an object of X class (outer class) and then use objX.new InnerClass() syntax to create an object of Y class.

X x = new X(); 
X.Y y = x.new Y(); 

所以,按照這個答案,我添加這兩行我的程序:

MyLibrary mylibrary   = new MyLibrary(); 
MyLibrary.MyRecord myrecord = mylibrary.new MyRecord(); 

這些行不會給出任何警告或編譯錯誤,所以我覺得我離得更近了一步,但我仍然在試圖弄清楚如何創建一個數組。我知道,如果我想讓整數數組,我只想做到這一點:

int[] TenInts = new int[10]; 

所以,我已經試過了諸如:

myrecord[] TenRecs = new myrecord[10]; 
MyRecord[] TenRecs = new MyRecord[10]; 

但沒有什麼工作,我覺得自己像我現在正在抓秸稈。我感覺到正確的眼睛可以很快解決這個問題。

回答

1

您需要將內部類聲明爲靜態。

可以按如下方式來滿足您的要求修改代碼:

這是在MyLibrary

public class MyLibrary { 

    public static class MyRecord{ 
     int number; 
     char letter; 

     public MyRecord(){ 
      number = 0; 
      letter = '\0'; 
     } 

     public MyRecord(int number, char letter){ 
      this.number = number; 
      this.letter = letter; 
     } 
    } 

    public static int TriplePlusThree(int input_number){ 
     return (input_number * 3 + 3); 
    } 
} 

代碼這是MyMainProgram代碼

import java.util.Scanner; 

public class MyMainProgram { 

    public static void main(String[] args){ 
     Scanner in = new Scanner(System.in); 
     System.out.println("Enter number to process"); 
     int num = in.nextInt(); 
     System.out.println("3x + 3 = " + MyLibrary.TriplePlusThree(num)); 

     String letters = "ABCDEFGHIJ"; 
     MyLibrary.MyRecord[] TenRecords = new MyLibrary.MyRecord[2]; 

     for (int i=0; i<TenRecords.length; i++){ 
      TenRecords[i] = new MyLibrary.MyRecord(); 
      TenRecords[i].number = i; 
      TenRecords[i].letter = letters.charAt(i); 
     } 

     // Printing class records 
     for (int i=0; i<TenRecords.length; i++){ 
      System.out.println("Printing records of record " + i + " : "); 
      System.out.println("Number : " + TenRecords[i].number); 
      System.out.println("Letter : " + TenRecords[i].letter); 
     } 
     in.close(); 
    } 
} 

您可以創建內部類的實例如下:

TenRecords[i] = new MyLibrary.MyRecord(); 

希望這會有所幫助。

0

有幾點你需要注意。 首先,一個實例內部類和靜態內部類 一個實例內部類之間的差異,宣佈不static修改,

public class OutterClass { 
    public class InstanceInnerClass {} 
} 

應該這樣創建:

OutterClass outter = new OutterClass(); 
InstanceInnerClass iInner = outter.new InstanceInnerClass(); 

而靜態內部類,用static修飾符聲明,

public class OutterClass { 
    public static class StaticInnerClass {} 
} 

應該像這樣創建:

StaticInnerClass sInner = new OutterClass.StaticInnerClass(); 

其次,你如果初始化MyRecord[10]陣中擁有空物體它充滿

MyLibrary library = new MyLibrary(); 
MyLibrary.MyRecord[] TenRecs = new MyLibrary.MyRecord[10]; 
for (int i = 0; i < 10; i++) { 
    // Create new instance 
    TenRecs[i] = library.new MyRecord(); 
    TenRecs[i].number = i; 
    TenRecs[i].letter = letters.charAt(i); 
} 
0

之前訪問的數組項。您仍然需要將陣列中的每個元素初始化爲新的MyRecord對象。否則,您將獲得NPE

一種方式做的是:List<MyRecord> TenRecs = new ArrayList<MyRecord>(); TenRecs.add(new MyRecord());

for (int i = 0; i < 10; i++) TenRecs[i] = new MyRecord();

此外,如果你添加一個import語句:import mymainpackage.MyLibrary.MyRecord;你不需要做mylibrary.new MyRecord();只是做new MyRecord();

0

您必須在初始化之前創建數組中的每個對象。請參閱this link

像這樣創建每個對象。

MyLibrary outer = new MyLibrary(); 
TenRecs[i] = outer.new MyRecord(); 

全碼:

MyLibrary.MyRecord[] TenRecs = new MyLibrary.MyRecord[10]; 

    for (int i = 0; i < 10; i++) { 
     MyLibrary outer = new MyLibrary(); 
     TenRecs[i] = outer.new MyRecord(); 
     TenRecs[i].number = i; 
     TenRecs[i].letter = letters.charAt(i); 
    } 
1

嵌套類MyRecord包含隱藏參考外部類MyLibrary,因此必須具有一個MyLibrary實例相關聯。這樣MyRecord可以訪問MyLibrary的私人成員。

MyLibrary.MyRecord myrecord = mylibrary.new MyRecord(); 

哇,這是有趣的語法。在我所有的Java編程年代中,我從來沒有使用過這樣的構造。通常,可以創建外部類(MyLibrary)內內部類(MyRecord)的對象。另一個常見的情況是將內部類聲明爲static,這將消除對外部類實例的需求。


MyRecord[] TenRecs = new MyRecord[10]; 

這將創建一個陣列,其中的所有元素都爲NULL。你必須初始化它們中的每一個(例如用一個循環)。

+0

我承認,這是一個有趣的語法。我只是試圖按照其他答案的語法,這個答案已經獲得了50個讚揚。 –

相關問題