2015-08-20 3 views
1

Java: Почему метод называется void (т.е. он не возвращает ничего.), Если он возвращает это:Java Недействительные Методы Возвращаемое

System.out.println("Something"); 

Например:

public static void sayHello() { 
     System.out.println("Hello"); 
} 

Это делает вернуть что-то, это сообщение!

+2

Я бы сказал, что он печатает сообщение на стандартный вывод, но он ничего не возвращает вызывающему оператору. –

+0

https://docs.oracle.com/javase/tutorial/java/javaOO/methods.html может стоить прочитать (также обратите внимание, что для возврата чего-то вы должны использовать ['return'] (https: // docs .oracle.com/javase/specs/jls/se8/html/jls-14.html # jls-14.17)) –

+0

@slartidan Выполнено. Смотри ниже. Благодарю. –

ответ

1

Рассмотрите эти две процедуры.

public void sayHello() { System.out.println("Hello"); } 

public int giveANumber() { System.out.println("Hi"); return 42; } 

Как вы могли бы назвать их?

sayHello(); 
int i = giveANumber(); 

С SayHello недействительна, нет знака равенства и ничего на левой стороне, когда вы называете его. Однако, поскольку giveANumber возвращает int, вы должны вызвать его с помощью знака равенства и целого числа, чтобы получить значение в левой части.

+0

Этот ответ неверен и/или вводит в заблуждение в той мере, в какой он предполагает, что вы должны «вызвать» метод, который возвращает значение с знаком равенства и переменной для получения значения в левой части. Это правда, что во многих практических случаях это то, что вы будете делать, но нет необходимости фиксировать возвращаемое значение. «sayHello» не возвращает значение, поэтому неправильно (ошибка компилятора) сделать его правой частью задания. «giveANumber» возвращает значение, которое вы можете * при желании * назначить, если оно вам полезно. Есть еще несколько ответов на этот вопрос, которые лучше. – Brick

+0

@Brick, ответ не ошибается и не вводит в заблуждение. Вы говорите «необязательно» в своем комментарии; Я говорю «должен» в своем ответе. – rajah9

+0

В вашем ответе говорится, что разница имеет отношение к способу вызова метода, а это ложь. Разница присуща самой декларации метода. Я думаю, что читатель, запутавшийся в этом вопросе, может заключить, например, что 'giveANumber()' - это метод void, если вы вызываете его, не назначая возврат к переменной. Но это неправильно. Метод 'giveANumber' не является методом void, как бы вы его ни называли. В вашем примере, если все, что вы хотите, напечатано «Привет», в этом случае вы полностью добры * не * взяли 42, которые были возвращены. Фактически, в этом случае вы не должны * назначать его. – Brick

1

Этот метод делает что-то (печатает "Hello"), но это не возвращение ничего. Если он возвращается значение, вы были бы в состоянии сделать это:

aVariableToAssignReturnValue = sayHello(); //you can't do it! 

Читайте this, например.

2

Я бы сказал, что он печатает сообщение на стандартный вывод, но он ничего не возвращает вызывающему оператору.

0

Он ничего не возвращает , который может храниться в переменной.

так что это просто ничего не возвращает.

, но он может делать такие вещи, как печать на консоли.

1

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

В этом VOID был тип с одним значением SKIP. Метод PROC() VOID, метод, может быть принудительно применен к VOID, выполняя вызов.

+0

# Рассмотрите следующие массивы UNION - элементы являются либо ПУСТОЙ, либо INT ... или "undefined" # '[] UNION (VOID, INT) eis = (EMPTY, 666, SKIP); FOR i TO UPB eis DO printf (($ "eis [" d "] =" g ";" $, i, CASE eis [i] IN (VOID): "e", (INT): "i" OUT "~" ESAC )) OD' # Выход "был": eis [1] = e; EIS [2] = I; EIS [3] = I; # – NevilleDNZ

+0

@NevilleDNZ snif, спасибо. Для других: Algol68 использовал обратные ключевые слова в качестве конечных токенов: DO OD, IF FI, CASE ESAC и 'CASE i IN ...: ..., .... OUT ... ESAC' был оператором switch. –

+0

Re: do ~ od и case ~ esac blocks .... Я подозреваю, что именно Дийкстра придумал термин & концепция «охраняемые команды» ... Ср. https://www.cs.utexas.edu/users/EWD/transcriptions/EWD04xx/EWD418.html – NevilleDNZ

0

«Возврат» в этом случае означает, что значение передается обратно через стек, который может быть назначен переменной в вызывающем коде. Это не так в вашем примере.

Object o = sayHello(); // WRONG - Compile error 

Метод пустоты может делать вещи - в вашем случае печатать на экране. Это не «возвращение» в описанных здесь.

Поскольку вопрос отображается в верхней части страницы как «Java Void Methods Return» с капиталом «V» на «Void», также может быть необходимо отметить, что Java имеет класс «Пустота» в дополнение к ключевому слову «пустота.» Метод, объявленный для возврата Void, возвращает что-то, но если это ваш случай, вы должны проверить документацию для этого класса, потому что это своего рода частный случай.

0

Это просто и понятно, потому что вы просите его выполнить что-то, что не возвращает ничего. ваш метод возвращает пустоту, которая ничего не значит.Будучи программистом c, In C метод, который ничего не возвращает, называется процедурой. для дополнительной проверки What is the difference between a "function" and a "procedure"?.

0

sayHello() не имеет декларации возврата; поэтому, это метод void. По вашему предположению, единственный действительно метод void будет выглядеть так: public static void wowSuchVoid(){ }. В чем смысл?

Смежные вопросы