Hein?
Qual é a diferença entre Função e Método?
72 Respostas
Uma vez acreditei que os métodos são as funções de um objeto ou classe.
Se vc estiver programando em Java é método se tiver em VB,ASP etç, é função mas basicamente é a mesma coisa.
Ex: Java
public boolean validaCpf(String cpf){
}
Ex: VB
Function validaCpf(cpf as String)
End Function
Me corrijam se eu estiver errado.
Não tem haver com tipo: um retorna algo, outro não retorna nada? Sei lá…
Uma função deve retornar algo.
Um método pode ou não retornar alguma coisa.
Andre nao tem nada haver, o q o Pedrosa falou esta CORRETO so um coisa
no exemplo q ele deu de java q esta faltando…
Ex: Java
public boolean validaCpf(String cpf){
//Faltou
return cpf //// true ou false
///
}
Uma função deve retornar algo.
Um método pode ou não retornar alguma coisa.
Uma função em C pode ser do tipo void, isto é, não retornar nada, com oum método void em java. Claro, temos o caso das functions e procedures em Pascal e coisas assim…
Entretanto vc não precisa atribuir o valor retornado para algum objeto ou variavel. Prova disso é que a função printf em C retorna um inteiro que ninguem usa, praticamente. 
Acredito que Função é um Metodo… Pelo menos ninguem postou algo realmente que quebrace esse conceito…
:!:
Oi, pessoal,
Eu estou muito no início do estudo de Java, preciso é de aprender, e graças a ajuda que recebo aqui de vocês eu estou melhorando meus conhecimentos, não me sinto em condição de ensinar nada, mas eu acho que faltou dizer aí acima uma coisa importante, é que em Java não existem funções, esse termo acho que pode ser esquecido por quem deseja aprender java.
Mas já foi dito aí acima que o que é função em outras linguagens , em Java é método, não importa se retorna ou não retorna, isso em java, mas aí se é pra comparar com outras linguagens, se não retorna não é função, é procedure.
Dá uma confusão danada na cabeça da gente. Por exemplo no Visual Basic, métodos são rotinas embutidas nos componentes, ou respostas a eventos. Se você cria um procedimento em VB é uma sub procedure, em Java é método(), não precisa retornar nada. Mas no VB se retorna é função (claro, chama de Function Procedures) mas é função, se não retorna não é função, é procedure comum. Mas, em Java, retornando ou não, é método().
Essas diferenças é que me dificultam entender java. Por isso, o que eu preciso mesmo é de ajuda, mas falei só porque lembrei dessas diferenças. Em Java, a única coisa que eu consegui aprender é que existem classes, essas classes tem objetos e métodos próprios, e esses objetos e métodos podem se usados por outras classes. Como? Ainda estou aprendendo.
Abraço a todos.
Luca
se nao me engano em linguagens como pascal, existe funcao e procedimento, uma retorna algo e a outra nao retorna, ou seja, é void.
Em java tudo é metodo.
Entao metodo é funcao e procedimento.
Cara li muito a respeito disso uma vez
E pelo que entendi Função é a mesma bosta que método… só que o tal
“método”, é uma maneira mais bonitinha de se chamar, e mais nada!..
PS: Se função pode ou não retornar , e metódo não… é inviável… essa afirmação!.. acredito eu…
Trabalhei muito tempo com o PHP e lá é function pra cá function pra lá…
e o mesmo pode ou não retornar algo…
Olá,
Discussão interessante!
:arrow: http://www.tech-faq.com/lang/pt/java-method.shtml
Sem mais!
Abraço,

