Upload
ronald
View
222
Download
0
Embed Size (px)
Citation preview
8/17/2019 Java Aula04
1/46
Métodos da Linguagem Java
Prof. Ricardo Linden
8/17/2019 Java Aula04
2/46
FunçõesFun
ções Existem várias situações na vida em que um número é
completamente dependente de outro.
Por exemplo: valor da mensalidade que um aluno pa!a é dependente do número de
créditos que ele cursa. "o!o# di$emos que a mensalidade é %unç&o do número de créditos.
'uando um valor de entrada !eraum valor de sa(da único# c)amamoseste relacionamento de %unç&o.
8/17/2019 Java Aula04
3/46
FunçõesFun
ções
+ma %unç&o é uma correspond,ncia entre um con-unto devalores de entrada /denominado dom(nio0 e um con-unto devalores de sa(da /denominado ima!em0 onde extamente umúnico valor da ima!em corresponde a cada valor do dom(nio.
sto quer di$er que em uma %unç&o# cada valor de entradanunca pode corresponder a mais de um valor de sa(da
Mas ns n&o di$emos nada a um valor de sa(da corresponder amais de um valor de entrada3
8/17/2019 Java Aula04
4/46
FunçõesFun
ções
x
5
6&o é %unç&o3
x
5
7 %unç&o3
x
6&o é %unç&o3
x
7 %unç&o3
8/17/2019 Java Aula04
5/46
Terminologia e Notação de FunçõesTerminolo
gia e Notação de Funções
y é uma função de x ou y depende de xfunção (somente um valor de y corresponde a cada valor de x)
Mas ninguém falou nada sobre para cada y corresponderapenas um x
!x " se para x#$% y#& e para x#&% y#&% temos dois valoresde x para o mesmo y% mas nem por isto% deixamos de teruma função
vari'vel independente (o valor de entrada x)
domnio (o conunto de valores assumidos por x)vari'vel dependente (a vari'vel de sada y)imagem (o conunto de valores assumidos por y)
8/17/2019 Java Aula04
6/46
notaç&o 5 ; f /x0 ado que 5 e f /x0 representam exatamente a mesma quantidade#
podemos ver que 5 ; ?x @ * tamAém pode ser escrito como f /x0 ; ?x @ * sto si!ni%ica que o valor de 5 é dependente do valor de x.
Be o valor de x tamAém pode ser univocamente determinado a partir do valor de 5# di$emos que a %unç&o é invers(vel.
Terminologia e Notação de FunçõesTerminolo
gia e Notação de Funções
8/17/2019 Java Aula04
7/46
*valiando funções*valiando funções +ea f (x) # ,x - . /ual é o valor de f (-&)0
+ubstitua -& onde encontrar x" ,(-&) - . # -$$ 1ogo f (-&) # -$$
+ea f (x) # x, -,x !ncontre f (&) e f (-$) f (&) # (&), -,(&) # -$2 f (-$) # (-$), -,(-$) # &
8/17/2019 Java Aula04
8/46
'uando ol)ando para um !rá%ico# podemos determinar se o!rá%ico é uma %unç&o pelo
8/17/2019 Java Aula04
9/46
Funções com m3ltiplas vari'veis de entradaFunções com m3ltiplas vari'veis de entrada No nosso dia a dia% muitas 4uantidades dependem de mais
de uma vari'vel independente 5or exemplo"
6 crescimento de uma planta depende da 4uantidade de lu7 do sol eda c8uva
* velocidade depende da disnt9ncia viaada e do tempo da viagem * tensão depende da corrente e da resist:ncia
5odemos então expandir nossoconceito de função di7endo 4ue
uma função é uma regra 4uerelaciona uma 4uantidade com ;ou n outras 4uantidades
8/17/2019 Java Aula04
10/46
!xemplos f(x)#. f(x)# &x
8/17/2019 Java Aula04
11/46
Métodos em ?avaMétodos em ?ava métodos" @ma função definida dentro de uma classe
Métodos de Alasse " métodos 4ue são invocados sem rfer:ncias a umobeto em particular (mais detal8es mais B frente) Métodos de classe afetam toda a classe% não uma inst9ncia especfica da
classe Também são c8amados de métodos estáticos Métodos de inst9ncia" Todos os métodos 4ue são invocados dentro de uma
inst9ncia especfica de uma classe +ão c8amados simplesmente demétodos
* não ser 4ue especificado% um método não é est'tico *s vari'veis de entrada para um método são c8amados de
Parâmetros * vari'vel de sada de um métodos é c8amada de seu valor de
retorno (return value) +e um método não tiver valor de retorno em ?ava% declaramo-no
como tendo tipo de retorno void (ex" método main)
8/17/2019 Java Aula04
12/46
Reduzem a complexidade
Abstração
Encapsulam a informação
Minimizam o tamanho do código
Aumentam a manutenibilidade e a correção
Evitam duplicação do código
Limitam o efeito das mudanças
Promovem a reutilização do código
Métodos em ?avaMétodos em ?ava
umentam a %acilidade3
>iminuem o custo3
8/17/2019 Java Aula04
13/46
MétodosMétodos
Métodos e programação orientada a obetos são fortementerelacionados
5ara começar% vamos simplificarC
1ogo% vamos nos limitar a métodos p3blicos e est'ticosMétodos p3blicos são vistos por todos% inclusive fora da classeMétodos est'ticos pertencem B classe% e não ao obeto !xemplo"
DntegerparseDntC
8/17/2019 Java Aula04
14/46
MétodosMétodos
@m métodos é apenas um bloco de cEdigo nomeado 4ue tem7ero ou mais entradas e gera 7ero ou uma sada
!xemplos"
public static void main(String args[]);
public static double sqrt(double pVal);
8/17/2019 Java Aula04
15/46
*ssinatura de métodos*ssinatura de métodos
* assinatura de um método é o 4ue o identificaunivocamente
* assinatura consiste do nome do método e da lista de
par9metros
!xemplos"
public static void main(String args[]);
ssinatura
public static double sqrt(double pVal);
8/17/2019 Java Aula04
16/46
NEs podemos sobrecarregar um método% colocando duas
definições diferentes para ele
Dsto significa 4ue% dependendo dos par9metros 4ue ele receber%ele vai ter um comportamento diferente
5ara tanto% é importante 4ue as assinaturas das duas ou maisdefinições seam $;; distinguveis pelo compilador
!xemplo"
*ssinatura de métodos*ssinatura de métodos
public static double sqrt(double pVal);
public static float sqrt(float pVal);
8/17/2019 Java Aula04
17/46
1ogo% se dois métodos t:m o mesmo nome% o método corretosera c8amado com base nos argumentos 4ue l8e são passados
5or exemplo% o cEdigo abaixo c8ama os diferentes métodos
definidos anteriormentefloat hypotenuse = 1!f;
double long"eg = #!;
$y%lass!sqrt(hypotenuse);$y%lass!sqrt(long"eg);
*ssinatura de métodos*ssinatura de métodos
8/17/2019 Java Aula04
18/46
Gefinindo métodosGefinindo métodos
5ara declarar métodos% usamos a seguinte sintaxe"
public static &tipo'retorno &nome (&tipo arg1&tipo arg*+)
, +c-digo do m.todo+!
return &valor de retorno
/
Fixo# por enquanto
Gipo válido do Java#incluindo oA-etos
Halor do mesmo tipo da de%iniç&o do método
denti%icador válido do Java
8/17/2019 Java Aula04
19/46
A8amando métodosA8amando métodos
Aomo nEs% por en4uanto% sE estamos usando métodosest'ticos% eles pertencem Bs classes
1ogo% para c8am'-los% temos 4ue di7er Ho nome completoI
do método% isto é% a classe a 4ue ele pertence e o nome dele%da seguinte forma"
$y%lass!m.todos0ame(arg1 arg*+)
8/17/2019 Java Aula04
20/46
Gocumentando métodosGocumentando métodos
6 ?ava possui uma ferramenta de documentação semi-autom'tica c8amada ?avadoc
6 ?avadoc pode ser usado para extrair informação de
coment'rios especialmente formatados e gerar p'ginas dedocumentação no mesmo formato da documentação da+un
Hoc, -á visitou o Bite da BunIEle tem manuais# dicas# textosinteressantes e muito mais3
8/17/2019 Java Aula04
21/46
22
2 3 primeira frase deve ser uma descri45o
2 breve e sucinta do c-digo!
2 6epois voc7 pode ser mais proli8o e
2 discutir bem o que o m.todo fa9!05o .2 costumeiro e8plicar o que ele fa9! 6epois
2 colocamos a lista de par:metros
2
2
8/17/2019 Java Aula04
22/46
Gocumentando métodosGocumentando métodos puAlic class lass1 K
L reates a neN instance o% lass L puAlic lass1/0 K O LMétodo main método main é o método onde o processamento começa
Este método s imprime ello Qorld e n&o %a$ mais nada de útil Rparam ar!s s&o as palavras passadas na lin)a de comando /vamos discuti@los depois0 Rreturn n&o retorna nen)um valor útil /é void0 L
puAlic static void main /Btrin!ST ar!s0 t)roNs ExceptionK
Btrin! nameUB5stem.out.println/Vello Qorld3V0U
name;onsole.readBtrin!/VEnter 5our name:V0U B5stem.out.println/Vello VWname0UO
O
8/17/2019 Java Aula04
23/46
Gocumentando métodosGocumentando métodos
)amada padr&o
Xera muita in%ormaç&o que s vamosaprender a apreciar inte!ralmente mais Y%rente neste curso
Zesultado : )ttp:LL)ome.ismnet.com.ArL[rlindenL-avadoc
8/17/2019 Java Aula04
24/46
MétodosMétodos Métodos são blocos de cEdigo nomeados e auto-contidos
+ua 3nica preocupação é com suas entradas e sadas
Todos os par9metros em ?ava são passados por valor Não
existe passagem por refer:ncia
!ntretanto% lembre-se 4ue um obeto na verdade é um ponteiroe% apesar do ponteiro ser passado por valor% modificações na
'rea apontada por ele são efetivadas globalmente
8/17/2019 Java Aula04
25/46
MétodosMétodos
Jari'veis definidas dentro de métodos t:m escopo local%
limitado B4uele método% e não são vistas em outros trec8os daclasse
Joc: pode declarar vari'veis com o mesmo nome em métodos
diferentes
Nomenclatura usual" @se um verbo seguido de um obeto (no sentido gramatical)
Não use nomes extremamente grandes * primeira letra é min3scula% mas outras palavras componentes do
nome são iniciadas por mai3sculas !x " printKeport% update5osition% etc
8/17/2019 Java Aula04
26/46
Luia para definir métodosLuia para definir métodos
Métodos são funções @se-os com o mesmo senso deorgani7ação 4ue us'vamos funções nas linguagensimperativas
Arie métodos para Encapsular complexidade e %a$er seu cdi!o mais le!(vel Evitar cdi!o duplicado. Exemplo: que é mais interessante:
Promover reutili$aç&o de cdi!osolar operações e estruturas de dados complexas
inches = centimeters *!#>;
inches = $etric!centimeters?o@nches(centimeters);
8/17/2019 Java Aula04
27/46
Métodos devem ter forte coesão" tudo dentro de um métododeve ser relacionado ao seu propEsito central +e 8' doispropEsitos% deve 8aver dois métodos
6utro método de pensar em métodos é colocar dentro delespassos relacionados 4ue são executados em se4:ncia @maboa idéia é ter um método central 4ue c8ama v'rios outrosem se4:ncia
Luia para definir métodosLuia para definir métodos
8/17/2019 Java Aula04
28/46
M' coesão " 4uando temos v'rios camin8os alternativosdentro de métodos com v'rias operações distintaspossivelmente abusando do uso extensivo de flags Neste caso% a mel8or coisa a fa7er é ter um método cuo obetivo é
selecionar 4ual dos métodos vai ser c8amado
Falta de Aoesão" nen8uma relação entre as operações% 4uesão simplesmente Hembrul8adasI em um mesmo método
Luia para não definir métodosLuia para não definir métodos
+se métodos para de%inir operaçõesreali$adas pelas suas classes e oA-etos# mastamAém use@os para modulari$ar seu cdi!o#com o oA-etivo de simpli%icá@lo# nunca paradestru(@lo em pedacin)os aleatrios
8/17/2019 Java Aula04
29/46
coplamento é um termo usado para descrever qu&o li!ados dois
métodos s&o# isto é# quanto a execuç&o de um método estárrelacionada Y execuç&o de outro/s0 método/s0.
ideal é ter acoplamento %rouxo /loose coupling 0 e n&o um
acoplamento r(!ido /tight coupling 0 que torna di%(cil depurar cdi!o.
Existe uma lon!a disputa soAre qual é o taman)o ideal para métodos:Muitos ac)am que devemos nos restrin!ir a uma única pá!ina# no máximo
Muitos ac)am que vários pequenos métodos podem diminuir a le!iAilidade docdi!o.
\s ve$es# métodos lon!os s&o Aons# desde que possuam uma unicidade l!ica.
Luia para definir métodosLuia para definir métodos
8/17/2019 Java Aula04
30/46
5assagem de 5ar9metros5assagem de 5ar9metros Parâmetros para métodos Java são passados sempre por valor.
Isto significa que uma c ó pia do valor passado será usado pelos
métodos, não a variável real.
A passagem por referê ncia nunca é feita no Java.
Qualé a vantagem de se passar um objetose não pudermos modificar seus atributos?
8/17/2019 Java Aula04
31/46
Nós nunca passamos um objeto, mas sim uma referê ncia
para um objeto, e a referência é passada por valor.
Na statement Java Button b = new Button(); a variável b
não é um objeto, mas sim uma referência a um objeto (daí o
termo variável de referência, encontrável em muitos livros).
5assagem de 5ar9metros5assagem de 5ar9metros
8/17/2019 Java Aula04
32/46
Seja o método declarado por
public void métodosX(Button y) {...}
Se nós chamarmos este método passamos uma referência a
um botão, o que acontece exatamente?
Button b = new Button();
métodosX(b);
5assagem de 5ar9metros5assagem de 5ar9metros
8/17/2019 Java Aula04
33/46
O valor de b é passado por valor e a variável y dentro do
método métodosX recebe uma cópia deste valor. As variáveis b e y agora têm o mesmo valor?
Quando duas variáveis de referência têm o mesmo valor, isto
quer dizer que elas se referenciam a um mesmo objeto.
5assagem de 5ar9metros5assagem de 5ar9metros
Logo, dentro de métodosX nós podemos atualizar o objeto através da
variável de referência y.
8/17/2019 Java Aula04
34/46
+m oA-eto pode ter múltiplas re%er,ncias a ele >a mesma maneira que uma área de memria pode ser apontada por vários
ponteiros. >a mesma maneira que ns respondemos quando nos c)amam de várias
maneiras di%erentes /por nomes# apelidos# psiu# etc.0 "o!o# neste exemplo existe apenas um oA-eto sendo re%erenciado por duas
variáveis de re%er,ncia distintas Be mudarmos o valor da variável 5 dentro de métodos ela passará a re%erenciar@
se a outro oA-eto:
5 ; neN ]utton/Vanot)er AuttonV0U Mas# como A %oi passado por valor# ele permanecerá inalterado re%erenciando@se ao
mesmo oA-eto de quando iniciamos o método.
5assagem de 5ar9metros5assagem de 5ar9metros
8/17/2019 Java Aula04
35/46
Jari'veis de AlasseJari'veis de Alasse
*lgumas ve7es 4ueremos uma 3nica cEpia de uma vari'vel ?ava não permite 4ue usemos vari'veis globais (toda vari'vel
deve existir dentro de uma classe) ?ava usa a palavra c8ave static para indicar uma variável de
classe versus uma variável de instância * vari'vel de classe sempre pode ser usada% mesmo 4uando a
classe nunca é instanciado 5ara acessar vari'vel de classe% use o nome da classe
!x" public static final double PI = 3.14159;public static int numCircles;
8/17/2019 Java Aula04
36/46
Jari'veis de AlasseJari'veis de Alasse
+ea a classe Alasse$% 4ue tem a vari'vel static (de classe x)
+upon8a 4ue existam dois obetos ob$ e ob& da classe Alasse$e nEs fa7emos"
classe1.x=1;
obj2.x=2;
obj1.x=3;
/uanto vale ob&x0
8/17/2019 Java Aula04
37/46
Jari'veis de AlasseJari'veis de Alasse
@m diagrama exato do 4ue acontece é"
A-1 A-2
12*
Gepois de classe1.x=1;Gepois de obj2.x=2;
Gepois de obj1.x=3;
6 atributo alterado é sempre omesmo Não 8' dois atributos
diferentes para os obetos ob$ e ob&C
x x classe1classe1
8/17/2019 Java Aula04
38/46
Métodos deMétodos de classeclasse !xemplo" Math.sqrt();
Math é o nome da classe e sqrt() é o nome do método daclasse(ou método est'tico)
+ão e4uivalentes a métodos HglobaisI% mas sem 8aver c8ancede conflitos com nomes F'cil de entender" pense no nome do método como o HnomeI e o nome
da classe como o HsobrenomeI
+ão similares Bs vari'veis de classe
+E existe uma inst9ncia deles (dentro da classe) e não v'riasdiferentes implementações (uma dentro de cada obeto)
8/17/2019 Java Aula04
39/46
Métodos deMétodos de classeclasseMétodos de classe s&o di%erentes dos métodos de inst^ncia pois
nos métodos de classe n&o existe uma re%er,ncia ao oA-eto corrente/variável de re%er,ncia this0"o!o# métodos de classe n&o podem se re%erir a nen)umainst^ncia nem invocar métodos de inst^ncia.
Math e System s&o classes que s de%inem métodos de classe pois n&o existe nen)um oA-eto conceitualmente apropriado.
Hamos discutir a variável de re%er,ncia this com cuidado mais Y %rente neste curso3
8/17/2019 Java Aula04
40/46
Dniciali7ador !st'ticoDniciali7ador !st'tico
Tanto as vari'veis de classe 4uanto Bs de inst9ncia podem ter
iniciali7adores associados Bs suas declarações s ve7es necessitamos iniciali7ações mais complexas em
?ava isto é feito através da utili7ação de métodos deiniciali7ação para vari'veis de classe c8amados inicializadores
estáticos Gado 4ue o iniciali7ador est'tico é c8amado apenas uma ve7
4uando a classe é carregada (antes de 4ual4uer execução)%não 8' necessidade de argumentos ou valores de retorno
Um inicializador de instância é exatamente igual a uminiciali7ador est'tico% mas sem a palavra c8ave static !leroda 4uando uma inst9ncia é criada
8/17/2019 Java Aula04
41/46
Dniciali7adoresDniciali7adores !xemplo"
public class Alasse$ O
int x#&P
final int Q@FF!KR+DS!#.P
static int y#,P
static doubleU buffer#ne= doubleQ@FF!KR+DS!UP
static O
for (int i#;PiVQ@FF!KR+DS!Pi
8/17/2019 Java Aula04
42/46
!scopo!scopo 6 escopo de uma vari'vel é a região do programa onde cada
vari'vel pode ser referenciada apenas pelo seu nome 6 escopo também determina 4uando o sistema aloca e libera o
espaço de memEria para a vari'vel 6 escopo é diferente do conceito de visibilidade de 66
Jisibilidade aplica-se apenas a vair'veis membros (atributos) e determinase uma vari'vel pode ser usada fora da classe em 4ue foi declarada
Jisibilidade é definida com um modificador de acesso
Hamos ver o conceito de visiAilidadecom Aastante cuidado quandodiscutirmos a implementaç&o dosconceitos de
8/17/2019 Java Aula04
43/46
!scopo!scopo local da declaraç&o da variável dentro do pro!rama estaAelece seu
escopo# colocando@a em uma das se!uintes cate!orias: variável memAro /atriAuto0 variável local par^metro de método par^metro de tratador de exceç&o
8/17/2019 Java Aula04
44/46
!scopo!scopo @ma vari'vel membro (atributo) é um membro de uma
classe ou de um obeto" X declarada dentro da classe mas fora de 4ual4uer método * sua declaração tem 4ue aparecer antes do seu uso 4uando usada
em uma expressão de iniciali7ação +eu escopo é toda a classe
Jari'veis locais são declaradas dentro de blocos de cEdigo +eu escopo se estende da sua declaração até o fim do bloco de
cEdigo ond eé definida (prExima c8ave)
!
8/17/2019 Java Aula04
45/46
!scopo!scopo 5ar9metros são argumentos formais de métodos ou
construtores e são usados para passar valores para estes 6 escopo do par9metro é todo o método ou construtor para o 4ual ele é
passado
5ar9metros de tratadores de exceção são similares aos
par9metros dos métodos 6 escopo de uma par9metro de um tratador de exceção é o bloco de
cEdigo entre as c8aves 4ue seguem o catc8
Hamos ver amAos com mais detal)esquando discutirmos métodos etratamento de erros.
!
l d !
8/17/2019 Java Aula04
46/46
!xemplo de !scopo!xemplo de !scopo +ea o seguinte exemplo"
if (...){
int i = 17;
...
}
System.out.println("The value of i = " + i);
* lin8a final não vai compilar pois a vari'vel local i est'fora do escopo
6u move-se a declaração para fora do bloco do if ou ométodo println é movido para dentro deste bloco