2011-03-04 29 views
2

我期待在上發現了一個教程:http://www.ibm.com/developerworks/library/j-dyn0603/班[] - 是什麼意思?

特別是有一個部分,在那裏它提供了以下例子:

Class[] types = new Class[] { String.class, String.class }; 
Constructor cons = TwoString.class.getConstructor(types); 
Object[] args = new Object[] { "a", "b" }; 
TwoString ts = (TwoString)cons.newInstance(args); 

我不知道情況怎麼樣等級[]表示。我讀過它的方式是'一個名爲類型的Class對象數組'。我對新語句中使用的語法也有些不熟悉 - 新的Class [] {String.class,String.class}如何工作?

如果有人可以幫我打破這件事,我將不勝感激。

+0

請參閱[數組類型:Java in a Nutshell](http://docstore.mik.ua/orelly/java-ent/jnut/ch02_09.htm) - 特別是「數組文字」部分。 – 2011-03-04 21:30:56

回答

1

是字面的意思是你在想它到底是什麼

Class[] types = new Class[] { String.class, String.class };是某行的聲明和初始化。它說創建一個數組來保存Class類型的對象,並用Class類型的兩個對象(即String.class和String.class)初始化它。

一個類似的例子將是

int[] nums = new int[]{1,2,3}; 

float[] decimals = new float[]{1.2, 3.1, 5.2} 
+0

很酷,我以前沒有看過這個語法。這是我的理解,你可以只說Int [] nums = {1,2,3};並跳過新的聲明。 – nazbot 2011-03-04 21:34:22

+0

是。當你使用像這樣的初始化時,語法有點多餘。我沒有足夠的內部,但也許有一個原因,他們不只是沒有'新的類[]'部分 – 2011-03-04 21:39:11

+1

'new type [] {...}'語法也適用於變量雖然沒有在同一個聲明中聲明。 – 2011-03-04 22:12:19

1

這是一個共享超級類型的對象數組Class

在Java中,一切都是Object。這意味着如果你想要在代碼中知道類的類型,你需要創建一個Object,它可以封裝類的細節。 Java稱之爲Object a Class

注意大小寫和注意,因爲ClassObject,你可以調用類的所有Object方法,如x.getClass()x.wait()x.hashcode()

Class[] items = { String.class, Integer.class }; 

表示創建一個名爲items的數組,其中包含Class對象。用代表String的類和Integer的類的Object初始化該數組。

由於Class對象代表類的類型,所以這兩個對象通常在非正式語音中互換使用。

+0

呃..在java中並非一切都是對象。 – OscarRyz 2011-03-04 21:33:03

+0

@Oscar,好吧,是的,有原始。但是如果你深入瞭解JVM的實現,你會發現接口被實現爲類並且像對象一樣處理。 – 2011-03-04 21:37:13

1

這類型Class

new Class[] {...} 

創建並Class類型,其內容被列內的數組的數組。

一般

類型 []手段,一個就像你想到 「...的陣列」。

事實證明,這裏的類型是Class,它在Java中是一個正在運行的類或接口的表示。

也許你不應該去追求像反思這樣的高級功能,而不必先了解基礎知識。

+0

這更多的是新Blah [] {a,b,c}的語法讓我困惑。我不太確定那裏發生了什麼事。我對JVM,類加載器,字節碼,反射等非常熟悉。主要是一個n00b語法問題。 – nazbot 2011-03-04 22:19:20

+0

@nazbot我很高興聽到這個消息。我認爲這是你第一次看這門語言,肯定反思並不是一個好的開始。 – OscarRyz 2011-03-04 22:21:50

+0

的確如此。欣賞答案。 :) – nazbot 2011-03-04 22:25:10

0
  1. Class實際上是一個名爲uhmm.class的類。

    類的實例類表示正在運行的Java應用程序中的類和接口。

  2. new Class[]的作品。它初始化一個Class引用的數組。但是,像往常一樣使用對象數組,引用是空的。

  3. Class沒有公共構造函數。所以你不能說new Class()

0

Class是一個Java類代表...一個類和相關的元數據。所以Class[]是一個Class對象的數組。

在Java中每個類都有一個靜態成員變量命名爲Class類型,在這裏你正在做的是

  1. 創建類[]包含兩個 成員,每個成員是 類型的對象類和具體表示java.lang.String中
  2. 經由反射仰視 參考構造在 類TwoString採用兩個 java.lang.String中對象=> TwoString類 (字符串,字符串)
  3. 創建一個對象數組喂到 與值構造「一」 和「b」
  4. 最後你通過調用 構造你擡頭創造TwoString TS的實例 (b)和你(c)中初始化 ARGS

這相當於:

TwoString ts = new TwoString("a","b"); 

,但你已經發布的方式是,使用R eflection /反思。

1

A Class是描述java類(或接口)的Object。 A Class[]是這些對象的數組。

語法<ClassName>.class(例如String.class)爲特定java類(或接口)返回Class

可以通過幾種語法創建一個新數組。 new Class[i]創建一個Class的新數組,長度爲i,並填入默認值(空引用)。 new Class[]{a, b, c}創建了包含給定元素a,bc的新陣列Class。它的長度是3,因爲有3個元素。

+0

很徹底。謝謝。 :) – nazbot 2011-03-04 22:17:24

0

我不確定這是不是您正在尋找的內容,但示例中的Class[]模仿該TwoString類中的構造函數。對我來說,如果他們會使用兩種不同的類型,那就更清楚了。因此,如果TwoString類看起來像這樣:

public class TwoString { 

    private String m_s1; 
    private Integer m_s2; 
    public TwoString(String s1, Integer s2) { 
     m_s1 = s1; 
     m_s2 = s2; 
    } 


} 

該類名不會再成爲現在,但我認爲這很容易解決。代碼示例的其餘部分將變爲:

Class[] types = new Class[] { String.class, Integer.class }; 
Constructor cons = TwoString.class.getConstructor(types); 
Object[] args = new Object[] { "a", 1 }; 
TwoString ts = (TwoString)cons.newInstance(args); 

因此,類數組將設置要使用的構造函數。逐行的步驟如下:

  1. 類的數組設置了要使用的構造函數。
  2. 然後你找到構造函數。
  3. 你設置了什麼值傳遞給構造函數。
  4. 然後你調用構造函數來創建實例。