São só nomes.
Em Java temos funções associadas a objetos chamadas de métodos.
Em C++ temos funções-membro (apesar de agora se falar muitoem método também).
Em linguagens procedurais, onde uma função é o tijolo fundamental e não objetos, temos geralmente funções e procedimentos, uns com retorno outros não.
~Cada linguagem chama suas funções de uma coisa, umas têm algum nível de classificação mais específico.
Perguntei pq sou novo aqui na minha empresa. Tem uns vb-man aqui q falaram entre si: “ora…(não entendi)… posso usar método e função aqui tbém…”, eu só escutandinho, achei melhor perguntar no forum pra não me queimar…
se você estiver programando em pascal tem sim,
em pascal procedure não tem retorno, function tem …
mas em java é tudo method, que pode retornar “void” ou qualquer outra coisa 
Uma função deve retornar algo.
Um método pode ou não retornar alguma coisa.Uma função em C pode ser do tipo void, isto é, não retornar nada, com oum método void em java. Claro, temos o caso das functions e procedures em Pascal e coisas assim…
Entretanto vc não precisa atribuir o valor retornado para algum objeto ou variavel. Prova disso é que a função printf em C retorna um inteiro que ninguem usa, praticamente. ;-)
Verdade, respondi pensando em uma determinada linguagem e esqueci das outras.
Acho que o pcalcado conseguiu sintetizar a discussão em uma só frase.
Olá,Discussão interessante!
:arrow: http://www.tech-faq.com/lang/pt/java-method.shtml
Sem mais!
Abraço,
![]()
fala sério …
usaram o tradutor do google pra traduzir esta página
olhem a desgraça que tem la …
vácuo público da estática principal (args da corda []) {
// este programa de Java imprime “Hello o mundo!”
System.out.println {“Hello mundo! ”);
}
“vácuo público da estática principal” ficou meio forçado 
agora, “args da corda []” matou a pau 
eu levei acho que pelo menos 20 segundos pra acreditar nisto 
As literaturas costumam tratar em Java tudo como método.
Em VB, muitas literaturas dizem o que a galera já disse aqui: função não pratica nenhuma ação e retorna algo. um método (uma Sub) pode ou não praticar uma ação e não retorna nada.
Há muito tempo atrás, naum lembro em que VB, eu dei uma de joão-sem-braço e tentei fazer uma function alterar alguma coisa (naum lembro se um arquivo, um objeto, ou sei lá o que), e ele dava pau na linha que praticava a ação.
Agora, em java, eu acho que é mais uma questão de gosto mesmo, chamar função ou método. Tem quem chame tudo de função, tem quem chame tudo de método e tem também quem aplica a diferença do VB no Java pra se referir aos métodos (ou funções? :lol:). Já vi usarem também “operação”, mas esta carregava uma certa semântica: Se referia a métodos/funções definidas por interfaces definidas por um componente para se ligar a outros componentes através de interfaces por estes disponibilizadas… :!: :!: :!: :!: :!: :!: :!: :!: :!: :!: :!: :!:
PS.: C… de rir com a tradução mencionada pelo Urubatan… muito comédia…
Pessoal, pessoal!
Como o pcalcado disse, são apenas palavras. Tanto métodos como funções, procedures ou o que quiserem chamar são módulos de código que se sabe que pode se chamar mais de uma vez. Ou não. Nesse caso, servem apenas para dividir um programa em segmentos menores e mais fáceis de se dar manutenção mais tarde.
Puxando pela primeira explicação que dei, podemos usar 2 nomes que são comuns a todos esses (uma espécie de “superclasse”): rotinas e/ou sub-rotinas.
Pegando uma possível definição de rotina: tarefa que é feita mais de uma vez.
C.Q.D.
Acho que essa frase é do Nelson Piquet 
[]s
Não, não esb, ela é do Senna mesmo.
A não ser que ele tenha copiado do Piquet…hehehe
[]'s!
Dê uma olhada:
Guia dos Curiosos
De qualquer forma, acompanhei a carreira do Senna, li as biografias dele e não me lembro em momento algum dele ter citado tal frase, que por sinal é um tanto quanto estúpida. Já o Piquet sim proferiu tal frase contra corredores da F1, dias antes do seu filho Nelsinho chegar em segundo em uma corrida de estréia em uma categoria de base. Lamentável…
Xiii…então não sei…hehehe.
De qualquer forma vou manter a assinatura, era e ainda sou fã incondicional do Senna.
Valeu!! Até mais!
A diferenças entre Funções e Métodos:
Segundo os conceitos de orientação a objeto, metódo é toda
operação que manipula algum objeto, sendo assim, procedimento
ou função são metódos.
Se for observado os conceitos sobre programação estruturada,
vemos que funcão é toda rotina que retorna algum valor,
e procedimentos não retornam valor algum.
Observação sobre algumas respostas:
Pedrosa:
A afirmação quanto ao Java considero correta, pois tanto procedimentos
quanto funções podem ser consideradas metódos.
Discordo sobre a afirmação em VB, ASP etc, por que VB não é totalmente
Orientada a Objetos, então podemos afirmar que ela se comporta
como estruturada já que ela não implementa Herança e Polimorfismo por exemplo,
nesse caso temos os conceitos de função e procedimentos da programação estruturada.
No caso do ASP, só posso comentar a respeito do ASP.NET, que suporta
as liguagens POO, que tem o mesmo conceito que o Java sobre metódos.
peczenyj:
No caso do C que é uma linguagem estruturada, as funções void se
comportam como procedimentos do Pascal que também é estruturado.
Não é obrigatório o retorno de um valor útil como resultado, pode ser implementada uma função que retorne 0 ou nenhum valor.
Em resumo:
Quando estamos falando de Programação Orientada a Objeto, entenda metódos tanto como Função quanto Procedimento.
Quando estivermos falando de Programação Estruturada, entenda procedimentos como rotina que não retornam valor, e funções como rotinas que retornam valor
Cara isso tem no pascal
as funções Retornam algum valor as procedures não
No java nos temos metodos que Retornam ou não.
Acho que era isso.
abraço
Espero que nao tenha chegado tarde de mais, mas para finalizar a discussão…
Qual a diferença entre método e função? E entre uma estrutura e uma classe?
Um método é idêntico a uma função, com a exceção que está implicitamente associado a uma classe. Destina-se pois à manipulação da informação do objecto pertencente a essa classe.
Uma classe é idêntica a uma estrutura, com a exceção que para além de conter dados contém
também código (os métodos) para manipular esses dados.
Resumindo, método so se estiver definido dentro de uma função.

