curso java 16.01.2013
DESCRIPTION
javaTRANSCRIPT
1
Universidade Estadual do Piauí -‐ UESPI Centro de Tecnologia e Urbanismo -‐ CTU III Oficina de Férias Curso de Programação JAVA Ministrante: Prof. Msc. Guilherme Enéas Vaz Silva
Aula 16.01.2013
3. Começando a programas em Java -‐ continuação
-‐ Conforme discutido na aula anterior, vamos iniciar nossa programação em Java utilizando o bloco de notas e as linhas de comando do DOS. Para mostrarmos a lógica de compilação e execução, vamos escrever a classe HelloWorld no bloco de notas e salva-‐la como HelloWorld.java
class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); }
}
-‐ Digamos que você tenha instalado o JDK em C:\Java\jdk e o programa acima em C:\Java\programas (e, de forma similar, o JRE em C:\Java\jre). Para compilarmos nosso HelloWorld devemos abrir o prompt de comando e utilizar o comando javac. Para execução utilizamos o comando java. Observe: -‐ Na aula anterior foi passado um exercício referente à criação do modelo Data. Convertendo o modelo para uma classe em Java, teríamos:
2
class DataSimples { byte dia, mês; short ano; void inicializaDataSimples(byte d, byte m, short a) { if dataÉVálida(d,m,a) { dia = d; mês = m; ano = a; } else { dia = 0; mês = 0; ano = 0; } } boolean dataÉVálida(byte d, byte m, short a) { if ((d >= 1) && (d <= 31) && (m >= 1) && (m <= 12)) return true; else return false; } void mostraDataSimples() { System.out.print(dia); System.out.print(“/”); System.out.print(mês); System.out.print(“/”); System.out.print(ano); } } -‐ Escreva o código acima no bloco de notas (escreva o código linha a linha, evite copiar e colar) e compile. Note que estamos criando apenas uma classe, não tem método main(), logo não devemos executá-‐la. -‐ Vamos criar objetos (instâncias) da classe DataSimples. Para isso, abra um novo documento no bloco de notas e escreva a seguir. Salve o arquivo como DemoDataSimples.java, compile-‐o e execute-‐o. Observe o resultado.
Exercício 1: Faça o que se pede: a) Coloque uma data não válida. Ao executar o programa, o que vai acontecer? b) Crie uma segunda instância (objeto) da classe DataSimples, a inicialize com a data do seu aniversário e em seguida a mostre.
!"#$%&'("')#*+#&',#+-+./(&'("'0"%"*+#/'1'!),0'2/.34(/("'("'!+5#.+/*'637/#/*8'9/:("8');/$/*'"'<3%=(+./*'("'0"%"*+#/'!3%*&>'!+5#.+/'(/'!&7?3$/@A&'B+*.+?4+#/>'C4D&%+$7&*'"'E%&D%/7/@A&'FF'''E%&-"**&%'>'G3+4H"%7"')#I/*'J/K'9+4L/''
'C34/'MMNOPNMOQQ'
'!"#$%&'()*+%#)#,-%.-)&)/#'�)1)#2#3%*45*6)(7%''' R'J/7&*'.%+/%'&ST"$&*'(/'.4/**"'8)4)95&,:'/N'' R'CS%/'&'S4&.&'("'#&$/*'"'.&?+"'&'.U(+D&'/'*"D3+%N'9/4L"'&'/%V3+L&'.&7&'8'&%8)4)95&,:'/N;)1)8'.&7?+4"R&'"'";".3$"R&N'WS*"%L"'&'%"*34$/(&N''
3:)//#8'&%8)4)95&,:'/#<####,6=:53#/4)453#1%5+#&)5*>94-5*.?@#)-.6&'*4%/A#<# ### 8)4)95&,:'/#B%;'#C#*'D#8)4)95&,:'/>AE# # ## ## =F4'#6&85)G6&HI/E#/B%-4#6&J*%E## 6&85)#C#KKE#6&HI/#C#LE#6&J*%#C#KMNNE# ## ## B%;'"5*535):5O)8)4)95&,:'/>6&85)G6&HI/G6&J*%AE# # ## B%;'"&%/4-)8)4)95&,:'/>AE# # # # # ####P#P#
'' QR'-3S35%#NT'2/@/'&'V3"'*"'?"(">'' )A'!&4&V3"'37/'(/$/'*7%'LX4+(/N'C&'";".3$/%'&'?%&D%/7/8'&'V3"'L/+'/.&#$"."%Y'' =A' !%+"' 37/' *"D3#(/' +#*$Z#.+/' [&ST"$&\' (/' .4/**"'8)4)95&,:'/8' /' +#+.+/4+K"' .&7' /' (/$/' (&' *"3'/#+L"%*X%+&'"'"7'*"D3+(/'/'7&*$%"N''']NQ' ^&(+-+./(&%"*'("'/."**&'' R' !&7&' (+*.3$+(&' /#$"%+&%7"#$"8' 37/' (/*' ?%+#.+?/+*' L/#$/D"#*' (&' ?/%/(+D7/' &%+"#$/(&' /'&ST"$&*'I'/'?&**+S+4+(/("'("'"#./?*34/%'./7?&*'"'7I$&(&*'./?/K"*'("'7/#+?34/%'"**"*'./7?&*'"7'37/'.4/**"N' _' ("*"TXL"4' $/7SI7'V3"' &*' ./7?&*' (/*' .4/**"*' *"T/7' &.34$&*' (&*' ?%&D%/7/(&%"*' ?/%/' "L+$/%'7/#+?34/@A&'(+%"$/'"7'L"K'("'?&%'+#$"%7I(+&'(&*'7I$&(&*'(/'.4/**"'' R'E/%/' +#+.+/%'#&**&*'"*$3(&*'/'%"*?"+$&'(&*'7&(+-+./(&%"*'("'/."**&8'L/7&*' +#*"%+%'&'*"D3+#$"'$%".H&'("'.U(+D&'#/'.4/**"'8'&%8)4)95&,:'/>''
# B%;'"+5)#C#ME## B%;'"&I/#C#NE## B%;'")*%#C#KMMNE## B%;'"&%/4-)8)4)95&,:'/>AE##'
' 2/K"#(&' +**&' #U*' "*$/7&*' /4$"%/#(&' (+%"$/7"#$"' &*' /$%+S3$&*' (&' &ST"$&'B%;'N' E"%."S/' V3"' /'(/$/'#A&'I'LX4+(/8'?&%I78'/&'";".3$/%'&'?%&D%/7/8'&'V3"'L/+'/?/%"."%Y'''' R' E/%/' "L+$/%' ?%&S4"7/*' ("**"' $+?&8' 3*/%"7&*' 7&(+-+./(&%"*' ("' /."**&N' F#+.+/47"#$"8' L/7&*'/?%"#("%'(&+*'7&(+-+./(&%"*>'
3
3.1 Modificadores de acesso -‐ Como discutido anteriormente, uma das principais vantagens do paradigma orientado a objetos é a possibilidade de encapsular campos e métodos capazes de manipular esses campos em uma classe. É desejável também que os campos das classes sejam ocultos dos programadores para evitar manipulação direta em vez de por intermédio dos métodos da classe. -‐ Para iniciar nossos estudos a respeito dos modificadores de acesso, vamos inserir o seguinte trecho de código na classe DemoDataSimples:
hoje.dia = 0; hoje.mês = 1; hoje.ano = 2001; hoje.mostraDataSimples();
Fazendo isso nós estamos alterando diretamente os atributos do objeto hoje. Perceba que a data não é válida, porém, ao executar o programa, o que vai aparecer? -‐ Para evitar problemas desse tipo, usaremos modificadores de acesso. Inicialmente, vamos aprender dois modificadores: a) public – o campo ou método da classe declarado com esse modificador pode ser acessado ou executado a partir de qualquer outra classe b) private – o campo ou método declarado com esse modificador só pode ser acessado, modificado ou executado por métodos da mesma classe, sendo oculto quando o programador usar instâncias dessa classe ou criar classes herdeiras ou derivadas -‐ Na classe DataSimples, vamos declarar os três atributos como private (por exemplo: private short ano;). Salve a alteração na classe DataSimples e a compile novamente. Agora, tente executar a classe DemoDataSimples, o que aconteceu? -‐ Dessa forma, estamos protegendo os campos (atributos) da classe DataSimples! -‐ Por outro lado, os métodos geralmente são declarados como públicos! Altere a classe DataSimples de forma que todos os métodos sejam public (observe que, nesse caso, nenhuma mudança deve ser observada) -‐ Bom, digamos agora que queiramos ver o valor somente do campo dia (ao invés do formato dia/mês/ano). Podemos criar o seguinte método na classe DataSimples:
public byte retornaDia() { return dia; }
O método retornaDia(), ao ser chamado, retorna o valor do dia em questão! Para testar esse método vamos até a classe DemoDataSimples para escrever o seguinte código:
System.out.println(hoje.retornaDia());
O comando acima está mandando escrever o retorno do método retornaDia() do objeto hoje. Dúvida: o código abaixo funcionaria? Por quê?
System.out.println(hoje.dia);
Exercício 2: Faça métodos de retorno semelhante para o mês e o ano e teste-‐os. -‐ Para finalizar, imagine que queiramos criar um método que recebe uma instância da própria classe DataSimples como argumento e verificar se a data representada pela classe e pela instância que
4
foi passada é a mesma. Observe-‐o abaixo com atenção! Em seguida, incorpore esse método à classe DataSimples.
' ' /\' ,6=:53' 1' &' ./7?&' &3'7I$&(&' (/' .4/**"' (".4/%/(&' .&7' "**"'7&(+-+./(&%' ?&("' *"%'/."**/(&'&3'";".3$/(&'/'?/%$+%'("'V3/4V3"%'&3$%/'.4/**"'' ' S\',-51)4''1'&'./7?&'&3'7I$&(&'(".4/%/(&'.&7'"**"'7&(+-+./(&%'*U'?&("'*"%'/."**/(&8'7&(+-+./(&' &3' ";".3$/(&' ?&%' 7I$&(&*' (/' 7"*7/' .4/**"8' *"#(&' &.34$&' V3/#(&' &' ?%&D%/7/(&%' 3*/%'+#*$Z#.+/*'("**/'.4/**"'&3'.%+/%'.4/**"*'H"%("+%/*'&3'("%+L/(/*''' R'`/'.4/**"'8)4)95&,:'/8'L/7&*'(".4/%/%'&*' $%5*'/$%+S3$&*'.&7&',-51)4'' [?&%'";"7?4&>',-51)4'#/B%-4#)*%E\N' 9/4L"'/'/4$"%/@A&'#/'.4/**"'8)4)95&,:'/' "'/' .&7?+4"'#&L/7"#$"N'CD&%/8' $"#$"'";".3$/%'/'.4/**"'8'&%8)4)95&,:'/8'&'V3"'/.&#$"."3Y'' R' B"**/' -&%7/8' "*$/7&*' ?%&$"D"#(&' &*' ./7?&*' [/$%+S3$&*\' (/' .4/**"'8)4)95&,:'/a' E&%' &3$%&'4/(&8'&*'7I$&(&*'D"%/47"#$"'*A&'(".4/%/(&*'.&7&'?:S4+.&*a'C4$"%"'/'.4/**"'8)4)95&,:'/'("'-&%7/'V3"'$&(&*'&*'7I$&(&*'*"T/7',6=:53'[&S*"%L"'V3"8'#"**"'./*&8'#"#H37/'73(/#@/'("L"'*"%'&S*"%L/(/\'' ''' R'b&78'(+D/7&*'/D&%/'V3"'V3"+%/7&*'L"%'&'L/4&%'*&7"#$"'(&'./7?&'(+/'[/&' +#LI*'(&'-&%7/$&'(+/c75*c/#&\N'E&("7&*'.%+/%'&'*"D3+#$"'7I$&(&'#/'.4/**"'8)4)95&,:'/>''
# # ##,6=:53#=F4'#-'4%-*)85)>A#<## # # -'46-*#+5)E## ### ##P##'
' W'7I$&(&' -'4%-*)85)[\8' /&' *"%' .H/7/(&8' %"$&%#/'&'L/4&%'(&'(+/'"7'V3"*$A&a'E/%/' $"*$/%'"**"'7I$&(&'L/7&*'/$I'/'.4/**"'8'&%8)4)95&,:'/'?/%/'"*.%"L"%'&'*"D3+#$"'.U(+D&>''
# 9F/4'&"%64",-5*4:*>B%;'"-'4%-*)85)>AAE#'
' W'.&7/#(&'/.+7/'"*$X'7/#(/#(&'"*.%"L"%'&'%"$&%#&'(&'7I$&(&'-'4%-*)85)[\'(&'&ST"$&'H&T"N'B:L+(/>'&'.U(+D&'/S/+;&'-3#.+&#/%+/Y'E&%'V35Y'' '
' 9F/4'&"%64",-5*4:*>B%;'"+5)AE'' '
' QR'-3S35%#K>'2/@/'7I$&(&*'("'%"$&%#&'*"7"4H/#$"'?/%/'&'75*'"'&'/#&'"'$"*$"R&*N'' '' R'E/%/' -+#/4+K/%8' +7/D+#"'V3"'V3"+%/7&*'.%+/%'37'7I$&(&'V3"'%"."S"'37/' +#*$Z#.+/'(/'?%U?%+/'.4/**"'8)4)95&,:'/'.&7&'/%D37"#$&'"'L"%+-+./%'*"'/'(/$/'%"?%"*"#$/(/'?"4/'.4/**"'"'?"4/'+#*$Z#.+/'V3"'-&+' ?/**/(/' I' /'7"*7/N'WS*"%L"R&' /S/+;&' .&7'/$"#@A&a' )7' *"D3+(/8' +#.&%?&%"' "**"'7I$&(&' d' .4/**"'8)4)95&,:'/N'''## ##=%%:')*#UV.6):#>8)4)95&,:'/#%64-)8)4)95&,:'/A#<## # 5W#>>+5)#CC#%64-)8)4)95&,:'/"+5)A#XX#>&I/#CC#%64-)8)4)95&,:'/"&I/A#XX#>)*%#CC#%64-)8)4)95&,'/")*%AA## ### # -'46-*#4-6'E## # ':/'## # # -'46-*#W):/'E## ##P##' '' W'$"*$"'("**"'7I$&(&'?&("'*"%'-"+$&'(/'*"D3+#$"'-&%7/'#/'.4/**"'8'&%8)4)95&,:'/>''
# 5W#>B%;'"UV.6):>5*+','*+I*35)8%Y-)/5:AA## ####9F/4'&"%64",-5*4:*>ZJ/#+)4)/#/7%#5.6)5/ZAE## ':/'## ####9F/4'&"%64",-5*4:*>ZJ/#+)4)/#/7%#+5W'-'*4'/ZAE#'
-‐ O teste desse método pode ser feito da seguinte forma na classe DemoDataSimples (considerando meuNiver um objeto da classe em questão): if (hoje.éIgual(meuNiver)) System.out.println(“As datas são iguais”); else System.out.println(“As datas são diferentes”); -‐ Para reforçar a idéia de referências e instâncias e para conhecer a palavra-‐chave null, vamos analisar a classe Demo2DataSimples.
class Demo2DataSimples { public static void main(String[] argumentos) { // declaramos duas referências a instâncias da classe DataSimples não inicializadas DataSimples data1; DataSimples data2; DataSimples data5 = null; //inicializamos data5 com null //criamos duas instâncias da classe Data DataSimples data3 = new DataSimples(); DataSimples data4 = new DataSimples(); byte d,m; short a; //variáveis auxiliares d = 4; m = 3; a = 2011; data3.inicializaDataSimples(d,m,a); d = 11; m = 11; a = 2011; data4.inicializaDataSimples(d,m,a); //podemos ter duas referências para a mesma instância: data1 = data3; data1.mostraDataSimples(); //mostra 4/3/2011 //a linha abaixo resulta em erro, ja que nao tem instancia para a referencia data2.mostraDataSimples(); //a linha abaixo nao resulta em erro de compilacao, mas resulta em erro em tempo de execucao data5.mostraDataSimples(); } }
5
Detalhes importantes: -‐ Podemos criar inicialmente só referências às instâncias (data1 e data2) -‐ Podemos inicializar referências com null (data5) – a classe compilará, mas poderá dar erro em tempo de execução -‐ Podemos ter duas referências apontando para a mesma instância (data1 e data3) -‐ Caso uma referência não esteja associada a alguma instância, a classe não compilará (data2) Faça 1: Tente compilar a classe e verifique o erro referente à não inicialização de data2. Comente a linha, salve e compile novamente (é para compilar!). Agora, tente executar e verifique um novo erro (erro em tempo de execução ocasionado pelo fato de que data5 foi inicializado com null). Novamente, comente a linha em questão e salve. Observe que agora a classe irá executar normalmente. -‐ Na chamada do método inicializaDataSimples() podemos passar os argumentos diretamente utilizando a operação de cast. Faça 2: vide o exemplo abaixo (cast) e faça testes na classe. data3.inicializaDataSimples((byte)4,(byte)3,(short)2011); Exercício 3: com base nos modelos feitos em sala, faça:
a) Crie a classe Lampada e, e seguida, crie DemoLampada para teste. b) Crie a classe ContaBancariaSimplificada e, e seguida, crie DemoContaBancariaSimplificada
para teste.