1

我正在学习做一些 Java 101 语法的东西。在我尝试做的练习中,我无法打印增量值。有任何想法吗?

这是我的代码:

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.i是一个int,所以是t.increment。我猜是因为increment()void

4

6 回答 6

4

increment()没有返回值。你需要让它返回一个int你的代码才能工作:

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

" void" 是为不返回任何值的方法保留的关键字。否则,您指定返回什么类或原语(int, double, String, 不管)。您可以在此处阅读有关返回值的更多信息。

此外,为了将来参考,类名应该大写,所以你应该使用“Incrementable”而不是“incrementable”。(在我的示例代码中,我保持它与您的相同,因此您现在可以将代码放入其中。)

于 2009-04-21T19:26:19.187 回答
4

您的方法签名是:

static void

这意味着此方法不会返回任何内容。

因此,尝试分配给increment()df.i行不通的。

于 2009-04-21T19:29:35.547 回答
2

我得到的错误是:

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

df.i 是一个 int 和 t.increment [故障?]。我猜这是因为 increment() 是无效的?

Eeeexactly,你的猜测是正确的。

这是逐行解释的错误消息:

aTyp0eName.java:18: incompatible types

您正在尝试将“void”分配给第 18 行的 int。

df.i = t.increment();  

这是错误所在。

found: 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);
    } 

}

还可以进行一些其他增强,例如向方法和属性添加访问修饰符,但现在我认为这会有所帮助。

于 2009-04-21T20:17:37.410 回答
2

答案是 increment() 方法返回一个 void。话虽如此,程序员通常使用的Java标准语法有很多违反,即:

  1. 类名应以大写字母开头。
  2. 字段不应该从不同的类中改变,而是一个辅助方法应该在同一个类中
  3. 如果要调用静态方法,请不要引用实例变量,而是使用 ClassName.reference
  4. 如果仅在本地需要变量,则它不应该是字段(df.i 可能只是在 main 方法中声明的 int i)。

编辑:同一类中的辅助方法示例:

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; }
} 
于 2009-04-21T19:41:17.327 回答
0

另外,你的incrementable课真的应该是Incrementable.

于 2009-04-21T19:36:04.470 回答
0

此外,如果您实例化可增量,则不应将方法 increment() 定义为静态。或者你可以,但不需要。

如果它是静态的,你可以简单地 incrementable.increment() 。

只是一个提示。至于你的问题的答案,toolkit 已经说过了。

于 2009-04-21T19:33:11.807 回答