De acordo com o SICP, uma função retorna sempre o mesmo valor se você passar pra ela sempre o mesmo parâmetro.
Por exemplo:
(define (add5 x)
(+ x 5))
Enquanto que uma procedure seria algo como (random 10), que nem sempre vai retornar o mesmo resultado.
Um ano e dois meses atrasado 
Essa é a definição matemática de funções. Aliás, esse é o mesmo princípio utilizado pelas linguagens funcionais, e o motivo da extrema escalabilidade delas.
Espero que nao tenha chegado tarde de mais, mas para finalizar a discussão…Resumindo, método so se estiver definido dentro de uma função.
Ratificando… 
Resumindo, método so se estiver definido dentro de uma CLASSE.
O que isso tem a ver com escalabilidade? Me dá uma luz ae! 
O que isso tem a ver com escalabilidade? Me dá uma luz ae! :P
Basicamente, se duas funções dessas não dependerem uma da outra, o código pode ser rodado em qualquer thread, processo, CPU ou outra máquina do sistema simultaneamente com outras, e seu funcionamento é garantido.
Mais ou menos. De qualquer forma isso não se aplica em Java.
Nas linguagens que não são orientadas a objetos existem funcões (retornam um valor) e procedures (Executam e não retornam nada)
Nas linguagens orientadas a objetos criaram os tais métodos que são um misto entre funcões e procedures, podendo retornar ou não um valor.
Nas linguagens que não são orientadas a objetos existem funcões (retornam um valor) e procedures (Executam e não retornam nada)Nas linguagens orientadas a objetos criaram os tais métodos que são um misto entre funcões e procedures, podendo retornar ou não um valor.
isso nao tem necessariamente a ver com linguagens OO ou nao-OO. A versao curta eh que algumas linguagens fazem distincao entre funcoes, metodos e procedimentos por diversos motivos (paradigma funcional ou convencao, geralmente). Em java isso nao importa.
Nas linguagens que não são orientadas a objetos existem funcões (retornam um valor) e procedures (Executam e não retornam nada)Nas linguagens orientadas a objetos criaram os tais métodos que são um misto entre funcões e procedures, podendo retornar ou não um valor.
isso nao tem necessariamente a ver com linguagens OO ou nao-OO. A versao curta eh que algumas linguagens fazem distincao entre funcoes, metodos e procedimentos por diversos motivos (paradigma funcional ou convencao, geralmente). Em java isso nao importa.
Shoes, como é o esquema de subrotinas em Ruby? Entra até closure no conto?
Edit: Ah, esqueci que era Java Básico… apesar de não ter muito mais a ver especificamente.
Blocos são objetos que capturam o escopo de onde foram declarados. Ruby não é muito diferente de ajava quanto ao uso dos termos ‘função’ e ‘método’.
Uma classe é definida pelos seus membros. Os membros de uma classe podem ser de diferentes categorias: atributos , métodos e construtores.
Atributos são variáveis declaradas no escopo da classe ou do objeto da classe.
Métodos são conjuntos de instruções executáveis a pedido do programador após o objeto ser criado.
Construtores são conjuntos de instruções executados pela JVM antes do objeto ser criado. Construtores não são métodos.
Métodos não existe sem um classe. Nenhuma instrução , em Java, existe fora de uma classe, portanto, todas elas compõem métodos.
Função é um conceito matemático que mapeia elementos de um conjunto (dominio) para elementos de outro conjunto (contra-dominio). Em linguagens não orientadas a objetos ou que não obrigam que instruções sejam incluidas em classes, Função - por semelhança com a matemática - é um conjunto de instruções que é obrigado a retornar um valor. Para destinguir este tipo de conjunto de instruções de outros que não são obrigados a retornar coisa alguma, estes últimos chamaram-se rotinas ou procedimentos ( por extensão do lingo das linguagens de banco de dados)
Os termos “função” e “procedimento” implicam que ha uma distinção intrínseca ao suporte a cada um por parte da linguagem. método significa que é um membro de uma classe.
Método pode ser chamado de função ou procedimento embora isso não seja correto já que o método SEMPRE retorna algo, mesmo que esse algo seja “nada”. Portanto, eles teriam que ser considerados sempre funções, pelo que a dicotomia função-procedimento perderia o sentido. Dito de outra forma, Função e Procedimento são especialidades de Rotina, mas Método não é uma Rotina, logo não pode ser uma função ou procedimento.
Em OO é incorreto chamar os métodos de função ou procedimento ( ou rotina, já agora).
Os termos “função” e “procedimento” implicam que ha uma distinção intrínseca ao suporte a cada um por parte da linguagem. método significa que é um membro de uma classe.
Método pode ser chamado de função ou procedimento embora isso não seja correto já que o método SEMPRE retorna algo, mesmo que esse algo seja “nada”. Portanto, eles teriam que ser considerados sempre funções, pelo que a dicotomia função-procedimento perderia o sentido. Dito de outra forma, Função e Procedimento são especialidades de Rotina, mas Método não é uma Rotina, logo não pode ser uma função ou procedimento.
Companheiro, considerando que “nada” em Java é null, métodos nem sempre retornam um valor, é só marcar ele como void. É só tentar fazer isso aí embaixo pra perceber como em Java os métodos nem sempre retornam valores:
Object o = metodoQueRetornaVoid();
Em algumas outras linguagens, como em Ruby, os métodos sempre retornam um valor, que em Ruby seria o NilObject se você não tiver retornado nada no seu método e a última linha avaliar pra “nil”.
No fundo eles são executados logo depois do objeto ser criado, correto? Tanto que da pra fazer aquela bagunca de guardar uma referencia pro objeto mesmo o construtor lancando exception.
Construtores são conjuntos de instruções executados pela JVM antes do objeto ser criado. Construtores não são métodos.
No fundo eles são executados logo depois do objeto ser criado, correto? Tanto que da pra fazer aquela bagunca de guardar uma referencia pro objeto mesmo o construtor lancando exception.
No fundo mesmo, é só um método especial, que é chamado após a construção do objeto e após a execução dos seus blocos de inicialização. O construtor nunca é executado antes do objeto ser criado.
Os termos “função” e “procedimento” implicam que ha uma distinção intrínseca ao suporte a cada um por parte da linguagem. método significa que é um membro de uma classe.
Método pode ser chamado de função ou procedimento embora isso não seja correto já que o método SEMPRE retorna algo, mesmo que esse algo seja “nada”. Portanto, eles teriam que ser considerados sempre funções, pelo que a dicotomia função-procedimento perderia o sentido. Dito de outra forma, Função e Procedimento são especialidades de Rotina, mas Método não é uma Rotina, logo não pode ser uma função ou procedimento.Companheiro, considerando que “nada” em Java é null, métodos nem sempre retornam um valor, é só marcar ele como void.
Considerando que “nada” em Java é void, métodos sempre retornam um valor. Mesmo quando retornam void.
O método retorna void , mas void não é um tipo em Java, logo nenhuma variável o pode “conter”.
Logo o codigo acima não faz sentido.
Não faz sentido não porque o método não retorne , mas porque a variável não consegue capturar o que ele retorna.
Para um exemplo do que seria não retornar veja os construtores. Eles nunca retornam valor algum. Nem sequer void.
Construtores são conjuntos de instruções executados pela JVM antes do objeto ser criado. Construtores não são métodos.
No fundo eles são executados logo depois do objeto ser criado, correto? Tanto que da pra fazer aquela bagunca de guardar uma referencia pro objeto mesmo o construtor lancando exception.
Se Objeto fosse a mesma coisa que Referencia vc teria razão. Mas como Objeto não é a referencia que o aponta então não.
Embora no construtor vc tenha acesso a this ( a referencia para o próprio objeto) isso não significa que o objeto já existe.
Repare que se o objeto pode existir sem o construtor o construtor não serve para nada. Bastaria ter um método do tipo “onJVMLoad()” que poderiamos sobreescrever e pronto. Ha!, mas ai eu poderia chamar esse método mesmo quando não estou dentro do processo de construção … danou…
O Objeto só é “oficialmente” construído quando o construtor é executado sem erros.
Experimente acessar um objeto cujo construtor lança uma RuntimeException.
Simplesmente não é possível.
em java é a mesma coisa.
O método retorna void , mas void não é um tipo em Java, logo nenhuma variável o pode “conter”.
Logo o codigo acima não faz sentido.
Não faz sentido não porque o método não retorne , mas porque a variável não consegue capturar o que ele retorna.
Mais uma vez, em Java não é assim:
E desde o Java 5 qualquer coisa pode ser colocada em um Object (até os primitivos são promovidos a Object via boxing), então, se “void” fosse um valor, ele caberia em Object.
Se Objeto fosse a mesma coisa que Referencia vc teria razão. Mas como Objeto não é a referencia que o aponta então não.
Embora no construtor vc tenha acesso a this ( a referencia para o próprio objeto) isso não significa que o objeto já existe.
Repare que se o objeto pode existir sem o construtor o construtor não serve para nada. Bastaria ter um método do tipo “onJVMLoad()” que poderiamos sobreescrever e pronto. Ha!, mas ai eu poderia chamar esse método mesmo quando não estou dentro do processo de construção … danou…
O Objeto só é “oficialmente” construído quando o construtor é executado sem erros.
Experimente acessar um objeto cujo construtor lança uma RuntimeException.
Rode isso:
[code=java]public class ExceptionTest {
private static List<ExceptionTest> instances = new ArrayList<ExceptionTest>();
public ExceptionTest() {
instances.add(this);
throw new RuntimeException("Erro!");
}
public static void main(String[] args) {
try { new ExceptionTest(); } catch ( Throwable e ) {}
System.out.println( instances.get(0) );
}
}
E aqui está um objeto que tem o construtor lançando uma exceção e que mesmo assim tem a sua referência livre na JVM, que era exatamente o que o Paulo havia falado, a referência a “this” pode sim vazar do construtor.
O método retorna void , mas void não é um tipo em Java, logo nenhuma variável o pode “conter”.
Logo o codigo acima não faz sentido.
Não faz sentido não porque o método não retorne , mas porque a variável não consegue capturar o que ele retorna.Mais uma vez, em Java não é assim:
E desde o Java 5 qualquer coisa pode ser colocada em um Object (até os primitivos são promovidos a Object via boxing), então, se “void” fosse um valor, ele caberia em Object.
Vc não entendeu que a chave da frase é valor ?
O método não retorna um valor porque “void” não é um valor.
O que seria um “valor” ? Algo que possa ser colocado numa variável. QED
A frase citada não diz nada diferente do que eu disse.
Mas o fato dele não retornar um valor, não significa que ele não retorna algo.
Ele retorna algo, exatamente por isso que vc tem que declarar void como retorno !!
Vc não precisaria do void se houvesse um tipo de método que retorna e um que não retorna.
Vc precisa de void porque todos os métodos retornam algo. Só que alguns retornam algo que não é um valor, i.e. algo que pode ser usado pelo programa.
Nada impediria declara um método assim
public fazalgoSemretornar(){
// faz algo
}
Seria um método sem retorno.
A única razão para que vc não possa fazer isso é que: todos os métodos retornam algo.
Recomendo que atente à diferença entre as palavras algo, nada, alguma coisa, void , nulo e valor.
Mas… se um método void não retorna um valor, mas retorna algo, que algo é esse? E, se esse algo de fato não existe, não poderíamos considerar como se o método não retornasse coisa alguma de fato?
Não adianta, você vai terminar discutindo sobre a filosofia do nada e do vazio com ele já que pra ele a inexistência de um valor não é nada e sim alguma coisa 
E como a própria expecificação diz, nós usamos “void” apenas para “indicar” que não há valor retornado, ela não diz em momento algum que “void” é retornado, como ele está tentando fazer parecer.
Se Objeto fosse a mesma coisa que Referencia vc teria razão. Mas como Objeto não é a referencia que o aponta então não.
Embora no construtor vc tenha acesso a this ( a referencia para o próprio objeto) isso não significa que o objeto já existe.
Repare que se o objeto pode existir sem o construtor o construtor não serve para nada. Bastaria ter um método do tipo “onJVMLoad()” que poderiamos sobreescrever e pronto. Ha!, mas ai eu poderia chamar esse método mesmo quando não estou dentro do processo de construção … danou…
O Objeto só é “oficialmente” construído quando o construtor é executado sem erros.
Experimente acessar um objeto cujo construtor lança uma RuntimeException.Rode isso:
[code=java]public class ExceptionTest {
private static List<ExceptionTest> instances = new ArrayList<ExceptionTest>(); public ExceptionTest() { instances.add(this); throw new RuntimeException("Erro!"); } public static void main(String[] args) { try { new ExceptionTest(); } catch ( Throwable e ) {} System.out.println( instances.get(0) ); } }E aqui está um objeto que tem o construtor lançando uma exceção e que mesmo assim tem a sua referência livre na JVM, que era exatamente o que o Paulo havia falado, a referência a “this” pode sim vazar do construtor.
LoL … isso prova que o objeto instances existe. Não prova que o objeto ExceptionTest existe.
Prova também que é passada ao objeto ExceptionTest uma referencia a ele mesmo e as referencias dos seus atributos. Tudo bem, eu não disse que não passava.
O desafio é pegar a instância que foi criada dentro do try … supondo que alguma foi realmente criada, claro.
Não Sérgio. Execute o código postado uma vez, e você verá que o método toString() do objeto criado é chamado, provando que existe de fato um objeto do tipo ExceptionTest na primeira posição do ArrayList. Comente o código dentro do try/catch e execute o código novamente: ocorrerá um IndexOutOfBoundsException.
Um método sempre retorna. Existe três coisas que ele pode retornar : uma referencia, um primitivo e void. Void é um “terceiro estado”
para o retorno da mesma forma que “null” é um “segundo estado” para referencias. O que é tão difícil de entender aqui ?
Dito isto, um método sempre retorna, mas nem sempre retorna referencia ou primitivo. Quando ele não retorna nenhum destes vc precisa indicar void no tipo de retorno porque esse método não irá retornar um valor. Mas “não irá retornar um valor” é diferente de “não irá retornar”. Deu para entender ?
Se vc me apresentar alguma coisa dizendo que métodos void não retornam, ai beleza. Mas apenas apresentar coisas que dizem que ele não retorna valores, isso não desdiz o que falei. Eu já tinha explicado que void não era um valor. ( e por isso não pode ser colocado em uma variável)
ninguém mencionou “existência” referindo-se ao que o método retorna.
Entendi. Não estava questionando, estava apenas tentando entender. Então, o significado de retornar aqui é “encerrar a execução”, né?
É natural questionar a existência de algo que é retornado pelo método, mesmo que esse algo não seja um valor. Mas agora vi que você falou que o “método retorna”, e não que o “método retorna algo”.
Um método sempre retorna. Existe três coisas que ele pode retornar : uma referencia, um primitivo e void. Void é um “terceiro estado”
para o retorno da mesma forma que “null” é um “segundo estado” para referencias. O que é tão difícil de entender aqui ?
“null” não é um “segundo estado” para referências, existe um tipo anônimo null que tem como seu único valor o valor que está na literal “null” do Java:
Outras linguagens, como Ruby, fazem desse objeto “null” um objeto visível na linguagem, que pode ser acessado como qualquer outro objeto (em Ruby ele seria o NilObject).
Acho que aqui você está misturando as bolas. Esse retorno é o retorno de “alguma coisa” ou é o retorno de acabar a execução do método e ele devolver o controle da execução pra quem o chamou?
Ambos são coisas completamente diferentes e toda essa discussão foi iniciada porque “procedures” em linguagens como Pascal não retornam valores mas elas devolvem o fluxo de execução pra quem as chamou, então dizer que um método “retorna” apenas porque ele devolve o fluxo de execução não tem nada haver com o fato do método retornar alguma coisa, já que procedures não retornam anda mas devolvem a execução a quem as chamou.
Eu ficaria realmente muito satisfeito em aceitar a sua teoria se você pudesse citar a parte da JLS que diz que “void” é alguma coisa, mesmo não sendo um valor, porque até agora tudo isso parece apenas a sua opinião pessoal, sem nenhum fundamento na especificação da linguagem. Métodos void devolvem o controle da execução para o método que os chamou quando o seu corpo acaba de executar, mas eles não retornam.
Foi exatamente essa a questão que eu quis levantar. Note que o conceito de retornar no sentido de devolver o controle de execução pra quem o chamou se aplica a construtores também ( que, segundo o Sérgio, não retornam nada porque não é necessário especificar essa condição com a palavra “void” ).
Não Sérgio. Execute o código postado uma vez, e você verá que o método toString() do objeto criado é chamado, provando que existe de fato um objeto do tipo ExceptionTest na primeira posição do ArrayList. Comente o código dentro do try/catch e execute o código novamente: ocorrerá um IndexOutOfBoundsException.
Claro que acontecerá, a lista está vazia. Mas a existencia da lista não depende da existencia do objeto ExceptionTest (ela é static ora!)
O fato do toString ser chamado pelo Debugger não prova nada porque o Debugger não faz parte da JVM.
O ponto é: vc consegue obter o objeto criado sim ou não ?
Não ? QED
Sim ? Apresente um código que faça isso.
Claro que acontecerá, a lista está vazia. Mas a existencia da lista não depende da existencia do objeto ExceptionTest (ela é static ora!)O fato do toString ser chamado pelo Debugger não prova nada porque o Debugger não faz parte da JVM.
O ponto é: vc consegue obter o objeto criado sim ou não ?Não ? QED
Sim ? Apresente um código que faça isso.
Você não entendeu. A lista não está vazia: ela contém uma instância da classe ExceptionTest na posição de índice 0 do ArrayList. Você ao menos executou o código pra verificar? Eu sim.
[EDITADO]
Debugger? De onde você tirou isso?
[/EDITADO]
Já que ele acha que criar um objeto só não é o suficiente, agora criando dez objetos.
[code=java]import java.util.ArrayList;
import java.util.List;
public class ExceptionTest {
private static List<ExceptionTest> instances = new ArrayList<ExceptionTest>();
public ExceptionTest() {
instances.add(this);
throw new RuntimeException("Erro!");
}
public static void main(String[] args) {
for ( int x = 0; x < 10; x++ ) {
try { new ExceptionTest(); } catch ( Throwable e ) {}
}
for ( ExceptionTest t : instances ) {
System.out.println(t);
}
}
}
ExceptionTest@3e25a5
ExceptionTest@19821f
ExceptionTest@addbf1
ExceptionTest@42e816
ExceptionTest@9304b1
ExceptionTest@190d11
ExceptionTest@a90653
ExceptionTest@de6ced
ExceptionTest@c17164
ExceptionTest@1fb8ee3
Um método sempre retorna. Existe três coisas que ele pode retornar : uma referencia, um primitivo e void. Void é um “terceiro estado”
para o retorno da mesma forma que “null” é um “segundo estado” para referencias. O que é tão difícil de entender aqui ?“null” não é um “segundo estado” para referências, existe um tipo anônimo null que tem como seu único valor o valor que está na literal “null” do Java:
Vc leu esse texto ? Ele fala de “null type” e “null reference”. Null type é um tipo de objeto que é essa que vc se refere como sendo anonimo. Mas eu me referi a null reference. A reference podem seu valor igual a null ou um outro valor. O ponto é:
“In practice, the programmer can ignore the null type and just pretend that null is merely a special literal that can be of any reference type.”
Eu posso ignorar que existe um tipo null (ou seja, um objeto cuja referencia é a mesma que o literal null) e aceitar que
null é um “segundo estado” dos tipos de referencia. Eu sei que não existe isso, por isso que coloquei entre aspas. Eu posso aceitar isto, na prática, se eu quiser. É isso que estou fazendo.
Não. Não estou falando do ato de continuar o processo no ponto " seguir " à chamada do método.
Não estou falando daquilo que faz o “return”. Não estou falando de “sair do método”.
Eu ficaria realmente muito satisfeito em aceitar a sua teoria se você pudesse citar a parte da JLS que diz que “void” é alguma coisa, mesmo não sendo um valor, porque até agora tudo isso parece apenas a sua opinião pessoal, sem nenhum fundamento na especificação da linguagem. Métodos void devolvem o controle da execução para o método que os chamou quando o seu corpo acaba de executar, mas eles não retornam.
Bom, então o seu argumento é: Métodos que declaram void não retornam coisa alguma e os que declara outra coisa é porque retornam algo. Ok. Então OO , em Java tem funções e rotinas. Legal! Agora mostre-me algo na JLS dizendo que Java tem funções e rotinas.
Some do. Some teach. Re rest , look it up.
Se a JLS responde a todas as perguntas, então responda à pergunta do topico com ela. Qual é a diferença em funções e métodos em Java segundo a JLS ?
Claro que acontecerá, a lista está vazia. Mas a existencia da lista não depende da existencia do objeto ExceptionTest (ela é static ora!)O fato do toString ser chamado pelo Debugger não prova nada porque o Debugger não faz parte da JVM.
O ponto é: vc consegue obter o objeto criado sim ou não ?Não ? QED
Sim ? Apresente um código que faça isso.
Você não entendeu. A lista não está vazia: ela contém uma instância da classe ExceptionTest na posição de índice 0 do ArrayList. Você ao menos executou o código pra verificar? Eu sim.
Não , não tinha executado o codigo.
Ok vc consegue obter o objeto. Um erro no construtor não inviabiliza o objecto (!).
You win.
Bom, então o seu argumento é: Métodos que declaram void não retornam coisa alguma e os que declara outra coisa é porque retornam algo. Ok. Então OO , em Java tem funções e rotinas. Legal! Agora mostre-me algo na JLS dizendo que Java tem funções e rotinas.
Eu mesmo não, eu nunca disse isso, disse apenas que métodos podem ou não retornar alguma coisa. Você que está chegando a essa conclusão sozinho e sem a ajuda de ninguém 
Some do. Some teach. Re rest , look it up.
Se a JLS responde a todas as perguntas, então responda à pergunta do topico com ela. Qual é a diferença em funções e métodos em Java segundo a JLS ?
Funções não existem em Java (até o momento, claro), simples assim, então não há porque diferenciar uma coisa da outra dentro do Java.
Agora, se você me perguntar qual a diferença de uma função em uma linguagem funcional pros métodos em Java, a coisa muda de figura.
Funções, em uma linguagem funcional, tem como escopo apenas elas mesmas, já que em uma linguagem puramente funcional não existem “variáveis globais”, enquanto um método tem acesso ao seu escopo, o escopo do objeto aonde ele foi chamdo (se ele for um método de instância) e o escopo da classe aqual ele pertence (além de poder acessar qualquer atributo ou método visível pra ele).
Como as funções só tem acesso aos dados passdos como parâmetros para elas e as suas variáveis locais, não importa “aonde” você chama a função, contanto que você passe os parâmetros pra ela, independentemente de em qual “máquina” ela for executada, ela vai ser capaz de produzir o valor e é assim que algoritmos como map-reduce do Google funcionam.
Pra entender mais sobre isso, o ideal é estudar e usar uma linguagem funcional, Erlang tá na moda, é uma boa linguagem pra aprender, especialmente pra quem tem interesse em descobrir um mundo concorrente de verdade.
Bom, então o seu argumento é: Métodos que declaram void não retornam coisa alguma e os que declara outra coisa é porque retornam algo. Ok. Então OO , em Java tem funções e rotinas. Legal! Agora mostre-me algo na JLS dizendo que Java tem funções e rotinas.
Eu mesmo não, eu nunca disse isso, disse apenas que métodos podem ou não retornar alguma coisa. Você que está chegando a essa conclusão sozinho e sem a ajuda de ninguém 
Some do. Some teach. Re rest , look it up.
Se a JLS responde a todas as perguntas, então responda à pergunta do topico com ela. Qual é a diferença em funções e métodos em Java segundo a JLS ?
Funções não existem em Java (até o momento, claro), simples assim, então não há porque diferenciar uma coisa da outra dentro do Java.
O que não existe em Java são tipos de função (aka variáveis que recebem funções, aka funções como objetos, aka closures).
Suponho então que o texto a seguir não significa nada para si:
A method is an ordinary member function of a class. It has its own name, a return type (which may be void), and is invoked using the dot operator.
http://www.allapplabs.com/interview_questions/java_interview_questions.htm
afinal não é uma citação da JLS …
Cheguei atrasado:ExceptionTest@3e25a5 ExceptionTest@19821f ExceptionTest@addbf1 ExceptionTest@42e816 ExceptionTest@9304b1 ExceptionTest@190d11 ExceptionTest@a90653 ExceptionTest@de6ced ExceptionTest@c17164 ExceptionTest@1fb8ee3
import br.com.caelum.stella.inwords.FormatoDeReal;
import br.com.caelum.stella.inwords.NumericToWordsConverter;
import java.util.ArrayList;
import java.util.List;
public class ExceptionTest {
NumericToWordsConverter conversor = new NumericToWordsConverter(new FormatoDeReal());
private static List<ExceptionTest> instances = new ArrayList<ExceptionTest>();
private String texto;
public ExceptionTest(int ano, double preço) {
texto = "01/" + ano + ": " + conversor.toWords(preço);
instances.add(this);
throw new RuntimeException("Erro!");
}
public String toString() {
return texto;
}
public static void main(String[] args) {
int ano = 2000;
double preço = 112.22;
double inflaçãoMédiaAnual = 1.093305;
for (; ano <= 2008; ano++) {
try {
new ExceptionTest(ano, preço);
} catch (Throwable e) {
}
preço *= inflaçãoMédiaAnual;
}
System.out.println("Inflação da cesta básica em São Paulo:");
for (ExceptionTest x : instances) {
System.out.println(x);
}
}
}
Inflação da cesta básica em São Paulo:
01/2000: cento e doze reais e vinte e dois centavos
01/2001: cento e vinte e dois reais e sessenta e nove centavos
01/2002: cento e trinta e quatro reais e quatorze centavos
01/2003: cento e quarenta e seis reais e sessenta e cinco centavos
01/2004: cento e sessenta reais e trinta e quatro centavos
01/2005: cento e setenta e cinco reais e trinta centavos
01/2006: cento e noventa e um reais e sessenta e cinco centavos
01/2007: duzentos e nove reais e cinquenta e quatro centavos
01/2008: duzentos e vinte e nove reais e nove centavos
Experimente acessar um objeto cujo construtor lança uma RuntimeException.
Simplesmente não é possível.
hummmm…
class X {
public static X objectoMalConstruido;
X() {
X.objetoMalConstruido = this;
throw new RuntimeException();
}
public static void main(String... args) {
try {
X x = new X();
} catch (RuntimeException e) {
// feio
}
X objeto = X.objetoMalConstruido;
// AHA!
}
}
HEHEHEHEHEH :). Ninja. Java puzzles! digitei aqui mesmo, pode ter erro de compilacao.
Confesso que alguem ja tinha mostrado isso anos atras pra mim. Talvez o louds ou o mister_m.
String... args :shock:
O que seria uma String… ?
String... args:shock:O que seria uma String… ?
varargs marcio, implementado no java 5.
Existe uma confusão danada aqui, talvez seja melhor esclarecer termos.
- Função em linguagem de programação não é função matemática, é apenas uma subrotina com um nome.
- Em linguagens funcionais funções tendem a se comportar de maneira bem parecida com funções matemáticas
- Na grande maioria das linguagens não existe distinção entre função, método ou procedimento
- Na literatura de CS é comum usar ‘função’ como higher-order function e ‘procedimento’ como uma função sem higher-order
- Em algumas linguagens (pascal?) usa-se função e procedimento para dar diferencias subrotinas que retornam algo e não retornam
- Qualquer função, em qualquer linguagem que eu conheça, vai retornar -o ponto é se ela vai retornar algo como resultado ou não. “Retornar void” quer dizer que não porque void significa exatamente “nothingness: the state of nonexistence”, logo o método em questão não retorna nada. Funções que não retornam nada não são úteis em programação funcional mas são comuns em programação imperativa
- O nome “Método” não faz parte de nenhuma definição clássica de OO que eu tenha lido. Linguagens chamam subrotinas atreladas a um objeto de nomes diferentes.
- Qualquer função, em qualquer linguagem que eu conheça, vai retornar -o ponto é se ela vai retornar algo como resultado ou não. “Retornar void” quer dizer que não porque void significa exatamente “nothingness: the state of nonexistence”, logo o método em questão não retorna nada. Funções que não retornam nada não são úteis em programação funcional mas são comuns em programação imperativa
No nivel de implementacao void é um dos tipos definidos na linguagem. Mas apesar de falarmos funcao/metodo com retorno tipo Void, este nao possui um valor associado ao retorno que seja de interesse do chamador.
No nivel de implementacao void é um dos tipos definidos na linguagem. Mas apesar de falarmos funcao/metodo com retorno tipo Void, este nao possui um valor associado ao retorno que seja de interesse do chamador.
A linguagem Java não possui o “tipo void” (apesar de possuir uma classe placeholder). Na linguagem Java métodos ou retornam algo ou são void:
8.4.5 Method Return Type
The return type of a method declares the type of value a method returns, if it returns a value, or states that the method is void.
O que a JVM ou o compilador fazem para atingir isso é outro nível, completamente independente, de abstração. . Um bom exemplo está em um post recente do Charles Nutter:
Now the astute reader may already have noticed that other than being specified as reference or primitive types, the opcodes themselves have no type information. Even beyond that, there are no actual variable declarations at the bytecode level whatsoever. The only types we see come in the form of opcode prefixes (as in aload, iinc, etc) and the method signatures against which we execute invoke* operations. The stack itself is also untyped; we push a reference type (aload) one minute and push a primitive type (iload) the next (though values on the stack do not “lose” their types). And when I tell you that the type signatures shown above for each method invocation or object construction are simply strings stuffed into the class’s pool of constants…well…now you may start to realize that Java’s sometimes touted, oft-maligned static-typing…is just a façade.
A linguagem Java não possui o “tipo void” (apesar de possuir uma classe placeholder).
Segundo a referencia que vc mesmo acabou de citar: “The Class object representing the primitive Java type void.”
Em contrapartida, segue um exemplo de funcao que retorna “nada”:
Object retornaNada() {
return null;
}
A linguagem Java não possui o “tipo void” (apesar de possuir uma classe placeholder).Segundo a referencia que vc mesmo acabou de citar: “The Class object representing the primitive Java type void.”
Eu diria que é um erro no JavaDoc, já que void não é um tipo primitivo em Java. Na dúvida consulte a JLS:
4.2 Primitive Types and Values
A primitive type is predefined by the Java programming language and named by its reserved keyword (§3.9):PrimitiveType: NumericType boolean NumericType: IntegralType FloatingPointType IntegralType: one of byte short int long char FloatingPointType: one of float double
A classe Void é utilizada apenas em meta-programação e, como diz sua descrição, é apenas um placeholder.
Mas para tirar qualquer dúvida restante, mais um trecho:
Unlike C and C++, the Java programming language allows only certain forms of expressions to be used as expression statements. Note that the Java programming language does not allow a “cast to void”-void is not a type-so the traditional C trick of writing an expression statement such as:(void) ... ; // incorrect!does not work. On the other hand, the language allows all the most useful kinds of expressions in expressions statements, and it does not require a method invocation used as an expression statement to invoke a void method, so such a trick is almost never needed. If a trick is needed, either an assignment statement (§15.26) or a local variable declaration statement (§14.4) can be used instead.
Em contrapartida, segue um exemplo de funcao que retorna “nada”:
Object retornaNada() { return null; }
Isso não retorna “nada”, retorna null. Mas void também não é retornar “nada”, é sem retorno. Outro trecho da JLS que fala sobre isso:
The MethodModifiers are described in §8.4.3, the TypeParameters clause of a method in §8.4.4, the Throws clause in §8.4.6, and the MethodBody in §8.4.7. A method declaration either specifies the type of value that the method returns or uses the keyword void to indicate that the method does not return a value.
Sou inicante em Java. mas acho que posso compartilhar oque meu professor diz sobre esse assunto:
- Costumo dizer que métodos são pertencentes a objetos. Sendo necessário instanciar um para acessar seus metodos. Já o que mais se aproxima de funções são os métodos estáticos que não necessariamente precisam de um objeto para utilizá-los, característica essa que os aproxima de funções de outras linguagens.
:lol:
Bom dia, em c++ se chama função e em java
se chama metodo, porém todo metodo ou função retorna algo,
mesmo que retorne que nao tem nada à retornar.