Estou escrevendo uma explicação para algum código de um curso e uso acidentalmente as palavras method
e de forma function
intercambiável. Decidi voltar e corrigir o texto, mas encontrei um buraco no meu entendimento.
Pelo que entendi, uma sub-rotina é function
se não age em uma instância de uma classe (seu efeito é restrito a sua entrada / saída explícita) e é method
se opera em uma instância de uma classe (pode efeitos colaterais na instância que a tornam impura).
Há uma boa discussão aqui sobre o assunto. Observe que, pelas definições da resposta aceita, uma estática method
deve realmente ser uma função porque uma instância nunca é passada implicitamente e não tem acesso aos membros de nenhuma instância.
Com isso em mente, a estática não deveria methods
realmente ser funções?
Por sua definição, eles não agem em instâncias particulares de uma classe; eles só estão "vinculados" à classe por causa de relação. Eu já vi alguns sites com boa aparência que se referem a sub-rotinas estáticas como "métodos" ( Oracle , Fredosaurus , ProgrammingSimplified ); portanto, todos estão ignorando a terminologia ou estou perdendo alguma coisa (meu palpite é o último). .
Gostaria de ter certeza de que estou usando as palavras corretas.
Alguém pode esclarecer isso?
fonte
Respostas:
Esta citação do 8.4.3.2 podem ajudar:
Java só quer que você "pense orientado a objetos". Além disso, os métodos estáticos têm acesso a um escopo circundante que pode incluir o estado. De certa forma, a classe é como um objeto em si.
fonte
@FunctionalInterface
anotação e com 1 método sob o capô. Um lambda é apenas açúcar sintático e, nesse sentido, não há nada de novo.A resposta simples é que quando o Java decidiu chamar tudo de "método", eles não se preocuparam com a distinção entre uma função e um método na ciência da computação teórica.
fonte
Métodos estáticos não são exatamente funções, a diferença é sutil, mas importante.
Um método estático usando apenas determinados parâmetros de entrada é essencialmente uma função.
Mas os métodos estáticos podem acessar variáveis estáticas e outras funções estáticas (também usando variáveis estáticas); portanto, os métodos estáticos podem ter um estado que é fundamentalmente diferente de uma função que, por definição, é sem estado . (ADENDA: Embora os programadores geralmente não sejam tão rigorosos com o uso de "função" como definição, uma função estrita na ciência da computação pode acessar apenas parâmetros de entrada). Portanto, definindo este caso de acesso a campos estáticos, não é válido dizer que métodos estáticos são sempre funções.
Outra diferença que justifica o uso do "método estático" é que você pode definir em C derivados funções globais e variáveis globais que podem ser acessadas em qualquer lugar. Se você não puder acessar a classe que contém métodos estáticos, os métodos também estarão inacessíveis. Portanto, os "métodos estáticos" são limitados em seu escopo pelo design, em contraste com as funções globais.
fonte
Em Java, uma classe definida pelo usuário é na verdade uma instância de uma subclasse de java.lang.Class.
Nesse sentido, métodos estáticos são anexados a uma instância de uma classe conceitual: eles são anexados a uma instância de uma subclasse de java.lang.Class.
Com isso em mente, o termo "método de classe" (um nome alternativo para os métodos estáticos de Java) começa a fazer sentido. E o termo "método de classe" pode ser encontrado em muitos lugares: Objetivo C, Smalltalk e JLS - para citar apenas alguns.
fonte
Na ciência da computação, a função é claramente mapeada para um método estático. Mas o "método" de uma classe é um pouco genérico, como "membro" (membro do campo, membro do método). Existem expressões como
Portanto, a razão é que, como disse o filósofo Ludwig Wittgenstein, a linguagem é uma ferramenta com contextos diferentes. "Método" é um bom apelido na citação acima para categorizar um "membro".
fonte
Seu pensamento está certo e faz sentido. Não é apenas terminologia estabelecida na comunidade Java. Deixe-me explicar alguns elementos internos que podem ajudar a entender por que a terminologia subsiste.
Java é uma linguagem orientada a objetos baseada em classe. Um método é sempre membro de uma classe ou instância (esta é uma declaração geral válida para outras linguagens de programação também). Pensamos em classe e instância sendo os dois objetos.
Método de instância (dinâmico)
Você não pode invocar esse método diretamente de uma classe, você deve criar uma instância. Cada instância faz referência a esse método. Você pode sobrescrever uma definição de método com exatamente a mesma assinatura de método (ao subclassificar), ou seja, a referência aponta para um método diferente (que tem a mesma assinatura, mas pode ter um corpo de método diferente). O método é dinâmico.
Método de classe (estático)
Você só pode invocar esse método diretamente da classe, ou seja, não precisa criar uma instância dessa classe. Existe apenas uma definição global desse método em todo o programa. Você não pode substituir exatamente a mesma assinatura de método quando o método é declarado estático, porque há apenas uma definição válida para todo o programa. Observe que o método é membro do próprio objeto de classe, as instâncias têm a mesma referência exclusiva (e correção) a esse método.
fonte
Aqui está outra visão da terminologia, usando Scala como um mnemônico:
No Scala, você tem
object
s, que são instâncias únicas de uma classe definida implicitamente1 .De acordo com sua definição, podemos chamar essas sub-rotinas pertencentes aos
object
métodos , pois operam em uma única instância da classe.Além disso, o objeto também definirá a classe A e criará todos os métodos no objeto A como métodos estáticos na classe A (para interface com Java) [2] .
Portanto, podemos dizer que os métodos estáticos da classe Java A acessam os mesmos membros da instância singala Scala, que por sua definição merecem ser chamados métodos (estáticos) da classe A.
fonte
object
referência faz muito sentido. Obrigado.Obviamente, a principal diferença é - o método pode usar campos estáticos, não apenas os parâmetros do método. Mas há um polimorfismo adicional! Resultados da avaliação As classes A.doTheSameStaticMethod () e ClassB.doTheSameStaticMehod () dependerão da classe. Nesse caso, a função é impotente.
fonte
Cada classe tem um objeto para representá-lo, que é uma instância de uma subclasse da
Class
classe. Métodos estáticos são realmente métodos de instância nesses objetos que são instâncias de uma subclasse de Class. Eles têm acesso ao estado na forma de campos estáticos, portanto, não estão restritos a serem apenas funções (sem estado). Eles são métodos.fonte