Для скобок

public class MultithreadingFour {
        public static void main(String args[]){
                A obj = new A();
                Task task= new Task();
                for(int i=0; i<10; i++)
                        Thread t= obj.newThread(task);
        }
}

Ошибка компиляции: несколько маркеров в этой строке

Syntax error, insert ";" to complete Statement
  t cannot be resolved to a variable
Syntax error, insert "AssignmentOperator Expression" to complete Assignment
Syntax error, insert ":: IdentifierOrNew" to complete ReferenceExpression
  Thread cannot be resolved to a variable

тогда

public class MultithreadingFour {
        public static void main(String args[]){
                A obj = new A();
                Task task= new Task();
                for(int i=0; i<10; i++){
                        Thread t= obj.newThread(task);
                }
        }
}

успешно компилируется (обратите внимание на добавленные фигурные скобки в цикле for).

Ответ 1

В Java объявление переменной Thread t = ... технически не является выражением, тогда как блок { ... }. Следующее for ( ... ) должно быть выражением.

Ответ 2

Тело оператора "for" должно быть "выражением".

Локальное объявление переменных не является инструкцией. Таким образом, вы не можете поместить объявление локальной переменной в качестве "оператора" для инструкции "for".

Вот разрешенный синтаксис циклов for:

BasicForStatement:     for (ForInitopt; Expressionopt; ForUpdateopt) Statement

ForStatementNoShortIf:     for (ForInitopt; Expressionopt; ForUpdateopt) StatementNoShortIf

Вы можете прочитать JLS 14. Блоки и заявления для получения дополнительной информации.

Подумайте об этом, было бы нелогично разрешить объявление переменной в однострочном цикле, поскольку вы никогда не сможете получить к ней доступ, поскольку он доступен только в области цикла.