Почему использование ключевого слова void перед синхронизацией вызывает ошибку в Java, но обратное работает нормально?

import java.util.*;

public class Deadlock extends Thread{

    private String name;    

    public static void main(String[] args) {        

    }

    public class MyObject{
        public void synchronized foo(String name) { //throws error saying 'Syntax error on token "void", volatile expected' 

        }       
    }   
}

Но если public void synchronized изменить на public synchronized void, все хорошо.

Почему это?

Поскольку возвращаемый тип должен стоять непосредственно перед именем метода — это часть подписи метода. Все модификаторы должны предшествовать подписи и могут появляться в любом порядке. Попробуйте поменять местами public и synchronized — это то же самое.

MC Emperor 31.05.2019 23:41

Все модификаторы перечислены перед типом возвращаемого значения и именем метода, просто правило языка.

takendarkk 31.05.2019 23:41
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
95
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Посмотрите на спецификацию Java 8.4.3. Модификаторы метода, в которой говорится:

MethodModifier:
    (one of) 
    Annotation public protected private 
    abstract static final synchronized native strictfp

Они должны предшествовать возвращаемому типу, который идет последним. Порядок модификаторов на самом деле не имеет значения, поскольку они учитывают, что возвращаемый тип является последним. Вот почему public synchronized void действителен.

Понятно. Итак, спецификация.

sofs1 31.05.2019 23:46

Что ты возвращаешься? Вы возвращаете синхронизированный или вы возвращаете пустоту? Поскольку вы не можете вернуть синхронизацию, она должна быть недействительной. Видите ли, тип возвращаемого значения всегда должен стоять непосредственно перед именем функции.

Другие вопросы по теме