Java: невозможно получить увеличенное значение для печати. - PullRequest
1 голос
/ 21 апреля 2009

Я учусь делать синтаксис 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?

Ответы [ 6 ]

4 голосов
/ 21 апреля 2009

подпись вашего метода:

static void

Что означает, что из этого метода ничего не возвращается.

Следовательно, попытка присвоить increment() df.i не будет работать.

4 голосов
/ 21 апреля 2009

increment() не имеет возвращаемого значения. Вам нужно, чтобы он возвращал int, чтобы ваш код работал:

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

"void" - это ключевое слово, зарезервированное для методов, которые не возвращают никакого значения. В противном случае вы указываете, какой класс или примитив вы возвращаете (int, double, String, что угодно). Подробнее о возвращаемых значениях можно прочитать здесь .

Кроме того, для дальнейшего использования имена классов должны быть написаны заглавными буквами, поэтому вы должны использовать «Incrementable», а не «incrementable». (В моем примере кода я сохранил то же самое, что и у вас, чтобы вы могли просто добавить код на данный момент.)

2 голосов
/ 22 апреля 2009

Я получаю ошибку:

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

df.i является int и t.increment [вина?]. Я предполагаю, что это потому, что increment () void?

Точно, ваше предположение верно.

Это сообщение об ошибке объясняется построчно:

aTyp0eName.java:18: incompatible types

Вы пытаетесь присвоить "void" 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);
    } 

}

Могут быть сделаны некоторые другие улучшения, такие как добавление модификаторов доступа к методам и атрибутам, но сейчас я думаю, что это поможет.

2 голосов
/ 21 апреля 2009

Ответ в том, что метод increment () возвращает void. При этом существует много нарушений стандартного синтаксиса Java, который обычно используют программисты, а именно:

  1. Имена классов должны начинаться с заглавной буквы.
  2. поля не должны быть видоизменены из разных классов, скорее вспомогательный метод должен находиться в одном классе
  3. Если вы хотите вызвать статический метод, не ссылайтесь на переменную экземпляра, а используйте ClassName.reference
  4. Если переменная требуется только локально, она не должна быть полем (df.i может быть просто int i, объявленным в методе main).

EDIT: Пример вспомогательного метода в том же классе:

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; }
} 
0 голосов
/ 21 апреля 2009

Кроме того, ваш incrementable класс должен быть действительно Incrementable.

0 голосов
/ 21 апреля 2009

также, если вы создаете экземпляр incrementable, вы не должны определять метод increment () как статический. или можете, но не нужно.

вы могли бы просто увеличить файл .increment (), если он статический.

просто совет. Что касается ответа на ваш вопрос, инструментарий уже сказал, что правильно.

...