2009-04-21 76 views
1

我正在學習做一些Java 101語法的東西。在我試圖做的練習中,我無法獲得增加的值來打印。有任何想法嗎?Java:無法獲得增加的打印值。

這裏是我的代碼:

class StaticTest { 
    static int i = 47; 
} 
class incrementable { 
    static void increment() { StaticTest.i++; } 
} 

class DataOnly { 

    int i; 
    double d; 
    boolean b; 

    public static void main (String[] args) { 
     incrementable t = new incrementable(); 
     DataOnly df = new DataOnly(); 
     df.i = t.increment(); 
     System.out.println(df.i); 
    } 

} 

我得到的錯誤是:

aTyp0eName.java:18: incompatible types 
found: void 
required: int 
df.i = t.increment(); 

df.iint,所以是t.increment。我猜這是因爲increment()void

+1

爲了適應其他類,增量應該重命名incrementAndGet(因爲它似乎試圖在增量之前返回值)。如果它使用前增量(這更自然),則該名稱應該是getAndIncrement。副作用是討厭的。 – 2009-04-21 19:51:36

回答

4

increment()沒有返回值。你需要把它恢復爲你的代碼工作的int

class incrementable { 
    static int increment() { 
     StaticTest.i++; 
     return StaticTest.i; 
    } 
} 

void」是不返回任何值的方法保留關鍵字。否則,你指定你返回什麼類或原語(int,doubleString,無論)。你可以閱讀更多關於返回值here。另外,爲了將來的參考,類名應該大寫,所以你應該使用「Incrementable」而不是「incrementable」。 (在我的示例代碼我一直是和你一樣有,所以你可能只是下降的代碼在現在)

+0

如果你返回i ++,你會在增值之前得到它的值。可能不是他想要的。 – 2009-04-21 19:31:09

+0

啊,是的。固定。 – 2009-04-21 19:31:49

+0

爲什麼doensn't我++會返回更新值? – phill 2009-04-21 22:16:25

4

你的方法簽名是:

static void 

這意味着沒有從該方法返回。

因此,試圖將increment()分配給df.i將不起作用。

0

此外,如果您實例化可增量,則不應將方法increment()定義爲靜態。或者你可以,但不需要。

如果它是靜態的,你可以簡單地增加increment.increment()。

只是一個提示。至於你的問題的答案,工具包已經說過了。

0

此外,您的incrementable類應該真的是Incrementable

2

答案是increment()方法返回一個void。這就是說,程序員通常使用的Java標準語法有很多違規行爲,即:

  1. 類名應該以大寫字母開頭。
  2. 領域不應該從不同類別的突變,而是一個輔助方法應該是同一類的
  3. 如果你想調用一個靜態方法,無需引用實例變量,而使用ClassName.reference
  4. 如果一個變量只在本地需要,它不應該是一個字段(df.i可能只是一個我在主方法中聲明的int)。

編輯: 同一類內的輔助方法的一個例子:

class StaticTest { 
    private static int i = 47; //keep i private and mutate and access via methods 
    public static void increment() { i++; } 
    public static int getI() { return i; } 
} 
2

我得到的錯誤是:

aTyp0eName.java:18: incompatible types 
found: void 
required: int 
df.i = t.increment(); 

DF .i是一個int,t.incr也是ement [故障?]。我猜這是因爲增量()是無效的?

Eeeexactly,你的猜測是正確的。

這是錯誤消息一行一行解釋:

aTyp0eName.java:18: incompatible types 

您試圖分配「空缺」爲int的線18

df.i = t.increment(); 

這裏就是錯誤的。

found: void 

您聲明方法「簽名」中的返回類型是什麼。 方法簽名爲:

 
<access modifiers> <return type> <method name> (<parameters>) 
static     void  increment  () 

所以返回類型爲void。

下一行:

required: int 

df.i爲int,如同你先前說。

所以,幾乎你已經有了自己的問題。

有一個編譯器的好處是,它告訴你什麼時候出了什麼問題。

不好的事情(對於人類)你必須學會​​閱讀這些消息。它們從編程語言到另一個編譯器,甚至從編譯器到編譯器都不相同

這將是一個修正版本:

class StaticTest { 
    static int i = 47; 
} 
class Incrementable { 
    static int increment() { 
     return ++StaticTest.i; 
    } 

} 

class DataOnly { 

    int i; 
    double d; 
    boolean b; 

    public static void main (String[] args) { 
     Incrementable t = new Incrementable(); 
     DataOnly df = new DataOnly(); 
     df.i = t.increment(); 
     System.out.println(df.i); 
    } 

} 

還有一些其他的改進可以做,比如增加訪問修飾符的方法和屬性,但現在我認爲這會有所幫助。