"Olá Amigo! Espero que tenha gostado de resolver tarefas usando seus próprios métodos, e que tenha percebido como é conveniente criar métodos. Agora vamos falar sobre o assunto mais interessante de todos."
"Você despertou meu interesse, Diego... Um novo assunto?"
"Todo tópico é novo para você, meu jovem robô! E este não é exceção. Embora mais uma vez seja sobre métodos. Você provavelmente já percebeu que métodos como esse podem passar argumentos para métodos. Uma vez dentro do System.out.println()
método , nos referimos a eles como parâmetros."
"Parâmetros são o que escrevemos entre parênteses?"
"Sim, exatamente. E, de fato, os parâmetros aumentam muito os benefícios que obtemos ao criar e usar métodos."
"Entendo o que você está dizendo sobre usá-los e descobri que já o fiz. Como declaramos um método com parâmetros?"
"Na verdade é bem simples:
public static void name(parameters)
{
method body
}
"Onde name
é o nome exclusivo do método e method body
representa os comandos que compõem o método. E parameters
é um espaço reservado para os parâmetros do método, separados por vírgulas."
"Hmm... acho que entendi... Ou talvez não..."
"Deixe-me dar mais alguns detalhes sobre este modelo para que você tenha certeza de que entende que entende:
public static void name(Type1 name1, Type2 name2, Type3 name3)
{
method body
}
aqui estão alguns exemplos:
Código | Explicação |
---|---|
|
O print método é declarado com um parâmetro:String str |
|
O print método é declarado com dois parâmetros:String str int count |
|
O write método é declarado com dois parâmetros:int x int y |
"Ah... Agora está claro. E se não queremos que o método tenha parâmetros, então é só deixar os parênteses vazios."
"Exatamente. Basicamente, parâmetros são variáveis especiais dentro de um método. Com a ajuda deles, você pode passar vários valores para o método quando ele é chamado. E se você não precisar passar valores, deixe os parênteses vazios.
"Por exemplo, vamos escrever um método que exiba uma determinada linha de texto um determinado número de vezes. Alguma ideia de como fazer isso?"
"Bem... Parece que estou bem ciente de como escrever um código para exibir uma string na tela várias vezes..."
"Como você especifica a string a ser exibida? E como você especifica o número de linhas exibidas? Você consegue adivinhar?"
"As coisas estão começando a ficar claras... Provavelmente com a ajuda dos parâmetros do método?"
"Exatamente. Um parâmetro de string para a linha de texto e um parâmetro numérico para o número de linhas exibidas. O código que faz isso ficaria assim:
Código | Explicação |
---|---|
|
Declaramos o printLines método com os seguintes parâmetros: String text , int count O método exibe String text count vezes Chamamos o printLines método com vários parâmetros |
"Cada vez que um método é chamado, seus parâmetros recebem os valores passados, e só então começamos a executar os comandos dentro do método.
argumentos
"Quero que você preste atenção especial ao chamar métodos que possuem parâmetros. Os valores passados para o método geralmente são chamados de argumentos quando são passados para o método.
Vamos dar outra olhada no nosso exemplo:
Código | Explicação |
---|---|
|
Declaramos o printLines método com os seguintes parâmetros: String text , int count O método exibe String text count times Chamamos o printLines método com os seguintes argumentos:text = "Hi"; count = 10; text = "Bye"; count = 20; |
"Quando o printLines
método foi chamado pela primeira vez, seus parâmetros receberam os seguintes valores:
String text = "Hi", int count = 10
.
"Quando o printLines
método foi chamado pela segunda vez, seus parâmetros receberam valores diferentes:
String text = "Bye", int count = 20
.
"Parâmetros são nem mais nem menos do que variáveis que recebem certos valores quando um método é chamado. Os valores "Hi"
, "Bye"
, 10
e 20
são eles próprios chamados de argumentos."
"Vou tentar lembrar a diferença e não confundir esses conceitos."
Nomes de variáveis conflitantes ao chamar um método
"Ao chamar um método, você pode usar variáveis como argumentos.
"Bem, isso faz sentido!"
"Faz sentido, mas pode potencialmente produzir algumas dificuldades. Vamos voltar ao nosso exemplo mais uma vez, mas desta vez vamos mover os argumentos para variáveis separadas:
Código | Explicação |
---|---|
|
Declaramos o printLines método com os seguintes parâmetros: String text , int count O método exibe String text count times Chamamos o printLines método com os seguintes argumentos:text = str; count = n; |
"Hmm... Não vejo nenhuma dificuldade. Temos uma str
variável. Seu valor é atribuído ao text
parâmetro quando o método é chamado. Temos uma n
variável. Seu valor é atribuído ao count
parâmetro quando o método é chamado." "Até agora, tudo está claro."
"Bom, bom. Agora vamos renomear nossas variáveis no main
método:
Código | Explicação |
---|---|
|
Declaramos o printLines método com os seguintes parâmetros: String text , int count O método exibe String text count times Chamamos o printLines método com os seguintes argumentos:text = text; count = count; |
"Preste atenção em duas coisas
Primeiro: temos variáveis com o mesmo nome em métodos diferentes. Estas são variáveis diferentes (nós as representamos deliberadamente usando cores diferentes). Tudo funciona da mesma forma que no exemplo anterior, onde as variáveis do main
método foram nomeadas str
e n
.
Segundo: Nada de mágico acontece quando o método é chamado. Os parâmetros são simplesmente atribuídos aos valores de argumento. Independentemente de serem números, strings, variáveis ou expressões.
"Depois que renomeamos as variáveis no método principal, nada mudou. Elas eram variáveis diferentes em métodos diferentes anteriormente e assim permanecem. Não há conexão mágica entre as duas text
variáveis."
"Agora eu sei."
Passando referências a métodos
"Espero que você já tenha assimilado tudo o que eu disse sobre a passagem de argumentos para métodos. Digo isso porque agora vamos nos aprofundar um pouco mais nesse assunto. Ouça com atenção."
"Você já sabe que algumas variáveis em Java armazenam não os valores em si, mas sim uma referência , ou seja, o endereço do bloco de memória onde os valores estão localizados. É assim que funcionam as variáveis string e variáveis array.
"Quando um desenvolvedor atribui outra variável de array a uma variável de array, o que acontece?"
"Então eles apontam para o mesmo endereço?"
"Correto. As duas variáveis passam a se referir ao mesmo espaço na memória:
"E o que acontece se uma dessas variáveis for um parâmetro de método?
Código | Explicação |
---|---|
|
O sum método calcula a soma dos números no array passado e exibe na tela |
"Acontece exatamente a mesma coisa: o data
parâmetro conterá uma referência à mesma área de memória que a months
variável. Quando o método é chamado, ocorre uma atribuição simples: .data = months
"E como ambas as variáveis se referem à mesma área de memória que armazena um número inteiro, o sum
método pode não apenas ler valores da matriz, mas também alterá-los!"
"Acho que entendi, mas preciso de mais exemplos!"
"Bem, por exemplo, podemos escrever nosso próprio método que preenche um array bidimensional com o mesmo valor. Pode ser assim:
Código | Explicação |
---|---|
|
O fill método itera sobre cada célula na matriz bidimensional passada e atribui value a eles. Criamos um array bidimensional. Preenchemos todo o array com o número 8 . |
Métodos com o mesmo nome
"Agora vamos retornar aos nomes dos métodos mais uma vez."
"Não consigo imaginar o que mais poderia ser dito sobre nomes!"
"Bem, o padrão da linguagem Java exige que todos os métodos da mesma classe tenham nomes exclusivos.
"Então, é impossível declarar dois métodos com nomes idênticos na mesma classe?"
"Agora - preste muita atenção! Os métodos em uma classe podem realmente ter nomes idênticos! Mas, neste caso, eles devem ter parâmetros diferentes. Em outras palavras, os métodos são comparados quanto à semelhança, não apenas os nomes são levados em consideração, mas também os tipos dos parâmetros ! Observe que eu disse especificamente os tipos. Os nomes dos parâmetros não são levados em consideração . Exemplos:
Código | Explicação |
---|---|
|
Esses três métodos são métodos diferentes . Eles podem ser declarados na mesma classe. |
|
Cada um desses cinco métodos é considerado diferente . Eles podem ser declarados na mesma classe. |
|
"Esses dois métodos são considerados iguais , o que significa que não podem ser declarados na mesma classe." |
"Estou totalmente confuso! Por que precisamos de tudo isso? Por que alguns métodos são considerados iguais , enquanto outros são diferentes ? E por que os nomes dos parâmetros não são levados em consideração ao determinar a exclusividade de um método? Por que a exclusividade é necessária em todos?"
"O problema é que, quando o compilador compila um programa, ele deve saber exatamente qual método você pretende chamar em determinado local.
"Por exemplo, se você escrever , o compilador é inteligente e facilmente concluirá que você pretende chamar o método aqui com um parâmetro. Mas se você escrever , o compilador verá uma chamada para o método com um parâmetro. Não faz ideia qual nome o programador deu ao parâmetro ao declarar o método."System.out.println("Hi")
println()
String
System.out.println(1.0)
println()
double
Ahh, parece que está começando a passar!
"Quando um método é chamado, o compilador garante que os tipos dos argumentos correspondam aos tipos dos parâmetros. Ele não presta atenção ao nome dos argumentos. Em Java, os nomes dos parâmetros não ajudam o compilador a determinar qual método usar Os programadores precisam deles, não do compilador.
"E eu acho que é por isso que eles não são levados em consideração ao determinar a exclusividade de um método?"
"Sim, está totalmente correto. O nome de um método e os tipos de seus parâmetros são chamados de assinatura de método . Por exemplo, sum (int, int)
"
"Portanto, cada classe deve ter métodos com assinaturas exclusivas , em vez de métodos com nomes exclusivos."
"Muito bem, amigo! Você resumiu esta lição perfeitamente. Se algo não estiver claro, não entre em pânico. Este tópico ficará claro após algumas tarefas."
GO TO FULL VERSION