Qual é a diferença entre Função e Método?

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 :slight_smile:

[quote=sergiotaborda]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 ?[/quote]

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.

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 :slight_smile:

[quote=sergiotaborda]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 ?[/quote]

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.
[/quote]

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:

http://www.allapplabs.com/interview_questions/java_interview_questions.htm

afinal não é uma citação da JLS …

[quote=tnaires][quote=Saída]ExceptionTest@3e25a5
ExceptionTest@19821f
ExceptionTest@addbf1
ExceptionTest@42e816
ExceptionTest@9304b1
ExceptionTest@190d11
ExceptionTest@a90653
ExceptionTest@de6ced
ExceptionTest@c17164
ExceptionTest@1fb8ee3[/quote][/quote]

Cheguei atrasado:

[code]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);
    }
}

}[/code]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

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… ?

[quote=marcio_gs]String... args :shock:

O que seria uma String… ?[/quote]

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.

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.

[quote=cmoscoso]
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.[/quote]

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:

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:

[quote=pcalcado]
A linguagem Java não possui o “tipo void” (apesar de possuir uma classe placeholder).[/quote]

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; }

[quote=cmoscoso][quote=pcalcado]
A linguagem Java não possui o “tipo void” (apesar de possuir uma classe placeholder).[/quote]

Segundo a referencia que vc mesmo acabou de citar: “The Class object representing the primitive Java type void.”
[/quote]

Eu diria que é um erro no JavaDoc, já que void não é um tipo primitivo em Java. Na dúvida consulte a JLS:

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:

[quote=http://java.sun.com/docs/books/jls/third_edition/html/statements.html#5989]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.[/quote]

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:

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.