Você está na página 1de 48
Declaragées e Controle de Acesso Objetivos para a rtificagéo: ™Declarar Classes e Interfaces M_Desenvolver interfaces e Closses Abstract M_Usar Primitivos, Arrays, Enums Identificadores Legais 1M Usar Métodos Static, Nomeagao JavaBeans e VorArgs WM Exorcicios Répidos P&R Teste Individual 2 Capitulo 1: Declaragées e Controle de Acesso. . [Nos partiremos do principio de que, uma vez que esti plancjando obter certficaslo, voe? ji sabe o basco de Java. Caso seja completamente inicante na linguagem, este capitulo ~e o estante do livzo ~ sera confuso, entio, certifique-se de que voc’ sabe pelo menos o bisico da linguagem antes de mergulhar neste lio, Dito isso, comesaremos com uma revisio para refrescar a sua memoria sobre Java, caso tena estado afastado da linguagem por algum tempo. Revisao de Java ‘Um programa em Java é principalmente uma colesio de objetos falando com outros objetos por meio da invocagio dos _nétodos uns dos outros. Cada objeto é de um tipo, e ese tipo édefinido por uma classe ou uma interface. A maioria dos programas em Java usa uma colecio de objetos de muitos tipos diferentes © Classe Lm modelo que desereve os ipos de estado ede comportamento que os objetos do se tipo podem tet. Objeto No momento da execusio, quando a Maquina Vireal Java (Java Vieual Machine, ou JVM) encontea a paavra _chave new, ela usa a classe apropriada para criar um objeto que sera uma instincia dessa classe. Esse objeto terio sett priprio estado e teri acesso a todos os comportamentos definidos pela sua classe. 1 Estado (variaveis de instancias) Cada objeto (instincia de uma class) teri. 0 seu conjunto tinico de varives de inseincias conforme definido na classe, Coleivamente, 8 valores atibuidos as varivels de instincias de um objeto compaem o estado do objeto. Comportamento (métodos) Quando um programador cra uma clase, ele cra méxodos para essa classe. E nos iictodos que ligia da classe ¢ armazenada, Nos métodos, o verdadcieo trabalho é realizado, Ti neles que os algoritmos sio executados e que os dados sio manipulados Identificadores e Palavras-chave ‘Todos os componentes de Java de que acabarnos de falar ~ classes, vaiivels e métodos ~precisam de nomes. Em fava, esses nomes sio conhecidos como identificadores e, como sera de se experar,exstem regras dizendo como dever seros ‘dentificadores Java permitidos. Independentemente do que é permitido, no entanto, os programadores Java (@a Sua) criaram convengies para a nomeagio de métodos, vais e clases, Como todas as linguagens de programagio Java tem, 1um conjunto de palavras-chaves interna. Essaspalavraschave nfo podem ser usada como identificadores. Mais adiante neste capitulo, veremos os dels sobre esas regase convengies de nomeacio,esobreaspalaras-chave Java. Heranga Fundamental para Javae outras linguagens orientadas a objetos €0 conceito de heranga, que permite a0 cédigo definido em ‘uma classe set eutilzado em outras classes. Em Java, vee pode definir uma superclasse geral (mais abstract.) depois «estendé-a com subclasses mais especificas. A superclasse no sabe nada sobre as classes que herdam dela mas todas as subelasses que herdam ca superelasse precisam declara explicitamente a relagio de heranca. Uma subclasse que heeda de uma superclase recebe automaticamente as variveis de instncias acessiveise os métodos definidos pela superclass, mas € também live para substitu métodos da superclase para definir comportamentos mais especificos. or exemplo, uma siperclasse Carro poderia definir métodos gerais comuns a todos os automévels, mas uma subclasse Ferrari poderia substtuir o método acelerar () Interfaces Um poderoso companheiro da heranga &0 uso das interfaces, A interface & uma espécie de superclasse 100% abstract _que define os métodos que uma subclasse deve suportat, mas nio como fsse suporte deve ser implementado, Em outras palavras, uma interface Animal podetia declarar que todas as classes de implementagio de Animal devem ter um método comer () , masa interface Animal nfo fornece nenhuma légica para o método comer (Isso significa que fica a cargo das classes que implementam a interface Animal a definiglo do c6digo pafa como cada tipo particular de Animal se comporta quando 0 seu método comer () éinvocado. Encontrando Outras Classes Como veremos mais adiante no lio, é uma boa idéia manter a coesio dag suas classes. Isso significa que cada classe deve tet ‘um conjunto bem definido de responsabilidad, Por exemplo, se fosse iar um programa de simulacio de um zool6gico, vocé representara javalis com uma classe, e visitantes do zoolégico com ofitra. Além disso, voeé poderia ter uma classe “Tratador de Animais, uma classe Vendedor de Pipoca e assim por diante. h questao é que voc’ nio deve ter uma classe que tenha comportamentos de Javalie Vendedor de Pipoca a0 mesmo temp (falaremos tais sobre isso no Capitulo 3). Até mesmo programas Java simples usam objetos de muitas classes diferdates:algumas que vocé criou, ealgumas crindas por outros (ais como as classes Java API cla Sun), Java organiza as classesfem pacotes, e usa declaragdes impox't para dar 0s programadores uma forma consistente de getenciar a nomeagio das chsses de que precisam e o acesso a eas. O exame aborda virios conceitos relacionados aos pacotes ea0 acesso a classes; exploraremos os detalhes neste eem outros capinalos. JAVAS 3 Objetivo para a Certificagéo Identificadores e JavaBeans (Objetivos 1.3 e 1.4) 1.3 Desenoler cbign gue declan, iniialgg «nse primitioos, arrays, enone objets como sarines static, de instinias¢ loai. Alem dito, mar identifeadors kegs para nomes de aries 14 Desenolercidigo que declare mitedor Static enarstatic «se gpmpriado, war nomes de métados que obedecam ans padres he nomagi JavaBeans, Alim dis, desenvolver cio que delaee se una lita de argumentor de extnsiovarivel Lembre-se de que, quando listamos um ou mais Objetivos para « Certificagio no liveo, como acabamos de fazer, isso significa que as secdes a seguir abordario pelo menos parte desses objetivos. Alguns objetivos serio abordados em vitios capitulos diferentes, de modo que vocé vera o mesmo objetivo em mais de um lugar do livro, Pot exemplo, esta secio cobre declaragdes, identificadores e nomeagio JavaBeans, mas 0 uso do que vocé vai declarar seri abordado em capitulos posteriores, Assim, comegaremos com os identificadores Java, Os trés aspectos dos identificadores Java que abordaremos aqui sio: Idenuificadores Legais As regras que 0 compilador usa para determinar se um dado nome é legal. HW Convengies de Cédigo Java da Sun As recomendagées da Sun para nomeacio de classes, variiveis e métodos, ‘Notmalmente nds obedecemos a esses padedes em todo o lvro, exceto quando estivermos tentando Ihe mostrar como seria uma questio dificil do exame, Nao Ihe sero feitas perguntas sobre as Convengdes de Cédigo Java, mas recomendamos enfaticamente que 0s programadores as user, 1 Padrdes de Nomeagiio JavaBeans Os requisitos de nomencio da especificacio JavaBeans, Nao é preciso estudara especifcacio JavaBeans para o exame, mas voce precisa saber algamas regras bisicas de nomeacao JavaBeans que abordaremos neste capitulo, Identificadores Legais ‘Tecnicamente, os identificadores leguis devem ser compostos apenas de caracteres Unicode, nimeros,simbolos de moedas € caracteres de conexio (como underscores), O exame niio mergulha nos detalhes de quais fixes do conjunto de caracteres Unicode quaificam como letras edigitos. Assim, por exemplo, voc’ no precisara saber que os digitos em Tibetano vito de \\u0420 até \uOE29, Bis aqui as regras que voeé precisa saber: Osidentifiadores devem comesar com ums letra, um cifrio ($) ow um caracter de coneaiio, como o underscore (__).Os identificadores nio podem comecar com um niimero! Depois do primeiro caracter, os identifcadores podem conter qualquer combinacio de letras, caracteres de moedas, caracteres de conexio ou nimeros. Na pritica, no hi limite para o ntimero de caracteres que um identficador pode comer. Nao se pode usar uma palavra-chave Java como identificador. A Tabela 1-1 lista todas as palavras-chave Java, incluindo ‘uma novidade da versio 5.0, enum. Osidentificadores em Java sio case-sensitive; fo0 ¢ Foo sao dois identifiadores diferentes Seguem alguns exemplos de identficadoreslegai ilegais; primeiro, idemtiicadores legis int ay int $e; int ___2 wr int _$; Ant eis um_nome_bastante_detalhado_para_um_identificador; ‘Os seguintes sioilegais (agora voe® ja sabe 0 por qué) int 1) Thread.yield(); } systen.cut.print (14° *); } 9. public static void main(string(] args) ( 10. Wombat n = new Wombat () LL. for(int x=100; x20; x) { new Thread(n).start(); } 2.}} Considere-se avisado —voc# veri vias lstagens de cédigos, questies simuladas e questdes de exames reais que serio doentias eincompreensiveis dessa maneira, Ninguém quer que vocé escreva seu cédigo deste jeito, Nem o seu empregador, ‘nem os seus colegas de trabalho, nem nés, nem a Sun e nem a equipe de elaboragio do exame! Esse tipo de eédigo foi ctiado apenas para que conceitos complexos pudessem ser testados usando-se uma ferramenta de provas universal, Osinico padsio que é seguido tanto quanto possivel no exame real £0 dos padres de nomeagio. Bis os padrdes de nomeacao recomendados pela Sun, e que usamos no exame e na maior parte do livro: Classes e interfaces A primeira letra deve ser maiiscula ¢, se visas palavtas forem escrtas juntas para formar o nome, a primeira letra de cada palavra intema deve ser maiiscula (um formato chamaclo em inglés de “camelCase”). Para classes, ‘0s nomes devem normalmente ser substantivos. Por exemplo: Dog //Cachorro Padrées JAVA 5 5 Account //Conta PrintWriter //Impressora Para interfaces, os nomes devem normalmente ser adjetivos, como: Runnable //Executével Serializable //Serializével Ml Métodos A primeira letea deve ser miniscula,¢ depois as regras camelCase normais devem ser usadas. Além disso, 0s ‘nomes devem normalmente ser pares de verbo-substantivo. Por exemplo: getBalance //obterfialango docalculation //fazercalculo setCustonerNane //definirNomeDoCliente Varidveis Como nos métodos, o formato camelCase deve ser usado, comegando com uma letra mindscula. A Sun ecomenda usar nomes curtos signficativos,o que nos parece uma bos idéia. Alguns exemplos buttonwidth //LarguraDoBotao accountBalance //balangoDaConta myString //minhastring Constantes As constantes Java sio criadas marcando-se variéveis como static ¢ £ inal. Elas devem ser nomeadas tusando-se letras maiisculas com caracteres underscore como separadores: MIN_HEIGHT //ALTURA_MINIMA JavaBeans A especificagio JavaBeans foi crada para ajudar os desenvolvedores a criarem componentes Java que possam set facilmente usados por outros desenvolvedores em uma ferramenta de Ambiente de Desenvolvimento Integrado (“Integrated Development Environment, ou IDE), como o Eclipse ou o NetBeans. Como um programador Java, vocé desejari usar componentes da API Java, mas sera excelente se vocé pudesse também comprar 0 componente Java que quisesse no “Mercado Beans”, aquela loja de software que fica na sua rua. E, depois de encontrar os componentes, vocé gostaria de poder acessi-los através de uma ferramenta de desenvolvimento de forma tal que nfo precise escrever todo 0 seu cddigo do zero, Ao usar regras de nomeasio, a especificacio JavaBeans ajuda a garantie que as ferramentas poderio reconhecer e usar ‘componentes criados por diferentes desenvolvedores, A API JavaBeans 6 um tanto complexa, mas vocé s6 precisaréestudar alguns fundamentos para 0 exame. Primeiramente, JavaBeans slo classes Java que tém propricdades. Para os nossos propésitos, pense nas propriedades como vatiiveis de instincias private, Uma vez que sio private, a nica maneira pela qual podem ser acessadas de fora da sua classe é através de métodos da classe. Os métodos que modificam o valor de uma propriedade sio chamados métodos setter, €-08 métodos que obtém o valor de uma propriedade sio chamados métodos get ter. As regras de nomeagio JavaBean que voce precisa saber par o exame Slo as seguintes: Regras de Nomeagio de Propriedades JavaBean 1 9¢ t , Sele 'S Se a propriedade nio for booleana, 0 prefixo do método get ter deve ser get, Por exemplo, getSize() éum nome get ter JavaBeans vilido para uma propriedade chamada “size.” Tenha em mente que voce aio precisa ter uma variével chamada Size (embora alguns IDEs vio esperar que voe® tena). O nome da propriedade ¢ inferido a partir dos getters csetters, enioatravés de quaisquer vasiaveis da sua classe. O que vocé iri retomara partir de get Size () ficaa senceitéio, Sea propriedade for booleana, o prefixo do método getter éouget ou is. Por exemplo, tanto getStopped () quanto isStopped() sio nomes JavaBeans vilidos para uma propriedade boolean. 1 Oprefixo do método setter deve ser set. Por exemplo, set Size () ¢0 nome JavaBean vilido para uma propriedade chamada size. Para ter.o nome completo de um mérodo get ter ou Set tex, passe a primeira letra do nome da propriedade para rmaidscula e depois anexe o prefixo apropriado (get, is ou set). As assinaturas de métodos setter devem ser marcadas como publ ic, com um tipo de retorno void eum angumento que represente o tipo da propriedade. As assinaturas de métodos get ter devem ser marcadas como public, nfo usar argumentos ¢ ter um tipo de retorno que bata com o tipo do argumento do método setter para a propriedade em questio. [Em segundo lugar, a especifcagio JavaBean tem suport a vents, 0s quais permitem aos componentes notificazem uns 20s ‘outros quando algo acontece. O modelo de eventos geralmente é usado em aplicagdes GUI quando um evento, como um. clique do mouse, é comunicado paca muitos outros objetos que possam ter coisas a fazer quando ocorre urn clique do SERIO 1s MRRIUTOGOES © SONITONE CE ANCESSO- ‘mouse. Os objetos que recebem a inforragio de que ocorreu um dado evento so chamaclos de listeners, Para o exame, voc’ precisa stber que os métodos usados para adicionar ou remover listeners de um evento devem também seguir padres de nomeagio JavaBean: Regras de Nomeacao de Listeners JavaBean Os nomes de mécodos listeners usados pun “egistrat” um listener com uma fonte de eventos devem usar 0 prefixo add, seguido do tipo do listener. Por exemplo, addAct ionListener () ¢um nome vilido para um método que tuma fonte de eventos deverd permit a outros registrarem para eventos Act fon, 4 Nomes de métodos listeners usados para remover (“desregistrar”) um listener devem usar o prefixo remove, seguido do tipo do listener (usando-se as mesmas regras que o método add de registro). 8 O tipo de listener a seradicionado ou removido deve ser passado como o argumento pata 0 método. Alguns exemplos de assinaruras de métodos JavaBean vilidas public void setmyValue(int v) public int getmyvalue( public boolean isMyStatus() public void addMyListener (MyListener m) public void renoveMyListener (MyListener m) Allguns exemplos de assinaturas de métodos JavaBean invdidas void setCustonerNane (String s) // precisa ser public Public void modifytyValue (int v) // no se pode usar ‘modify’ public void addxListener(MyListener m) // erro de tipo de listener OBSERVAGOES PARA O EXAME ( objetivo 56 dl gue vac preciza saber os identifcadores ais para names de vars, mas as gras sa as mermas para TODOS or components Jana. Assim, mbes de que wo identifcador kal para wma varie! também élgal para nm método ou uma classe. Eontetanto 0c deve ditingai etre os idenfcadores legis eas convenes de nomeag, tas como os pares JaoaBeans, que indica somo sum determinado component Java deve ser nameado, Em outraspalsras, voc deve ser capac, de recntvcer que um dado idenifcador gal ‘mesmo que ee nose conforma padres de nomeaio. Sta guestan do exam ever Ibe perntando sobre consenies de nameaso— no somenie sem dada identifeador id compiler — os JanaBeans sero mencionadesexplitaments Objetivo para a Certificagéo Declarar Classes (Objetivo |.1 do Exame) 41 Desenobercigo que declare cases incindo lasses abst act: ¢ todas as formas de clases aninbadas), interlace erums,¢ Incr o-ws apropriade de delarares package ¢ import (ucluinds importa esta) Ao escreve cédigo em Java, vacé esti escrevendo classes om interfaces. Dentro dessas classes, como voce sabe, exstern Jgummas outras coisas). O modo como vocé declara as suas classes, mécodos e Variéveisafeta dramaticamente o comportamento do seu cédigo. Por exemplo, um mécodo public pode ser acessado a partir do cédigo que este rodando em qualquer parte da sua aplicagio, No entanto, se vocé marcat esse método como private, cle Aesaparecera de todos os radares (exceto o da classe na qual foi declarado). Para este objetivo, estudaremos as formas pelas ais vocé pode declarar e modificar (ou nfo) uma classe. Voeé percebera que abordatemos os modificadores em um aivel extremo de detalhe, ¢,embora salbamos que voce jé esti familarizado com eles, comegaremos pelo bisico. A maioria dos programadores Java pensa que sabe como todos os modificadotes funcionam, mas, ao examinar euidadosamente a questio, escobre que nio sabem (ou pelo menos nao no nivel exigido pelo exame). Existem sutis distingBes em toda parte, entio vocé precisa ter certeza absoluta de que domina totalmente todos os assuntos dos objetivos desta seco antes de fazer 0 variéveis e métodos (além d Regras de Declaracdo para Arquivos-Fonte Antes de mergulharmos nas declaragées de classes, fagamos uma breve revisio das regras associadas com adeclaracio de classes, declaragdes import e declaracdes package em um arquivo-fonte: JAVAS 7 1 S6pode haver uma classe public em cada arquivo de cédigo-fonte. Os comentitios podem aparecerno inicio ou no fim de qualquer linha no arquivo do c6digo-fonte; eles so independentes de quaisquer regras de posicionamento discutias aqui. Se houver uma classe publ ic em um arquivo, o nome do arquivo deve sero mesmo da classe public. Por ‘exemplo, uma classe declarada como public class Dog { } precisa estarem um arquivo de codigo-fonte chamado Dog. java. Sea classe fizer parte de um pacote, a declaracio package deve estar na primeira linha do arquivo do cédigo-fonte, antes de quaisquer declaragdes import que estejam presentes. IM Schouver declaragdes import, els devem fcar ena declaracio package (se houves) ea declaracio da classe. Sendo hhouver uma declaracio package, entio a(¢} declaracio(Ges) import deve(e) estar na(s) primeira(s) linha(s) do arquivo do cédigo-fonte. Se nio houver declaragSes package nem import a declaragio da classe deve estar na primeira linha do arquivo do cédigo-fonte WE Asdeclaragées import e package aplicam-se a fedaras classes dentro de um arquivo de cédigo-fonte, Em outras ppalavras, nio é possivel declarar miltiplas classes em um arquivo e t-las em diferentes pacotes, ow usar diferentes importagées. HE Um arquivo pode ter mais de uma classe nio-public. Arquivos que nfo tenbam classes pub] ic podem ter um nome que nio seja o mesmo de nenhuma das classes do arquivo, [No Capitulo 10, discutiremos mais detalhes sobre as regras envolvidas com a declaraglo ¢ 0 uso de importagoes, pacotes € ‘um recurso novo do Java 5, importagbes estiticas Declaragées e Modificadores de Classes ‘Embora classes aninhadas (freqientemente chamadas de internas)caiam no exame, deixaremos as declaragdes de classes aninhadas para o Capitulo 8, Voce vai adorar esse capitulo, Nic, séto, vai mesmo, O eddigo seguinte é uma declaragio de classe simples: class MyClass { } Esse cédigo iri compilat sem problemas, mas vocé pode também adicionar modificadores antes da declarago da classe. Os ‘modificadores se dividem em duas categorias: Modificadores de acesso: public, protected, private. Ml Modificadores que no se referem a acesso (ncluindo strict fp, final eabstract), _Examinaremos os modificadores de acesso primeiro para que vocé aprenda como restringir ou permitir acesso a uma classe {que crit. O controle de acesso em Java € um pouco complicado porque existemn quatzo controler de acesso (aiveis de acesso) amas apenas trés modfcadores de acesso. O quatto nivel de controle de acesso (chamado de acesso de Fault ou de para) Eo que voc’ abtém quando nio usa nenhum dos trés modificadores de acesso. Em outras palavras, toda classe, método ¢ variivel de instincia que voce declarar tem um controle de acesso, independentemente de vocé indicar um explicitamente ou ao, Embora todos os quatro contre de acesso (o que significa todos os trés modificadotes) funcionem para a maioria das declaragies de métodos ede vasiéveis, uma classe pode ser declarada apenas com acesso public ou default; os outros dois niveis de controle de acesso no se apicam para classes, como voc® werd adiante. AO TRABALHO Java é una inguagm entrada nos pacts 0s devenvabedoresassumiram que, para wna boa organiza con de exopo de nome cd prefer elocar fdas as suas cases em paca. Els etary cats, e oc dese fazer iso mesmo, Imagine o egintpesadle: tks dienes programadons, na mesma empress as tabaando em diferentes partes de am pie, escrevm cada wm ama classe chamada Uitte. Se esas rs clases ities no term sido declarada em nenbum pat expla, estore wo csipth voc nia fer senbura mania de der ao compilaor on JVM gual das rset tentando refienar. A Sam neomenda que os desensledores saem nomes de dominio reves, amexades como nme da dio « [ou do projet. Por exemple seo nome do ex dominio for eehsononymonscom,e exter trabathando no cio do cent para o programa TivelPointStps, vot daria ao seu paat nome amo comgeoksanonymos.sepcent. Tso modifcaria 0 ume daa case pars com geksanonymans.sps.nt thes. Anda csi, sued padeia ter colisies de momes dentro da sua empresa, sno moetar os sexs ripriosesquemas de mame, mas arantdamente nao bavrcolisies com cases deseaolbidas fore do sua empresa (asuminda gue elas gem a convey de nomeasio dt San sels nao from, bam, eas bastante desagradais dem aco Acesso a Classes (© que significa acessar uma classe? Quando dizemos que o cédigo de uma classe (a classe A) tem acesso a outra (classe B), {sso significa que a classe A pode fazer uma das seguintes coisas: Cain uma instinia da classe B. 8 Capitulo 1: Declaragdes e Controle de Acesso 1 Estendera classe B (em outeas palavras, tomnar-se uma subelasse da classe B), Mi Acesarcertos métodos e vasiiveis dentro da classe B, dependendo do controle de acesso desses métodos e vasiivels, [Na prtica, acesso significa nisbildade Se a clase A ndio puder sera classe Bo ntvel de acesso dos métodos e vasiéveis dentro da classe B nio fara diferenga;a classe A no ter’ como acessar esses métodos evasive ‘Acesso Default Uma classe comacesso default nio tem nenhum modificador precedendo-a na declaragiol Esse €0 controle de acesso que voeé obtém quando nao digita um modificador na declarasio da classe. Pense no acesso default como um acesso de nivel de pacote, porque uma classe com acesso default s6 pode ser vista por classes de denero do mesmo pacote. Por exemplo, sea classe A e a classe Bestiverem em pacotes diferentes, ea classe A tiver acesso default, a classe B no seri capaz de criar uma insténcia da classe A, e nem mesmo declarar uma vasiavel ou tipo de retorno da classe A, Na verdade a classe B precisa fingir que a classe A nem sequer existe, ou 0 compilador i reclamat. Observe o seguinte arquivo-fonte: package cert; clase Beverage { } Agora observe o segundo arquivo-fonte: package exam.stutt; import cert Beverage; class Tea extends Beverage { } Como vocé pode ver, a superclasse (Beverage) esti em um pacote diferente da subclasse (Tea). A declaragio import no alto do arquivo Tea esti tentando (cruze os dedos!) importa a classe Beverage. O arquivo Beverage compila sem problemas, ‘mas, quando tentamos compilar 0 arquivo Tea, obtemos algo como: can’t access class cert Beverage. Class or interface must be public, in same package, or an accessible menber class import cert Beverage; ‘Tea no compila porque a sua superclasse, Beverage, tem acesso default eesti em um pacote diferente. Fora usar nomes de classes totalmente qualificados, o que abordaremos no Capitulo 10, existem duas coisas que vocé pode fazer para consertat isto, Voc’ poderia colocar ambas as classes no mesmo pacate, ou poderia declarar Beverage como public, como escrito na seo seguinte ‘Quando vocé vir uma questio com légica complexa, certfique-se de olhar os modificadoses de acesso primeizo, Dessa forma, se descobrir uma violagio de acesso (por exemplo, uma classe do pacote A tentando acessar uma classe default do pacote B), voce saber que o e6digo nao vai compilar entio nio precisa nem se dar ao trabalho de tentar entender a Tgica. Afinal, vocé tem mais o que fazer com seu tempo ao fazer a prova, Simplesmente manque a resposta ‘A compilagio falha’e passe para a questio seguinte, Acesso Publico Uma declatacio de classe com a palavra-chave public dia todas as classes, de todos os pacotes, acesso a classe piblica. Em outras palaveas, odaras classes do Universo Java (JU) tém acesso a ums classe publica. No entanto, aio se esquesa, de que se uma classe piblica que estiver tentando usar estver em um pacote diferente do da classe que est ceserevendo, voc’ ainda precsariimportar a classe pblica. ‘No exemplo da seco anterior, talvez ndo queisamos colocat a subclasse no mesmo pacote que a superclaste, Para fazer o ceédigo funcionas, precisamos adicionar a palavra-chave publ ic na frente da declaracio da superclasse (Beverage), da seguinte forma: package cert; public class Beverage { } Isso modifica a classe Beverage para que ela se torn visivel a todas as classes em todos os pacotes, Essa classe agora pode ser instanciada a partir de todas as outras classes, e qualquer classe esti agora live para subclassificéla(estendera partir dela) —a nao ser quea classe esteja marcada também com o modificador Ena Ji falaremos sobre isso, Outros Modificadores de Classes (Nao-referentes a Acesso) Vocé pode modificar uma declaragio de classe usando as palavras-chave final, abstract, ou strict fp. Fsses ‘modificadores existem em adigdo a qualquer controle de acesso existente na classe, ento vocé poderia, por exemplo, declarar uma classe como public © final ao mesmo tempo. Mas nio € sempre que voc® pode misturar modificadores nio- referentes a acesso, Voce pode usar strict fp em combinacio com £ inal, por exemplo, mas nao deve nunca, jamais, ‘marcar uma classe como final eabstract ao mesmo tempo. Vocé veri por que nas duas proximas segs, ‘Voe® nio precisari saber como strict £p funciona, entio nos concentratemos apenas em modifica uma classe como final ouabstract. Para o.xame, vocé s6 precisa saberque strict fp éuma palavra-chave e que pode see usada para ‘modifiar uma classe ou um método, mas nunca uma varivel, Marcar uma classe como strict £P significa que qualquer cédigo de método na classe se conformari as regras do padrio IEEE 754 para pontosflutuantes. Sem esse modificadot, os JAVAS 9 ;pontos flutuantes usados nos métodos poderio se comportar de forma variante conforme a plataforma, Se no decarar a ‘classe como strict £p, ainda assim vocé poderi obter um comportamento strict fp para métodos especifcos, declarando 0 método como strict Ep. Se voc’ nio conhece o padtio IEEE 754, agora nio € 0 momento para aprendé-lo. ‘Vocé tem assuntos mais importantes para se preacupat. Classes Finais Quando usada na declaragio de uma classe, apalava-chave £ial significa que classe em questio aio pore cr subclasifiada, Em outraspalavmas, anhuma outa classe pode jamais estender(herdar de) uma classe final ¢ Gualquertentatvadefazéto lhe dard um erro de compilagi. Endo por que voc? sequer marcara uma classe como f inal? Afinal de conas sso no viola toda a nogo de heranga presente nas linguens orentadas a objetos? Voc’ s6 deve marcar uma classe como fina se precsar de uma gant tbsolua de que nenhum dos métodos dessa classe amas vai ser substinido, Caso seu cddigoseja profundamente dependent da implementagio de certs métodos, usar final. Ihe dari a seguranca de que ninguém poderk modifica « implementago sem voce stb. Vo perceberk qu muitas clases das bibliotecasfandamentas Jara sto £ na. Por exemplo, a classe Sting nfo pode ser subcsifica, Imagine a confusio que ocorteta se woc® no passe gaan forma como um objeto String funcionaia tm qualquer stema que exectase a su aplicagio! Sos programadoresGvessem a iberdade de extender laste Sting ( fssim coloearas suas nova instancis da subclase Stang onde esperamseinstincas de java lang tring), a ciizago tl como. conhecemos entraria em colapso. Assim, use £m. para seguranga mas apenas quando tver certeza de que asa classe final de ato j disse ado o que precisa ser dito nos seus mérodos, Marcar uma clasee como final. signiica,na Prtia, que a su classe nunca ser aprimorada ou mesmo modifcada para uso mais especific, por otro programador. Um benefciode se ter classes nio-£na. neste ceniro:imagine que vocéencontrou um problema com un metodo em ama classe que est usando, mis no tem 0 eddigo-fonte. Assim, voce no pode modifica a fonte para melhorar o método, ras pode esteniera classe e subtitur o metodo em questio na sua nova subcaste,esimplesmente war a subelasse em todas as ocasioes em que a sperclsse original for esperada, No entanto, ea csse for final entdondo hi nada que voce posta fare, Vamos modificaro nosso exemplo Beverage colocandoapalara-chave fina madecaragao package cert; public final class Beverage { public void importantiethod() { } ) Agora, se tentarmos compilaa subclass Tex package exam. stuff; import cert.Beverage; clase Tea extends Beverage { } Receberemos um erro comer can’t subclass final classes: class cort. Beverage class Tea extends Beverage( 1 error a pitca voce quase nunca cra uma classe £inal. As classes £mna.acsbam com um benefcio fundamental da programagio OO ~aextensbildade. Assim, ano ser que voc®tenha uma sia preocupacio de segurangs,assuma que flgum di algum outro programador presi estender a sua classe, Seno ofizer,oproximo programadr que for obrigado a fuzera manusengio do seu codigo iri Ie perseguire . Classes Abstract Ua classe abstract nio pode srinstanciada nunca, O seu nico propésito, miso na vids, ison Petre, @ ser estonia (onbcasifiad). (Repare no entanto, que vocé pode compilareexecutar uma casse abstract, ddesde que nio tent ear uma instania dela) Porque criar uma classe se vocénio pode rar objetoe dela? Porque a clase podeta cersimplesment, bem, abstract. Por excmplo, imagine que vocétenha wma classe Car que teak métodos, genéricos comans a todos os veculos. Mas voce nto quer que alguém de fto cre um objeto car genético, abstract. Como seiniilizariao sev estado? De que cor ele seria? Quantosascntos? Potencia do motor? Ditegiohideulica ou nto? (Ou, mais imporante, de que forma cle comportaria? Em outrs palavtas, como os métodos seriam implementados? (© que vocé preci € que os progeamadoresinstancem pos eis de caros, como BMWBoxster eSubaruOutback.Temos certerade que o dono de um Boxster he dia que o cnr dele capar de faze coisas que o Subaru apenas “sonha er fazer". Observe aseyuite lisse abstract: abstract class Car ( private double price; 10 Capitulo 1: Decloracées e Controle de Acesso private String model; yeivate String year; public abstract vold goFast (); public abstract void goUpHill (); public abstract void impressNeighbors (); // Coloque 0 reato do cédigo importante e sério aqui + (© cédigoacima ir compila sem problemas. Entrewnto, se voce tentarinstanciar um Car em outzo corpo de ebdigo, receberiertos de compiagio como o seguinte AnotherClass.java:7: class Car is an abstract clase. It can’t be instantiated car x = new Car(); 1 error Repare que os métodos mareados com abstract terminam com ponto-e-viegula, em vex de chaves. Procure questdes com uma declaragio de método que termine com ponto-e-virguls, em vee de chaves. Se o método estiver em uma classe ~ e no em uma interface ~, enti tanto 0 método como a classe devem ser marcados como abstract. ode aparecer uma questio que lhe pergunte como consertar uma amostra de cédigo que inclu um método que termina com ponto-e-virgula, mas sem um modificador abstract na classe ou método, Nesse caso, voc? podria ou marcar 0 método e a classe como abstract, ou modifcar o ponto-e-vitgula para o cédigo apropriado (um par de ehaves, por cexemplo). Lembre-se, se transformar um método de abstract. parando-abstract,, no se esqueca de trocar 0 ponto-e-viggula no final da declaracio do método por um par de chaves! Examinaremos os métodos abstract com mais detalhes mais adiante neste objetivo, mas lembre-se sempre de que, se mesmo um s6 mécodo for abstract, toda a classe deveri ser declarada como abstract. Um método abstract contamina toda a turma. Vocé pode, no entanto, colocar métodos nio-abstract em uma classe abstract. Por cexemplo, vocé poderia ter métodos corn implementages que nio devem mudar de acordo com o tipo de Cat, tals como getColor () ou setPrice().Aocolocar métodos nlo-abstract em uma classe abstract, vocé dé a todas as subelasses concretas (e conereto significa apenas nlo-albstract) implementagies de métodos herdadas. A boa noticia é {que as subclasses concretas herdam funcionalidades,e precisam implementar spenas os métodos que definem. comportamentos especificos da subelasse (A propésito,se voc’ achou que usamos a expresso rata dene fora de contexto, antesiormente, no nos mande e-mail Quetemos ver me colocar uma expressio dessas em um livro de certificagio para programadozes) Programac com tipos de classes abstract (incluindo interfaces, que serio discutides mais adiante neste capitulo) permite que vocé tire vantagem do polimorfismo, ¢ Ihe di o maior grau possivel de flexibilidade c extensibilidade. Voce aprender mais sobre polimorfismo no Capitulo 2, io possivel marcar uma classe como abstract e final 20 mesmo tempo, Elas tém significados quase opostos. ‘Uma classe abstract precisa ser subclassficad, enquanto que uma classe fina io deve ser subclasificada.. viressa combinagio de modificadores abstract e final, usados para uma declaracio de classe ou método, 0 io ini compile. Exercicio_1-1 Criando uma Superclasse Abstract e uma Subclasse Concreta Oseguinte exercicio testari o seu conhecimento de classes public, default, final eabstract .Crieuma superclasse abstract. chamada Fruite uma subclasse concreta chamada Apple. A superclasse deve pertencer a um pacote chamado food ea subelasse pode pertencer 20 pacote default (significando que cla nfo sera colocada em um pacore cexpliciamente). Tome a superclasse publice déa subelasse acesso default, 1. Criea superclass da seguinte maneira: package food; public abstract class Fruit{ /* insira qualquer cédigo que desejar */} 2. Cries subclasse em um arquivo separado, da seguinte maneira Amport food. Fruit; JAVAS 11 class Apple extends Fruit({ /* insira qualquer cédigo que desejar */} 3, Crie um direrério chamado food dentro do diret6tio configurado no seu class path. 4. ‘Tente compilar os dois arquivos. Se quser usara classe Apple, certfique-se de colocar o arquivo Fruit.clas 90 subdiretério food. Objetivo para a Certificagéo Declarar Interfaces (Objetivos I.1 e 1.2 do Exame) 1.1 Desomolerebigo que delare clases (inclaind clases absrate fads as formas de lasses aninbadas), interfaces ¢emana, inclta0 no on, para Booleanes, is ¢ t,¢foracem um Igar onde socé pode vrficare / en valida antes de tora on JAVA 5 19 smodificar nm valor Sem esa proeia,avarivel weight ("psa") de am objeto Cas, por exemple paderia se dfinida como um niomero gato caso 0 edigo ingpropriads tba asso dic d varie public, amo em somecat . weight =-20, Mas um meade de ano, set Weight (int we), podria vicar eo minaero&apropriads. (Ok, tudo ise xpcuaz, ma estamos partndo do priniiode que um esa negativo pode serinproprado para wm gate. Ox nia) O Capital 2 dian esa ratio de dades(ncapsalament) com mas detalles. £ possfvel um método private ser substimido por uma subclasse? Esta € uma pergunta interessante, mas a espost, tecnicamente,& no, Uma vez que a subclass, como vimos, no pode herdar um método private, ela, portato, nio pode substi o método a substiuigto depende da herana. Abordaremos as implicagSes disso com mais detlhes mais Sint nesta seq, bem como no Capito 2, mas, por agora basta lembrars de que um metoclo marca como Pe - ‘Yate aio pode sersubstul. A Figura 1-3 sta 0 efetos dos modificadores public e private em clses de tam mesmo ou de diferentes pacoes © etelto do controle de acesso privado Sportscar deo matte rast |) (- Superclasse doseute( )% ae oPast( 1 i convertible omingg ( Spotugear sc = new sportscar( + se-gebege (7 Subclasse , aomdee) gorapk , zl x geseuse( 1 JR “Sookekear car new sportscar 1s ceycobeeee | te con + new Convertible): mw Sue 1 Figura 1-3 Efeitos do acesso publico e privado ‘Tids formas de acessar um método: (D)nvocando um método declarado na mesma classe @) Invocando um método usando uma teferéncia da classe (© Tavocando um método herdado Membros Protect e Default Osniveis de controle deacesso protect default sio quase idénticos, mas com uma diferenga fundamental, Um membro default s6 pode seracessado se a classe que oestver acessando pertencer ao mesmo pacote, enquanto que um membro protect. pode ser acessado (através da heranca) por uma subclasse mesmo se a subclasse estiver em um pacote diferente, ‘Observe as das classes seguintes: package certification; public class otherClass { SU Copitulo |: Veciaragoes e Controle de Acesso- void testrt() { // 0 fato de nio haver modificador // indica acesso padre System. out .printin ("OtherClase") ; } Em um outro arquivo de eédigo-fonte voce tem o seguinte: package sonethingEise: import certification.otherClass; class AccessClass { static public void main(string{] args) { OtherClass o = new OtherClase(); o.testrt(); ) } Como pode ver, o método teat Tt () do primeito arquivo tem acesso padre (ou sea, de nivel do pac). Repate também _que a classe OtherClass se encontra em um pacote diferente de AccessClass. Seri que AccessClass podera usar método EestIt ()? Vai causarum erro de compilacio? Seri que o Daniel vai se casat com a Francesca? Nao perca os préximos ceapitulos, No method matching test ie () found in class certification.otherClass. o.testit(); Pelos resultados acima, vocé pode ver que AceessClass no pode usar o método test Tt () de OtherClass porque testrt () temacesso padtio, e AecessClas mio est no mesmo pacote que OtherClass. Assim, AccessClass nao pode vé- 1h, ocompilador reclama, ends nto temos nem ideia de quem sejam Daniele Francesca Oscomportamentos default ¢protect: diferem apenas quando falamos sobre subclasses. Se apalavta-chave protected forusada para definir um membro, qualquer subclasse da classe que faz a declracio pode acessi-loafranés da ‘eran. Nao faz diferenca se a superclassee a subclasseestio em pacotes diferentes, o membro da superclasse protect sinda estard visivel para a subclass (embora visivel apenas de uma forma bastante especifica, como veremos mais adiante). Isso contrasta com o comportamento padtio, que nao permite que uma subclaste acesse um membro da superclasse, ano serquea subclase esteja no mesmo pacote que a superclass, Enguanto que oacesso padtio nao estende nenhum consideracio especial is subclasses (ou voet esté no pacote ou ndo «sti),omodificedor protected respeita a relagio parent-child, até mesmo quando a clase child se desloce (junta-se a ‘um novo pacote) Assim, quando pensar em acesso padni, pense em restrges de parte. Sem exceges. Mas, quando pensar em protect, pense em pate + kids, Uma classe com um membro protect. esti marcando esse membro como tendo acesso de nivel do pacote para todas as classes, mas com uma exceso especial para Subclasses fora do pacote. Mas o que significa uma subclasse de fora do pacote te acesso-a um membro (parent da superclass? Significa que a subclasse herda 0 membro, Nio significa, no entanto, que a subclasse de fora do pacote posta acessar o membro usando uma referéncia a uma instincia da superchsse. Em outras palavnas, protect =heranga Protect. nio significa quea subdlasce poss raat ‘omembro protect. da superclasse como se ele fosse publ ic. Assim, sea subclasse de fora do pacote obtiver uma feferéncia a superclasse (cian, por exemplo, uma insincia da supercasse em algam luga no igo da subclasse),a subcasse ‘lo pode usa o operador ponto na referéncia i superclass para acessar o membro Protec. Para uma subclasse de forado ppacote, um membro protect. poderiada mesma forma ser default (ou mesmo privado), quando a subclass esté ‘usando uma referencia & supercasse.A subclasse s6 pode vero membro protect. através daheranga. Esti confuso? Nés também. Agiient firme e tudo ficari claro com a série de exemplos seguintes. (F ni se preocupe, na verdade, no estamos confusos. Estamos apenas tentando fazé-o se sentir melhor easo voct esteja confuso. Sabe, ipo nao ‘em problema se vocdestiver achando que nada faz sentido, e no € culpa sua. Ou seré que 2 ) Detalhes de protect. ‘Vamos dar uma olhada em uma variével de instin ‘membro) de uma superclasse. Protect (lembre-se de que uma vasivel de instincia ¢ um package certification; public clase Parent { protected int x = } (O cédigo acima dectara a vatiivel x como protected. Isso a torna aviriv/a todas as outta classes dentro do pacote certification, bem como hendive/por quaisquer subclasses de fora do pacote. Agora vamos criar uma subclasse em umm pacote // acesso protect JAVAS 21 diferente, ¢ tentar usar varidvel x (que a subclasse herd): package other; // Pacote diferente Amport certification. Parent; class Child extends Parent { public void testre() { syetem.out.peintin(t% is * +x); // Sem problema; child H1 nerda x ) (© cédigo acima compila sem problemas. Repate, no entanto, que a classe Child esté acessando a variivel protect: através da heranga, Lembte-se, sempre que falarmos de uma subclasse ter acesso a um membro de uma superclasse, poderiamos estar falando de a subclasse herdar o membro,e nao simplesmente acessi-lo através de uma referéncia a uma instancia da Superclasse (que é2 forma como qualquer outra nlo-subclasse o acessara). Repare no que acontece se subclasse Child (fora ddo pacote da superclase) tentar acessar uma variivel protect. usando uma referéncia classe Parent. package other; import certification. Parent; class Child extends Parent { public void testi) { systen.out.printin(*x is * +x); // Sem problema; Child J) nerda x Parent p = new Parent (); // Podenos acessar x usando // a refertncia a p? system.out .printin(* in parent is “+ p-x); // Brro de compilagao! } © compilador alegremente nos mostra qual éo problema ‘javac -d . other/Child. java other/Child. java:9: x has protected access in certification. Parent syatem.out.printin(*% in parent is * + p.x); a error |Até aqui estabelecemos que um membroprotect: tem, essencialmente acesso de nivel do pacote ou padsio a todas as classes, fexcetoas subclasses. Ji vimos que as subclasses de fora do pacote podem herdar um membro protect. Finalmente, jé vimos ‘que as subclasses de fora do pacote nfo podem usar uma referencia superclass para aessar um membroprotect. Para uma subclasse de fora do pacote, o membro protect. s6 pode ser acessado através da beranca. ‘Ainda hi mais uma questio que no consideramos... Qual éa aparéncia de um membro protect para outras classes que tentem usara subclasse de fora do pacote para obter o membro protect da superclasse que foi herdado pela subclasse? os exemplo, usando as nossas classes Parent/Child anteriores, o que acontece se uma outra classe ~ digamos, Neighbor. do mesmo pacote que Child (subelasse)tiver uma referéncia a uma instincia de Child e qucta acessara variavel-membro x? Em outras palavras, como esse membro protect se comporia depois que a subclasse o herdou? Ele mantém o sew status de protect, de forma tal que as classes no pacote de Child possam vé-lo? ‘Nao! Depois que a subclasse de fora do pacote herda o membro protect, ele (conforme herdado pela subclasse) torna-se private para qualquer cédigo de fora da subclasse, com 2 excecdo das subclasses dessa subclass. Assim, sea classe [Neighbor instanciar um objeto Child, entio mesmo se Neighbor estiver no mesmo pacote que Child, Neighbor nao teri aacesso A varivel x herdada (mas protect) por Child. Resumo da historia: quando uma subctasse de fora do pacote herda um membro protect, esse membro torna-se essencialmente private dentro da subclasse, de forma tal que apenas a ‘subelasse eas suas subclasses podem acessé-lo. A Figura 1-4 lustrao efeito do acesso protect. sobre classes ¢ subclasses no mesmo ou em diferentes pacotes. Caramba! Com isso terminamos protected, 0 modificador mais incompreendiddo em Java. Novamente, ele s6 € usado em casos muito especiais, mas pode rer certeza de que apareceri no exame, Agora que jd abordamos 0 modificador Pro ~ tected, passaremos para o acesso padrio, uma moleza comparsdo a protected. OL APNG Ns MECIONOGOSS 6 ONTONE CE ACESSO Detalhes de Default ‘Vamos comecar com 0 comportamento padtdo de um membro de uma superclasse, Modifiaremos 0 membro x de Parent para torné-lo default. package certification; public class Parent { int x= 9; // Auséncia de nodificadores de acesso // indica acesso paéro (de pacote) } Repare que ni colocamos umn modificador de acesso na frente da variivel x. Lembre-se de que, se voce no digit um. ‘modificador de acesso antes da declaracio de uma classe ou um membto,o controle de acesso € o padtio, o que significa de nlvel do pacote. Agora tentaremos acessar o membro padto da clase Child que vimos antetiormente, Se goFand to padido $e goFanid tr potgiao} Pacote A Pacoie A Facets A Pacote A (Csportscar ‘SportsCar ‘Sportscar SportsCar eran 1 0| || soranes 1(| || [eorase 1¢| | [protected gorase™ 10 ® @ (0) ? 2 Convertible ® ® Pacote 8 Pacote 8 [Pacote 6 Driver Convertible Convertible SY) Lt x © es Sw have gorest( yi ||. [domaings( )¢ = Seseahs'}1'||@ ["soocescas’ se « new spoesecar ,]|@] aera’)! erase 3! seigorane Cy ; : : y Onde goresté | mvecandogofasi) wardoseumefiee | veranda Deciarado na éncia a classe na qual goFast( fo! ‘goFasti) usando- mmeenacesse, | Gederaca Se uma Reteroncia | Sciae na cu sore 0 decrata Figura 1-4 Efeitos do ocesso protect ‘Quando compilarmos 0 arquivo Child, receberemos um erro parecido com este Child. java:4: Undefined variable: x systen.out.printin(*variable x is * + x); 1 error © compilador nos di'o mesmo erro de quando um membro é declarado como private. A subclasse Child (em um pacote diferente do da superclasse Parent) no € capaz de ver nem usar o membro padrio x da superctassel Agora, e quanto 40 acesso padtio para duas classes do mesmo pacote? package certification; public class Parent{ JAVA 5 23 int x } Ena segunda classe, vocé tem o seguinte // acesso padrao package certification; clase Child extends Parent { static public void main(String() args) { Child ec = new chid(); se.testre (); t public void testzt() { System.out .printIn(*Variable x is * + x); // Sem problemas } (© cédigo-fonte acima compila sem problemas, ea classe Child roda e exibe o valor ex. Basta se lembrar de que os membros padrio fam visiveis para as subclasses apenas Se cla estiverem no mesmo pacote que a superclass, Varlavels Locais e Modificadores de Acesso (Os modifiadores de acesso podem ser plicados a vasves loeais? NAO! ‘Nio existe nenbum caso em que um modificador de acesso possa ser aplicado a uma vasiével local, entio, cuidado com cédigo como o seguinte: lass Foo { void dostuft() { private int x= this -dotlore (x) ; } ) ode te certeza de que qualquer variével local declarada com um modificador de acesso nilo vai compilar. Na verdade, $6 existe um modificador que pode ser aplicado a wariéveis locais ~ final Isso termina a nossa discussio sobre modificadores de acesso de membros. A Tabela 1-2 mostra todas as combinagdes de acesso e visibilidade; é uma boa idéin passar algum tempo estudando-a, Em seguida, vamos passar para os outros ‘modifcadores (aio-teferentes a acesso) que voc® pode aplicar a declaragies de membros. ‘Tabela 1-2 Determinando a Acesso a Membros de Classes Visibilidade Public Protect Default Private Apartrda mesma classe Sim sim sim Sim Apantcde qualquer dlasse do mesmo pacote Sim Sim sim Nio A partic de uma subelasse do mesmo pacote sim Sim sim Nio Appar de uma subclasse de fora do mesmo pacote Sim Sit, ate Nio Nio da beranga A pantirde qualquer classe que no seja sim Nio Nio Nio ‘uma subelasse eesteja fora do pacote Modificadores Nao-Referentes a Acesso Ji discutimos 0 acesso a membros, o qual diz respeito a0 eddigo de uma classe pode invocar um método (owacessar uma vvariivel de instincia) a parcir de outra classe. Isso ainda nao inclui uma série de outros modificadores que vocé pode usar em. declaracies de membros. Dois dels j lhe io familiares ~ final e abstract -, porque nés os aplicamos a 24 Capitulo 1: Declaragées e Controle de Acesso: declaragdes de classes anteriormente neste capitulo. Mas ainda temos de dar uma ripida olhada em transient, syn- chronized, native, strict fp, ¢ depois uma longa olhada no grande modificador - static, ‘Veremos primeiro os modificadotes aplicados a métodos,seguidos pelos modificadores aplicados a variéveis de instincias. Fecharemos esta sego com uma olhada em como stat ic funciona quando aplicado a vasiéveis e métodos. Métodos Final A palavra-chave fina impede que um método possa ser substituldo em uma subclass, e feequentemente é usada para forgaros recursos API de um método, Por exemplo, a classe Thread tem um método chamado i SA1ive () que verificase ‘uma determinada thread ainda esti ativa. Se voe# estender classe Thread, no entanco, realmente nio ha como voce soziaho implementar corretamente esse método (ele usa cOdigo nativo, $6 para car uma das ra26es),entio os eaboradores 0 tomaram f inal. Assim como nao € possivel subclassficar a classe String (porque precisamos confiae no comportamento ‘de um objeto String), vocé no poderi substinuir a maioria dos métodos nas bibliotecas de classes fundamentais, Essa restrglo quanto & substitui¢2o propicia boa seguranca, mas vocé deve usé-la com muito cuidado. Impedi que urna subelasse substitua um método invalida muitos dos beneficios da orientacio a objetos, incluindo a estensibilidade através do polimorfismo. Uma declaragao de método final. tipica se pareceria com isto: class Superclass{ public final void showsample() ( System.out .printIn(*One thing." } E vilido estender SuperClass, uma vez que clase nio esté marcada como final, mas niio podemos substtuir 0 métedo final showsample (),comoo seguinte céxigo esti tentando fazer class SubClass extends Superciass{ public void showsample() { // Tentando substituir 0 método // final da superclasse System.out print In ("Another thing.) ; } Se tentar compilar o cédigo acima, vocé receberi uma mensagem como est Sjavac FinalTest java FinalTest .java:5 red in class ‘The method void showSample() deel SubClass cannot override the final method of the sane signature declared in class SuperClass. Final methods cannot be overridden public void showsample() ( } a error Argumentos Final Osargumentos de métodos sio as declaragdes de variiveis que aparecem entre parénteses na declaragio de um método. Uma declaragio de método tpica, com miliplos argumentos, se parece com o seguinte public Record getRecord(int fileNumber, int recordNumber) { } Axgumentos de métodos sio essencialmente o mesmo que varidveis locais. No exemplo anterior, as varivels £ileNumber e recordNumber seguem todasas regras aplicadas a variaveis locas. Isso significa que elas também podem ter 0 modificador £nal: public Record getRecord (int fileNunber, final int rectwumber) { } [Neste exemplo,a variivel recordNumber édeclarada como £inal,o que significa obviamente que cla niko poder ser ‘modificada dentro do método. Neste caso, “modificar” significa atribuir um novo valor a vatiével. Em outras palavras, um argumento final deve manter o mesmo valor que o parimetro tinha quando foi passado para o método, Métodos Abstract Um método abstract é um método que foi dclarado (como abstract) mas nio inplementade. Em ovteas palavras, 0 :método nio contém nenhum cédigo funcional. E, se vocé se lembrar da secio “Classes abstract” uma declaragio de método abstract. nfo tem nem sequer chaves onde um e6digo de implementacio pudese ser colocado, terminando, JAVA 5 25 em vez disso, com ponto-e-virgula, Em outras palavras, ela nao tem son corpo de mods. Vocé marca um método como abstract quando quet forgaras subclasses a fornecer a implementacio em questio. Por exemplo, se eserever uma classe abstract Carcomum método goUpHi11 () , voce poderia desejar forcar todos os subtipos de Cara definiro seu proptio comportamento de GoUPH: 11 () , especifico aquele tipo determinado de carro, public abstract void showsample() ; Repare queoméodo abstract termina com ponto--virgla em vex de caves. B invalid ter um tinico método abstyact que sejaemuma classe que nfo seja declarada explicitamente como abst ract! Observea seguinte chasse inv public class rlegalclass( public abstract void dort (); } A dass anterior produit seginte ero se voce a ena compile Tilegaiciass.java:l: class TegaiClase mist be declared abstract Te does not define void dott) fron class TLlegalclass. public class I1legaiclass( 1 error Voce pode, no entanto, ter uma classe abstract sem nenhum método abstract. O seguinte exemplo iri compilae sem problemas: public abstract class LegalClass{ void goodMethod() { // ineiza um monte de cédiges reais de implenentaggo aqui } [No exemplo anterior, goodMethod () nio éabst ract. Trés dicas diferentes Ihe dizem que ni se trata de um método abstract: MO métocio nio esti marcado como abstract. MA declaragio do mérodo inclui chaves, em vex de terminar com ponto-e-virgula. Em outras palavras, 0 método tem um_ compo de método. MO método inclui eédigo de implementacio. Qualquer classe que estenda uma classe abstract deve implementar todos 0s métodos abstract da superciasse, a no ser que a subclasse fambimseja abstract. A regra éa seguinte: Apprimeira subclasse concreta de uma classe abstract deve implementar todos osmétodos abstract da superclasse. Conereto significa apenas nio-albstract,entio, se vocé iver uma classe abstract. estendendo outra classe ab~ stract,asubclase abstract nio precise fornecerimplementagbes para os métodos abstract. herdados. Mais cedo ou mais tarde, no entanto, alguém vai cea uma subclasse nlo-abstract. (em outras palavras, uma classe que pode ser instanciada), «essa subclasse teri de implementar todos os métodos abstract. de cima para baixo na arvore de hheranea. O seguinte exemplo demonstra uma arvore de heranga com duas classes abstract. e uma concreta: public abstract class Vehicle { priv string type: public abstract void gotpHil1(); // Método abstract public String getType() { // Método ndo-abstract, return type; } public abstract class Car extends Vehicle ( public abstract void goupHill(); // Ainda abstract public void docarThings() { // Codigo especial para o carro entra aqui 26 Capitulo 1: Declaragées e Controle de Acesso: } t public class Mini extends Car { public void goupHill() { // Codigogespecifico para o Mini eubir ladeiras Endo, quantos métodos tem a classe Mini? Tés. Ela herda os métodos get Type () e doCarThings (), porque eles sio piblicos e coneretos (ndo-abst ract). Mas, pelo fato de GOUpHi11 () serabstract na superclasse Vehicle, ¢ ‘nunca serimplementado na clisse Car (permanecendo abst. rac, portanto) iss significa que a classe Mini —comoa primeira classe concreta abaixo de Vehicle ~ precisaimplementar o método GOUpHti 11 () Em outras palavras,a classe Mini no pode deixara implementagio do método abstract. paras proxima classe abaixo dela na atvore de heranca, ‘musa classe Car pode, porque Car, como Vehicle, €abst rac. A Figura 1-5 lustea os efeitos do modificador ab stract. sobre subclasses concretas e abstatas, abstract Car startEngine( } abstract goPorward( ) abstract reverse ) ‘stop( ) abstract Curn(int whichway) Sportscar abstract SW fstartengine( ) // opcional eaablegwat 7 laororward(} // ‘requerido goForward( ) leeverse( } //' requerido Feverse ) eurn(int whichiay) //requeriao abstract gooftRoad( ) /f wurn() nko Implerentads (Os métodos abstract devem ser implementados por uma subclasse no-abst ract.. Se. subclasse for absteaa, ela no é AcmeRaver obrigada a implementar os métodos abstract, mas tema ppermissio de implementar qualquer um ou todos os métodos abstract dasuperclasse. A classe AcmeRover € nlo- fenableswa( } // opcionad abstract, entio ela precisa implementar o método ab- feepeenoe i /ane crease) turn(int whichiay) //requeride stract declarado.na sua superclasse, SUV,e precisa nay) /(zear implementar também turn (), que nao foi implementado por SUV. Figura 1-5 Os efeitos do modificador abstract sobre subclasses concretas e abstratas Procure por classes concretas que no fornecam implementagdes para métodos abstract da superclasse. O seguinte cédigo nio vai compilar: public abstract class A { abstract void foo(); } class B extends A { void foolint 1) { } } A.dlasse B nio vai compilar porque ela nio implementa o método abstract herdado £00). Embora o método foo (int I) daclasse B paresa ser uma implementacio do método abstract da superclasse, na verdade € simplesmente um método sobrecarregado (um método que usa o mesmo identificador, mas diferentes argumentos), entio cle no atende a0 requisito de implementagao do método abstract dasuperclasse, Veremos as diferengas entre substiuigio e sobrecarya com mais detalhes n0 Capitulo 2, ‘Um método nio pode nunca, jamais, ser marcado como abstract ¢ final ao mesmo tempo, nem como ab- stract eprivate ao mesmo tempo, Pense um pouco ~ os métodos abstract. precisam ser implementados (0 JAVA 5 27 ‘que na pritica significa serem substiudos por uma subclasse), enquanto que métodos final eprivate nio podem jamais ser substituidos por uma subclasse. Ov, dizendo de outta forma, uma designacio abstract. significa que a superclasse no sabe nada sobre como as subclasses devem se comportar no método em questio, enquanto que uma esignacio £inal. significa que a superclasse sabe ado sober como todas as subclasses (por mais afastadas que estejam na firvore de heranga) devem se comportar no método em questio, Os modificadores abstract «final sio ptaticamente opostos, Pelo fato de os métodos private nao paderem nem mesmo ser vistos por uma subclasse (quanto mais herdados), cles também nio podem ser substiuidos, entio eles também niio podem ser marcados como abstract. Finalmente, vocé precisa saber que 0 modificador abstract. no pode nunea ser combinado com 0 modificador static. Abordaremos os mérodos static mais adiante neste objetivo, mas, por agora, basta lembrar que o seguinte seria invilido: abstract atatic void dostuft () E lhe daria um erro que a esta aleua jf deveri Ihe parecer familiar: MyClass.java:2; illegal combination of modifiers: abstract and static abstract static void dostuff (); Métodos Synchronized [A palavra-chave synchronized indica que um método s6 pode ser acessado por um thread de cada vez. Nos dliscutiremos isso & exaustio no Capitulo 9, mas, por agora, tudo o que nos interessa é saber que o modificador synchro- nized s6 pode ser aplicado a métodos — no. vasiéves, nem casses, apenas a métodos. Uma declaragio synchronized tipica se parece coma seguinte: public synchronized Record retrievelserInfo(int id) { } ‘Vocé precisa saber também que o modificador synchronized pode ser acompanhado por qualquer um dos quatro niveis de controle de acesso (0 que significa que ele pode ser usado juntamente com qualquer uma das trés palavras-chave ‘modificadoras de acesso). Métodos Nativos (© modificador native indica que o método esta sendo implementado conforme a plataforma, freqiientemente eC. ‘Vocé nio precisa saber como usar métodos nativos pata o exame, basta saber que native é um modificador (e, portanto, uma palavra-chave reservada) e que iat ive s6 pode ser aplicado a métadas— nio a classes, nem a variéveis, apenas a métodos, Repate que o corpo de um método nativo deve ser ponto-e-virgula () (como métodos abstract.) indicando ‘que a implementagao foi omitida Métodos Strictfp ‘Vimos anteriotmente ouso de strictp como modificador de lasse, mas, mesmo que voce no declare uma classe como stxict Ep, ainda assim voce poderi declarar um método individual como strict fp. Lembre-se de que Strict fp fore os pontosfutuantes (equsisquer operagBes com ponto flutuant) a aderizem 20 padsio IEEE 75 Com strict fp, é posiel prever como os seus pontos Auntantes e comportario,independentemente da plaaforma subjacente na qual a VM esti zodando, O inconvenient disso ¢ que, ea plataforma subjacente for capaz de uportar uma maior precslo, um método strict £p nlo poderi se benefciar dessa capacidade ‘Voct s6 deseja estudar o IEBE 754 se precisar de algo para sjud-loa air no sono, Para 0 exame, no entanto, vocé no precisa saber nada sobre strict fp além da sua utilidade, do fato de que pode modifica uma declaragio de classe ou de ‘método, e que uma vasiével nunca pode ser declarada como strict £p. Métodos com Listas de Argumentos Variéveis (var-args) Desde a versio 5.0, Java lhe permite eriar métodos capazes de usar um niimero varivel de argumentos. Dependendo de onde vocé pesquisar, poderi ver essa capacidade ser chamada de “lista de argumentos de extensio variével”, “argumentos vatiiveis”, “var-angs”, “varaggs” 01 0 nosso favorito (caido do departamento de obscuridade),“parimetro com niimero variivel de argumentos”. Todos eles sio a mesma coisa, e usaremos 0 termo “varargs” dagui em diante _Apenas para informagio, gostatlamos de esclarecer como izemos usar os termos “argumento” e “parimetro” ao longo deste live. 1 argumentos Aquilo que voc’ especifica entre parénteses quando esti invozardo um método: dostuff("a", 2}; // eatanos invocande dostuff, entéo a & 2 so argumentos 1 pardmetros Aquilo na arinatura do mévodo indica o que o método deve receber quando forinvocado: void dostuff (string e, int a) { } // estamos esperando dois tulo 1: Declaragées e Controle de Acesso // parfnetros: String e int Falaremos mais sobre o uso de métodos var-args nos préximos capitalos, por agora vamos revsat as regras de declaracio ara war-args: Tipo var-arg Quando declara um parimetso var arg, voce deve especificaro tipo do(s) argumento(s) que esse parimetro do seu método pode receber. (Pode ser um tipo primitivo ou um tipo de objeto) I Sintaxe bisica Para declarar um método usando um parimetto var-arg, vocé escreve depois do tipo um sinal de reticéncias(..),um espago, e depois o nome do array que iré armazenar os parimetros recebidos. Outros parémetros F vilido ter outros parimetsos em um método que use um var arg, 1 Limites dos var-args O var-arg deve ser o thimo parimetro na assinatura do método, ¢ vocé s6 pode ter um var agg por método, ‘Vejammos algumas dectaragdes com var arg valida einvalidas: Valdas void dostutt (int... x) (} // espera de 0 a muitos ints 11 como pararetros void dostuff2 (char c, int... x) { } // espera primeiramente um char, J/ © depois de 0 a muitos ints void dostuft3 (Animal... animal) { } // de 0 a muitos Animals Invilidas: void dostufts (int x...) ( } // sintaxe incorreta void dostufts (int... x, char... y) { } // mais de um var-arg void dostufté (string... s, byte b) { } // var-arg tem de vir por ditimo Declaragées de Construtores Em Java, os objetos sio construidos. Sempre que vocé cria um novo objeto, pelo menos um construtoré invocado, Toda classe tem um construtor, e, se voeé nlo criar um explicitamente, 0 compilador vai ciar um para voce, Existem toneladas de regras relativas 40s construtores,¢iremos deixar a discussio detalhada para o Capitulo 2. Por agora, vamos nos concentear ‘nas regras basicas de declaracZo, Bis um exemplo simples: clase Foo { protected Foo() { } // este € © construtor de Foo protected void Foot) {) // este é um método com um péssimo none, 11 porém valid } A primeira coisa ase reparar & que os construtores se parecem wm bocado com métodos. Uma diferenga fundamental é que ‘um construtor no pode nunca, jamais, ter um tipo de retorno... Nuncal As declaracdes de construtores podem ter, n0 entanto, todos os modificadores de acesso normais, e podem usat argumentos (incluindo var-args), da mesma forma como ‘0s métodos. A outra REGRA IMPORTANTE a se entender sobre 0: construtores é que eles devem ter 0 mesmo nome que a classe no qual slo declarados. Os construtores nio podem ser marcados como stat ic (afinal eles sto associados com instanciamento de objetos), no podem ser marcados como final nem abstract (porque nio podem set substinuidos) Eis algumas declaragdes de construtores vilidos e invalidos: class Foo2 { // construtores vélides Fo02() { } private Foo2 (byte b) { } Foo2 (int x) { } Foo2 (int x, int... y) { } JAVA 5 29 // construtores invélidos void Foo2() { } // € um método, ndo um construtor Foo() ( } // ndo 6 nem método nem construtor Foo2 (short 8); // se parece com um método abstract static Fooa(float f) { } // nfo pode ser stat final Foo2(long x) { } // nfo pode ser final abstract Food (char ¢) { } // nfo pode ser abstract Foo2 (int... x, int t) { } // sintaxe var-arg incorreta } Declaragées de Variaveis Existem dois tipos de variiveis em Java: Primitivos Um primitivo pode ser de oito tipos diferentes: char, boolean, byte, short, int, long, double ou fLoat. Uma vez declarado, o su tipo primitive nfo pode aunca ser modificado, embora na ‘maioria dos casos o seu valor possa se modifica. 1 Varidveis de referéncia As variveis de referéncia sio usadas para se refer (ou acessat) um objeto. Uma variivel de seferéncia€ declarada como sendo de um tipo especifico, e esse ipo no pode nunca ser modificado, Uma variével de referéncia pode ser usada pata tefert-se a qualquer objeto do ipo declarado, ou de um subtipa do tipo declarado (urn tipo compative).Falaremos muito mais sobre 0 uso de uma vatvel de refeténcia para referir-se a um subtipo no Capitulo 2, onde discutizemos 0 polimorfismo. Declarando Primitivos e Intervals de Primitives ‘Varidveis primitivas podem ser declaradas como variéveis de classe (tat ic), variives deinstincias, parimetros de métodos ou vatiéveis locas. Vocé pode declarar um ou mais primitivos, do mesmo tipo primitivo, em uma mesma linha, No Capitulo 3, dscutiremos as diversas maneiras pelas quais eles podem ser iniciaizados, mas, por agora, apresentaremos apenas alguns exemplos de declaragdes de variiveis primitivas: byte by boolean myBooleanPrimitive; int x,y, 2 J/ declara trés primitivos int [Em versdes anteriores do exame, voce precisava saber como calcularintervalos para todos os primitivos Java. Parao exame atual, vocé pode pular alguns detalhes, mas ainda é importante entender que, para 0s tipos inteizos, a seqiiéneia é (do menor para o maior) byte, short, inte long, e que doubles sio maiores do que float. Voeé também precisari saber que os tipos numéricos tanto inteiros quanto de ponto fiutuante) so todos assinalados, ¢ como isso afeta os seus intervalos, Primeiramente, vamos revisar os conceitos “Todos os ses tipos numéricos em Java sio feitos de um certo niimero de bytes de 8 bits so arsinalades,significando que podem ser negativos ou positivos. O bit mais esquerda (o digto mais significativo) é usado para representar osinal, em ‘que | significa negativo e 0 significa positive, como mostrado na Figura 1-6. O resto dos bits representam o valor, usando a fotasio de base 2. bit de sinal 0 = posiivo 1 = negaivo a gaiaans bits de valores: ee byte: 7 bits epresentam 2" ou 128 valores Siedeseal —“Wjewdons diferentes: de0.a 127 oude 128-1 _ short 15 bits podem representa 2" ou 32768 os *, \Gienonoo0oda valores: de Oaté 32767 ou de 32768 a-1 Figura 1-6 O bit de sinal de um byte ee. ee AFOGOeS & ontrole de Acesso A Tabela 1-3 mostra 0s tipos primitivos com os seus tamanhos e intervalos, A Figura 1-6 mostra que com um byte, por exemplo, hé 256 niimeros possiveis (ou 2). Metade deles sZo negativos, e metade ~ I sio positivos. A faixa positiva tem tum valora menos da que a negativo porque o ntimero zero & armazenado como tum aimero binitio positive, Usamos a fSrmula-2*""! para calcula o intervalo negative, e usamos-2°~")—1 para o intervalo positivo. Novamente, se voce souber as duas primeiras colunas desta tabela estar em boa forma para o exame, Tobela 1-3 Intervalos de Primitivos Numéricos Tipo Bits Bytes Intervalo Minimo Intervalo Maximo bye 8 1 2 short 16 2 2 21 ine 32 4 a2 BA long 6 8 ED zat float 32 4 afd afd double a 8 n/a ald (O intervalo para mimeros de ponto fluruante é complicado de determinar, mas felizmente vocé nio precisa sabé-los pasa o «exame (embora€ esperado que vocé saiba que um double armazena 64 bits, eur float armazena 32). Para tipos booleanos aio ha um intervalo; um booleano s6 pode set true ot false. Se alguém Ihe perguntar a profundidade de bits de um tipo booleano, olhe bem nos olhos da pessoa e diga “depende da maquina virtual”, Ela ficard impressionada. tipo char (am caracter) contém um s6 caracter Unicode de 16 bits. Embora o conjunto ASCII estendido conhecido como TSO Latin-1 precise de apenas 8 bits (256 caracteres diferentes), énecessirio um intervalo maior para representar caracteres encontrados em linguas diferentes do inglés. Os caracteres Unicode, na verdade, si representados por niimeros intros de 16 bits nao-assinalados, o que significa 2" tipos possiveis, que vio de 0 65535 (2° — 1, No Capitulo 3, vocé aprenderi que pelo fato de um char ser na verdade um tipo de niimero inteito, ele pode ser atibuido a qualquer tipo de aimero grande o suficiente para armazenar 65535 (0 que significa qualquer coisa maior do que um tipo short, Embora tanto chars quanto shorts sejam tipos de 16 bits lembre-se de que um short usa 1 bit para representa o sinal, de modlo que mettos mimeros positivos sio acetiveis em um shor). Declarando Variaveis de Referéncia ‘Varidveis de referéncia podem ser declaradas como varidveis sttat ic, variiveis de instincias, parimetros de métodos ox -variveis locais. Vocé pode declarar uma ou mais variiveis de referéncia, do mesmo tipo, em urna mesma linha. No Capitulo 3, discuticemos as véeias maneitas pelas quais elas podem ser inicializadas, mas por agora apresentaremos apenas alguns cexemplos de declaragdes de vaidveis de referéncia Object o; Dog mylewDogReferenceVariable; String et, 82, 83; // declara tr8s variaveis String Variaveis de Instancias As vativeis de instincias sio definidas dentro da classe, mas fora de qualquer método,e 86 sie inicializadas quando a classe ¢instanciada. As varveis de instincias sio os Eampos que pertencem a cada objeto tinico, Por exemplo, o seguinte cOdigo defice campos (variéveis de instincias) para name (nome), tle (alo) e manager (gerente) para objetos employee (fncionirie) class Exployee { // define campos (variéveis de instancias) para instncias de employee private String name; private string title, private String manager; // outros cédigos aqui, incluindo os métodos de acesso para campos privados JAVA5 31 ‘A.classe Employee antetior diz que cada instincia de employee sabera qual €0 seu proprio nome, titulo e gerente. Em. ooutras palavras cada instincia pode ter os seus valores tinicos para esses tés campos. Se voce vir os termos “campo”, “‘yatiivel de instincia", “propriedade” ou “atributo”, eles signifieam praticamente a mesma coisa. (Na verdade, existe distingdes sutis, mas ocasionalmente importantes entre os termos, contudo, elas nfo sio usadas no exame) ara. exame, voeé precisa saber que as varkveis de instincias 1 Podem usar qualquer um dos quatro miss de acs (o que significa que eles podem ser marcados com qualquer um dos tus madifcadere de acesso) oder seemarcadas como final Podem ser marcadas como transient [Nao podem ser marcadas como abstract ‘Nao podem ser marcadas como sinchronized Nio podem ser marcadas como strict £p Nio podem ser marcadas como native Nao podem ser marcadas como static, porque isso as transformaria em variiveis de classe. ‘Jaabordamos os efeitos dese aplcar controle de acesso a variiveis de instncias (funciona da mesma maneira que para ‘métodos membtos), Um pouco adiante neste capitulo, veremos o que significa aplcar 0 modificador final ou tran- ‘sient. a uma variivel de instincia, Primeiro, daremos uma répida olhada na diferena entre vaiiveis de instincias € varidveis locais. A Figura 1-7 compara a maneira pela qual os modificadores podem ser aplicados a métodos em contraste Vasveisocais ‘Variveis(nd0-locas) Métodos Final final Final public public protected protected private private statict static transient volatile abstract synchronized strictfp native Figura 1-7 Comparacéo de modificadores para variéveis x métodos Variaveis Locais (Automatic/Stack/Method) ‘Vaiivesloais so aquelasdeclaradas denteo de um método. Ist significa que a vasive no & apenas inicnlizada dentro do método, mas também declarada dentro dele. Assim como a varivel local inti «sua vida dentro do método, ela também & estrada quando o método finaliza. As vativeis locas fcam sempre na plha, eno no heap (Falaremos mais sobre apilha 0 heap no Capitalo 3). Embora o valor da variével possa ser passado para, digamos, outro método que entio armazene 0 ‘Valorem uma varive de instincia, a vativel propriamente dita 6 vive dentro do escopo do método. “Apenas nfo se esqueca de que enquanto a varivel local esta na pilha, sea vaiével For uma referéncia 2 objeto, o objeto propriamente dito ainda seréctiado no heap, Nao existe um objeto de pilha, apenas uma variivel de plha. Voce freqiientemente ouvira programadores usarem a expresso “objeto local”, o que eles realmente querem dizer ¢ “variével de referéncia declarada localmente”. Assim, se ouvir um programador usar essa expressio, voce sabera que ele € simplesmente preguigoso demais para usar o termo téenico mais preciso. Vocé pode dizera ele que nés afirmamos isso—a nao ser que cle saiba onde aés moramos. As declaragGes de variveis locais nio podem usar a maioria dos modificadores que podem ser aplicados a variaveis de instincias, ais como public (ou os outros modificadores de acesso), transient, volatile, abstract ou ‘tat ic, mas, como vimos anteriotmente, as variéveis locas podem set marcadas como £ inal. E, como vocé aprender ‘no Capitulo 3 (mas aqui vai um adianto), antes que uma variével local possa ser asada, ea precisa sex iniiafigada com umn valor. Por exemplo: ee SOpiUlO Ir Meclaragoes € onirole de ACesso- class TestServer { public void login() { int count = 10; } Namaioria dos casos, vocé vai inicilizar uma varivel local na mesma linha em que a declarar,embora voc# possa ainda ter e reinicializ-la depois, no método. A chave & se lembrar de que uma vasiével local precisa serinicializada antes de voce tentar usé-la. O compiladorrejeitard qualquer cédigo que tente usae uma varive! local que nlo tena recebido um valos, porgue ~a0 contritio das variveis de instincias ~asvariéveis locais nio recelem valores-padtio, (Uma varivel local nio pode ser referenciada em nenhum e6digo fora do método no qual foi declarada. No exemplo de cédligo anterior, seria impossivel referr-se variivel count. em qualquer outro lugar da classe exceto dentro do escopo do método Login (). Novamente, no queremos dizer com isso que o valor de count. nio possa ser passado para fora do ‘método para comegar uma nova vida. Masa varivel que armazena esse valor, Count, nao pode ser acessada depois de 0 ‘método finalizar, como o seguinte cédigo invilide demonstra class Testserver ( public void logtn() ( Ant count = 10; } public void dosomething(int 4) { count = + // Nao vai compilar! Nao 6 possivel acessar count // de fora do método login() ossivel declarar uma vativel local com o mesmo nome que uma vaskvel de instincia, Isso é conhecido como Pe 9 sombreamento, como 0 seguinte cédigo demonstra class TestServer { int count = 9; // Declara una variavel de ineténcia chamada count public void login() { int count = 10; // Declara uma variavel local chamada count System.cut.printin(*local variable count is * + count); ) public void count (} { Syetem.out .printin ("instance variable count is * + count); } public static void main(string(} args) ( new TestServer () .1ogin() ; new TestServer() .count (); } (© eédigo acima produs a seguinte sada: local variable count is 10 instance variable count is § Mas por que razio voce ria querer fazer isso? Normalmente, vocé nfo vai. Mas uma das razées mais comuns ¢ para dar a um parimetro o mesmo nome que a varvel de inscineia qual o parimetro seréatribuido, O seguinte eédigo (incorreto) esta tentando defini o valor de uma variével de instincia ussndo um parimetro: class Foo ( int aize JAVAS 33 public void setSize(int size) { size = size; // // 222 qual size € igual a qual size??? } nuio vocé decidiu gue — para melhor legibilidade — voce quer dar ao parimetro o mesmo nome que a varivel de instincia para agualo seu valor se destina, mas como resolver a colisio dos nomes? Use a palavra-chave ths. A palavra-chave this ‘sempre, sempre, sempre se refere a0 objeto sendo executado atualmente, O seguinte cédigo mostra isso na pritica: class Foo { ine size = 27 public void setSize(int size) { this.size « size; // this.size significa a variavel de insténcia // do objeto atual, size. 0 valor de size // & dixeita é 0 parametro } Declaragées de Arrays Em Java, os arrays slo objetos que armazenam multipls vativeis do mesmo ipo, ou vasiveis que sio todas subclasses do mesino dpa, Os arrays podem armazenar ou ptimitivos ou referencias a objetos, mas o proprio array seri sempre um ‘objeto no heap, mesmo seo aray for declarado para armazenar elementos primitivos. Em outraspalavras, no existe um tery primitiv, mas vocé pode criar um aay de primitivos. Para exame, voce precisa saber tés coisas Como ctar una varvel de refertncia a um array (declares) Como ctiarum objeto array (consteuit) Como preencher o array com elementos (icializas) ara este objetivo, voc’ sb precisa saber como declarar um array; nés abordaremos a construgio ea niclalizagio de arrays no Capito 3. AO TRABALHO (Os arays co ofciontes, mas muita ees vot desiard nsar um des tips Collection de Java .ut-41 (induinde HashMap, ArrayList ¢TreeSet), As classes Collection ofrvcem manciras mais flies de aessar um objeto (para inrero, qpqgamento, ‘itura «assim or dante) e, a contrrio dos arrays, adem se espandir ow conta dnanncament medida que vot adiiona ou remove elementos. Exist um tipo Collection para wma ampla gama de ncesidades. Veet precisa de uma clasifcaao rida? De um grap deobjetos sem duplicatas? De wma mancira de aestar um par de nome-salor? O Capitals 7 os aborda cm mai detabes, Os arrays sio declaredos informando-se o tipo de elementos que o array ir armazenar (um objeto ou um primitivo), seguido por colehetes em uum dos lados do identticador. Diclarands wo Array de Priiivos int () key: // Colchetes antes do none (reconendado} int key [ 1; // Colehetes depois do none (vélido, mas menos legivel) adarando 1m Array de Refitnas a Obes Thread (] threads; // Reconendado ‘Thread threads // Valido, mas menos legivel AOTRABALHO. “A declanar wea refertcia a array, voc eve snore clacar os colchees do array imediatamente depos do tipo delarado, em vex de depais do “dentiicador (nome da varéve), Desa forma, quaguer que lea o cig saber famente qu, por exemple, key € wma referéncia a am objeto de array nt, € oun proto nt ee aptivie 1s Veclaragoes & Controle de Acesso- Podemos também declarer arrays multidimensionas, que, na verdade, io arrays de arrays. Isso pode ser feito da seguinte Stringt 1 1] [1 occupantwane; String [ ] ManagerNane [ }; O primeiro exemplo é um array tridimensional (am array de arrays de arrays), © 0 segundo € bidimensional. Repare no segundo exemplo, o qual tz um par de colchetes antes do nome da varivel e urn par depois 360 € perfeitamente vilido para o compilador, provando mais uma vez que o fato de ser vilido nao necessariamente indica que € bom, OBSERVAGOES PARA O EXAME Nunca € vido incr o tama do ariy na sua declarac. Sim, ns sbemos que sed pode faze soem algamas onras guages, gue € «rai pela gual vot poder ver uma gusta ou duat que incluam cio parecid com o seve int {5} scores; 0 cb acim nao vai campilar. Lembrese, a JVM nao albcaespago até que vac de at instance o objeto array. Sé enti é quo tamanto Sa, iferena No Capitulo 3, passaremos um bom tempo discutindo arrays, como os inicalizar e user, ¢ como lidar com arrays ‘mulidimensionais.. Fique ligado! inal Declarar uma variével com a palavra-chave £nal. impossibilita a reuiizagio dessa varivel depois de ela ter sido inicialzaca com um valor explicto (repare que dizemos explicito,e no padrao), Para primitivos, isso signifiea que, uma vez quea variével recebeu um valor, ese valor ndo poder ser alterado, Por exemplo, se voce attibuir 104 variivel int x, entio x vai permanecer como 10 para sempre. Isso é bem simples para primitivos, mas o que significa ter uma variivel de referencia objeto £ina1? Uma variivel de referéncia marcada como final. ido pode jamais see reatrbuida para refers-se.a um objeto diferente. Os dados dentro do objeto podem ser modificados, masa variével de referéncia nlo pode ser modificada, Em outras palavras, uma referéncia final ainda lhe permite modifica o estado do objeto ao qual se refete, mas voc’ nio pore modifica varivel de referéncia pata fazé-la se referira um objeto diferente, Decore isto: ndo existem objetos £inal, apenas referéncias £ ina. Explicaremos isso com mais detalhes no Capitulo 3 Varidvei ‘Agora estuclamos como o modificador f inal pode ser aplicado a classes, métodos e variéveis. A Figuea 1-8 mostra as Drincipaiscaracteristicas e diferengas das varias aplicagSes de Final, classe [classe final Foo} 4 daw final nio método classe Baz © minds final nio mal void got variivel classe Roo a aril €inal nto final int size =| podereceberum valor 42; novo, depois de ter sido Stun de um voidKhangsize ( : [eens eeeeeeae Figura 1-8 Efeito de final sobre variéveis, métodos e classes JAVAS 35 Variaveis Transient Se marcas uma vatiivel de instincia como transient, voct estara dizendo a JVM para ignorar essa variével quando woot tentar seializar o objeto que a contém. \ serializagio €um dos recursos mas legais de Java;ela Ihe permite salvar (0 que is ‘yezes se chama de “flaten”) um objeto escrevendo o seu estado (em outras palavras, o valor das suas variaveis de instineias) em um tipo especial de sizeam de E/S. Coma seralzacao vocé pode salvar um objeto em um arquivo, ow até cenvié-lo atsavés de uma conexio para ser“re-inflado” (deserializado) do outro lado, em outra JVM. A sesializagio foi adicionada ao exame na versio Java 5, falaremos dela com mais detalhes no Capitulo 6, Variaveis Volatile (Omodifieador volatile diz JVM que um thread que acesse a variivel deve sempre teconciliara sua cépia private dda variivel eom a cOpia master presente na meméiia, Como € que é? Nio se preocupe com isso, Para o exame, tudo o que ‘voe® precisa saber sobre volatile é que, assim como trans ient, esse modificador s6 pode ser aplicado a vasiiveis ddeinstincias, Nao se engane, a idéia de miltiplos threads acessando uma variivel de instancia € assustadora, e é muito Jimportante que todo programador Java entenda, Mas, como veri no Capitulo 9, vocé provavelmente usard a sineronizagao, em vez do modificador volat 3 Le, para tornar seus dados & prova de threads (0 modificador volatile (“voliti”) também pode ser aplicado a gerentes de projetos :) Variaveis e Métodos Static O modificador Stat ic é usado para crar variveis e métodos que irdo exstir independentemence de quaisquer instincias criadas para classe. Em ouirsspalavras, os membros Stat ic existem antes mesmo de vocécriar uma nova instincia de ‘uma classe, ¢ haveri apenas uma cépia do membro stat ic, independentemente do niimero de instincias dessa class. Em outras palaveas, codas as instincias de uma dada classe compartilham o mesmo valor para qualquer variével static. Falaremos de membros stat ic com mais detalhes no proximo capitulo. (O que voe# pode marcar como static: © Métodos 1 Vasives 1 Uma classe aninhada dentro de outra classe, mas no dentro de um método (falaremos mais sobre isso no Capitulo §). . Blocos de inicializacio Oquevoce 0 pode marcar como static: Consteutores (no faz sentido; os construtoressomente slo usados para crit instincis) Classes (anit ser que estejam aninhadas) Tverfaces Classes interas locais de mézodos (veremos isso no Capitulo 8) Método de classes internas evatveis de instincias Vasiiveislocais Declarando Enums A partir da versio 50, Java he permite restringir uma varive par ter umn de apenas uns poucos valores pré-efinidos—em outs palavras, um valor de uma sta enumerada, (Os itens da lista enumerada sio chamados, suspreendentemente, de enum) (Ovuso de enums pode sjudara reduzir os bugs no seu cédigo. Por exemplo, na sua aplicagio de automagio de lanchonetes, vocé poderia desejar eduzir os tamanhos de cafés possiveis aBIG (“grande”), HUGE (“enorme”) ¢ OVER~ WHELMING (“absurdo”). Se vocé deixar a possibilidade que um pedido de tamanho LARGE (“grande”) se feito, sso poderia causar um erro. Entram em ago os enums. Com a simples declatacio a seguir, vocé podera garantir que Compilador o imped de atribuir qualquer coisa a um CoffeeSize que nio scja BIG, HUGE ox OVERWHELMING: enum Coffeesize { BIG, HUGE, OVERWHELMING } ‘Davem diante,a nica maneira de se obter um Cof feeSi ze seri com uma declaragio parecida com esta: coffeesize cs = CoffeeSize.BIG; [Nao obrigatorio que as constantes enums estejam escritas toralmente em maidsculas, mas, tomando emprestado da convengio de cédigos da Sun que determina que as constantes tenham os seus nomes em maitsculas, é uma boa idéia faré-lo aqui 90 Copitulo |: Declaragées e Controle de Acesso: (Os componentes bisicos de um enum sio as suas constantes (ou seja, BIG, HUGE e OVERWHELMING), embora voeé vi ver logo adiante que pode haver muito mais em um enum. Os enums podem ser declarados como as suas proprias classes separadas, ou como membros de classes, mas no podem ser declarados dentro de um métodol Dectarando um enum jorade uma classe: enum CoffeeSize { BIG, HUGE, OVERWHELMING} // nfo pode ser // private nem protect class Coffee ( Cofteesize size; public class CoffeeTest1 { public static void main(String!] args) ( coffee drink = new Coffee() ; drink.size = Coffeesize.BIG; // enum fora da classe : (© cédigo acima pode fazer parte de um sé arquivo, (Lembre-se, o arquivo deve ser nomeado como CoffeeTest java, porque esse ¢ 0 nome da classe piblica do arquivo.) A principal coisa ase lembrar € que o enum pode ser declarado somente com o modificador public ou o default, assim como uma classe no-interna, Eis um exemplo de declaracio de ‘enum donir de wma classe: class Coffee2 { enum CoffeeSize (BIG, HUGE, OVERWHELMING } cofteesize size; public class CoffeeTest2 { public static void main(String!] args) ( Coftee2 drink = new Coffee2(); Grink.size = Coffee?.coffeesize.BiG; _// incluindo classes 11 nome requerido } ‘As principas coisas se lembrardestes exemplossio que: 1) enums podem se delarados como as suas proprias classes, ‘ou polem ser ineluidos em outta classe; 2) que a sintaxe para se acessar os membros de um enum depende de onde 0 enum foideclarado, ‘Oseguinte exemplo NAO éwilido Public class coffeerest ( public static void main(string|} args) { enum CoffeeSize { BIG, HUGE, OVERNHELMING } // BRRADO! Nao se // pode declarar enums 11 em wétodos Coftee drink = new coffee(); drink.size = Cofteesize.216; z Para fazer as coisas ficarem mais confusas para voré, os elaboradores da inguagem Java fizeram opcional a colocagio de JAVAS 37 ponto-e-visgula no final da declaragio do enum: public class Cofteeresti { enum CoffeeSize { BIG, HUGE, OVERWHELMING }; // <~ 0 ponto-e-virgula // € opcional aqui public static void main(string{] args) { coffee drink = new Coffee(); Grink.size = Coffeesize.BIG; } Enfim, o que é criado quando vocé cria um enum? O mais importante a se lembrar é que enums nio sio Strings nem nts! Cada um dos tipos enumerados de CoffeeSize éna verdade uma instincia de CoffeeSi ze. Em outras palavras, BIG édo tipo Cof feeSize. Pense em um enum como um tipo de classe, que é parecido (mas no exatamente) com isto: // exemple conceitual de como voce // pode entender os enuns class Coffeesize { public static final Coffeesize BIG = new Coffeesize("BIG", 0); public static final Coffeesize HUGE = new CoffeeSize(*HUGE", 1); public static final CoffeeSize OVERWHELMING new CoffeeSize( “OVERWHELMING”, 2); public CoffeeSize (String enuname, int index) { // mais coisas aqui } public static void main(String [] args) { system.out print in (CoffeeSize.BIG) ; } Repare como cada um dos valores enumerados, BIG, HUGE ¢ OVERWHELMING, é uma instincia do tipo Coffeesize. Eles sio representados como Stat ic e final, o que no mundo Java corresponde a uma constante. Repare também que o valor de cada enum conhece o seu indice ou posigio.. Em outras palavras, a ordem na qual os eriums sio declarados faz diferenca. Vocé pode pensar nos enums de CoffeeSize como fazendo parte de um array do tipo Cof FeeSi ze, e, como veri em um capitulo posterior, voce pode iterar através dos valor de um entumt invocando o método values () em qualquer tipo de enum, (Nao se preocupe com isso neste capitulo) Declarando Construtores, Métodos e Variaveis em um enum elo fato de um enum sera verdade um tipo especial de classe, vor’ pode fazet mais do que apenas lstar os valores das constantes enomeradas. Voce pode adicionar constcutores, variveis de instincias, métodos e uma coisa bastante estranha cchamada corp de class spofio da constants. Pata entendet por que voe® poderia precisar ter mais coisas no seu enum, pense neste enti: imagine que voc’ queira saber 0 tamanho exato, em ongas, que Corresponde a cada uma das constantes de Cof feeSize. Por exemplo, voc’ quer deisar claro que BIG tem 8 ongas, HUGE tem 10 ongas ¢ OVERWHELMING tem inacreditiveis 16 oncas Vocé poder criaralgum tipo de tabela de busca, usando alguma outra estrutura de dados, mas isso sexia um design ruim & de difiel manatengio, A maneira mais simples é tratar os valores dos seus enums (BIG, HUGE OVERWHELMING) ‘como objetos que podem ter as suas propria vatiéveis de instancias Ent, voce poders atibuir esses valores no momento femue of entims. forem inicializados, passando um valor ao construtor do enum. Isso precisa ser explicado com um ppouco mais de detalhes, mas, primeiramente observe o seguinte cOdigo enum Coffeesize { ‘ve \apituio |: Declaracoes e Controle de Acesso_ BIG(8), HUGE(10), OVERWHELMING (26) ; // 08 argunentos apés 0 valor do enum so “passados” // como valores para 0 construtor coffeesize(int ounces) ( this ounces = ounces; // atribui o valor a // wna variavel de instancia } private int oun // wma variavel de inetancia que o val: 11 ée cada enum public int getounces() ( return ounces, class Coffee { coffeesize size; // cada instancia de Coffee tem un /f enum Cofteesize public static void main (st 1g) args) { Coffee drinkl = new Coffee(); drinkl.size « &% feesize.BIG; Coffee drink? = new Coffee(); Grink2 size = CoffeeSize OVERWHELMING; System. out .printIn(drink1.size.getounces()}; // exibe @ System.out .printIn érink2.eize.getounces()); // exibe 16 } (Os principais pontos ase lembrar sobre os construtores de enums slo: NUNCA é possivelinvocar um construtor de enum diretamente. Esse construtoré invocado automaticamente, com (08 argumentos que vocé define apds o valor da constante. Por exemplo, BIG (8) invoca o construtor Cof feeSize ‘que usa um int, passando.o int literal Bao construtor. (Nos bastidores, é claro, vocé pode imaginar que BIG também é passado a0 construtor, mas nio precisamos saber ~ nem nos importarmos com ~os detalles) Vocé pode definir mais de um argumento para o construtor, e pode sobrecarregar os construtores do entum, assim como pode sobrecarregar um construtor normal de classes, Diseutiremos os construtores com muito mais detalhes no Capitulo 2, Para inicializar um CoffeeType contendo 20 mesmo tempo o niimero de oncas e, digamos, um tipo de lid, vocé passaria dois argumentos ao construtor,na forma BIG (8, "A" ),o que significa que voce tem um construtorem CoffeeSize que usa tanto um int quanto uma sting E, fnalmente, vocé pode definir algo realmente estranho em um enum, que se parece com uma chasse interna an6nima (Cobre qual falaeros no Capitulo 8). E 0 chamado corpo de classe expecifico da constate,e vocé pdoe usé-lo quando precisar que determinada constante substitua um método definido ao enum, Imagine este cenério: vocé quer que os enums tenham dois métodos —um pata ongas ¢ um para cédigo de registro (uma String). Agora imagine que a maioria dos tamanhos dos cafés usa o mesmo c6digo, “B”, mas 0 tamanho OVERNHELM- ING usa o tipo “A”. Voeé pode definir um método get LidCode () no enum CoffeeSize que retorne “B”, mas ‘esse easo vocé precisa de uma forma de substituf-lo para OVERWHELMING, Vocé no quer colocar um cédigo 4 /¢hen de dificil mamatencao no métodio get Li dCode ( } , entio.a melhor saida poderia ser fazer com que a constante OVER- WHELMING de alguma forma substitua 0 método getLidCode () Issopparece estranho, mas voeé precisa entender as regras bisicas de declaracio: JAVAS 39 enun Coffeesize ( BrG(8), HUGE (20) , COVERWHELMING(26) { // inicie um bloco de cédigo que defina // 9 “corpo” para esta constante public String getlidcode() ( _// eubstitua o método // definido em Cofteesize return "A"; }i // <0 ponto-e-virgula 6 OBRIGATORIO quando h um corpo coffeesize(int ounces) { thie.ounces = ounces; private int ounces; public int getounces(} { return ounces: } public String gethidcode() ( // este método & substituido // pela constante OVERWHELMING return "2; // 0 valor padrao que querencs retornar // paza as constantes Coffeesize ra a Apés absorver o material este capitulo, vocé deveré estar familarizado com algumas das nuances da linguagem Java, Voce ppodenitalvez se sentir confuso sobre por que teve aida de fazer este exame. Iss0 é normal a esta altura Caso esteja uvindo a si mesmo dizendo “onde eu estava com a cabeca?”, basta se deitar e descansar até que isso passe. Nos igostariamos de poder dizer que fica mais féci, que este foi o capitulo mais dificil e que daqui em diante fica tudo menos complicado, ‘Vamos rever brevemente 0 que voe® precisari saber para o exame. “Haver muitas questbes indiretamente relativas a palavras-chave, entlo, certifique-se de que sabe identificar quais so palavras-chave feaise quais no si. “Embora as convengies de nomeagio como o-uso de camelCase nto caiam diretamente no exame, ainda assim voeé teri de entender 0s fundamentos da nomeagio JavaBeans, qual usa camelCase. ‘Voeé precisa entender as regras associadas com a cragio de identificadores vilidos, eas regras associadas com declaragies de cédigo-fonte, incluindo o uso de declaragdes package ¢ import. Agora vocé tem um bom entendimento do controle de acesso no que se refere a classes, método e vasiéveis. Voce ja via Como os modificadores de acesso (public, protected eprivate) define o controle de acesso de uma classe ou um membro, Voc’ aprendeu que as classes abstract. podem conter tanto métodos abstract quanto nio-abstract, mas que seum s6 método for marcado como abstract, entioa classe deve ser marcada como abstract. Nio se esqueca de ‘que uma subelaste concreta (no-abstract) de uma classe abstract deve fornecer implementagbes para todos os métodos abstract da superclasse, mas que uma classe abstract nio precisa implementar os métodos ab- stract: da sua superclasse, Uma subclasse abstract. pode “passara bola” para a primeira subelasse concreta, ‘Examinamos a implementagio de interfaces, Lembre-se de que as interfaces podem estender uma outta interface (ou ‘mesmo miltipla interfaces), e que qualquer classe que implemente uma interface deve implementas todos os métodos de todas as interfaces da érvore de heranca da interface que a classe esta implementando, om SOprullo bs Meclaragoes @ Lontrole de Acesso ‘Também vimos os outros modificadores,incluindo static, final, abstract, synchronized e assim por dliante. Voce aprenden como alguns modificadores nunca podem sex combinados em uma declaragio, por exemplo, misturr abstract com final ou private. ‘Tenha em mente que nio existem objetos £ inal. em Java, Uma variive de referéncia mascada como final nunca poderi ser modificada, mas 0 objeto a que se refere pode set modificado. Vorcé viu que final aplicado.a métodos significa que uma subclasse no os poder substituir, , quando aplicado a uina classe, classe Einal aio poder ser subclassificada Lembre-se que, a partir do Java 5, os métodos podem ser declarados com um parimetro var-arg (que pode usar de zero a muitos argumentos do tipo declarado), mas que vocé s6 pode tet um var arg por método, ¢ ele deve sero dltime parimeteo do método, Centfique-sede estar familarizaco com os tamanhos relativos dos primitivos numézicos. Lembre-se de que, enquanto os valores de vasiéveis nio-£inal podem ser modificados,o tipo de uma variivel de referencia nfo pode. Vocé aprendeu também que arrays sio objetos que contém muitasvatiiveis do mesmo tipo, Os arrays podem também Lembre-se do que aprendeu sobre variiveis e métodos static, especialmente que os membros static sio usados pot-classe em vez de por-instincia. Nao se esquesa de que um método static nio pode acessar diretamente uma variivel de instancia a partir da classe onde reside, porque ele no tem uma referéncia explicita a nenhurnainstancia particular da classe, Finalmente, abordamos um recurso novo do Java 5, enums. Um enum uma forma muito mais segura flexivel de se implementar constantes do que era possivel em versGes anteriores de Java. Pelo fato de serem um tipo especial de classe, 08 enums podem ser declarados de forma bastante simples, ou podem ser bem complexos —incluindo atributos tals como. ‘métocios,varkvels, construrores e um tipo especial de classe interna chamada de corpo de clase especifico da constaate. Antes de fazer o teste de treinamento, passe algum tempo com o otimistamente chamado “Excrcicio Rapido”. Voltea ‘onsultar esse teste freqiientemente, a medida que for lendo este livro e especialmente quando estiver perto da prova e voc estivertentando memorizar tanto quanto conseguir. Porque ~e eis aqui o conselho que Voc’ gostaria que sua mie tivesse the dito antes de voct i para. faculdade — nao importa o que voc® sabe, 0 que importa é quanclo voc’ sabe, Para o exame, saber 0 que vocé nao pode fazer coma linguagem Java é tio importante quanto saber o que vocé pode fazer, Experimente as questdes de amostra! Flas sio bastante semelhantes 4 dificuldade e a estrutura das questdes do exame real, € deverio Ihe abrir os olhos para o quio dificil o exame pode ser. Nio se preocupe se errar virias delas, Se voce perceber que tem dificuldade em um t6pico especifico, passe mais tempo revisando-o ¢ estudando-o. Muitos programadores precisam de dduas ou trés leturas sérias de um capitulo (ou um objetivo individual) antes de conseguirem responder as questbes com contin. v Exercicio Rapido Lembre-se de que quando falamos de classes neste capitulo, estamos nos referindo a classes nio-internas, ou classes de nivel ‘mais alto, Dedicaremos todo o Capitulo 8s classes internas, Identificadores (Objetivo 1.3) D Osidentifcadores podem comegar com uma letra, um underscore, ou um catacter monetasio, Depois do primeiro caracter, os identificadores podem incluir também digitos. Q Osidemtiicadores poder tr qualquer extensio. Os métodos JavaBeans devem ser nomeados usando comecar com set. (“define”), get. (“obtém”), ‘camelCase e, dependendo do propésito do método, deve (°€"), add(“adiciona”) ou remove, Regras de declaracao (Objetivo 1.1) Um arquivo de edcigo-fonte x6 pode ter uma classe pibica. Seo arquivo de cédigo-fonte tiver uma classe publica, seu nome teri que coincidir com o dessa classe. OO arquivo 6 pode cerumainstrucio de pacote, porém,vitas de importacio, GA instrugao de pacote (sehouves) deve fear ma primeita ins (fora os comentitos) do arquivo de eéigo-fote OF A instrugio de importagio (se houver) deve vie depois do pacote e antes da declaragio de classe. O Seni houver instrugio de pacote, as instrugdes de importagio terto que ser as primeira (fora 0s comentitios) do arquivo de cédigo-fonte. Gi Asinstrugdes de pacote e deimportagiosio aplicadas a todas as classes do arquivo. OC arquivo pode ter mais de ums classe no publica, JAVAS 41 Os arquivos que nao tiverem classes pablicas nao apresentario restrigdes de nomeacio. Modificadores de acesso a classe (Objetivo 1.1) C1 Hitrésmodificadores de aceso:public, protectede private O Hi quatto iveis de acesso: public, protected, default eprivate. Oi As classes s6 podem teracesso public oudefault. C1 Avisibilidade das classes gir em tomo de seo cOdigo de uma classe pode: C1 Ceiar uma instinca de outra classe 1 Bstendee (ou crar subclasses) outa classe 1D Acessar métodos e variveis de outea classe Modificadores de classe (nao referentes a acesso) (Objetivo 1.2) ‘As classes também podem ser alteradas com final, abstract ou strict fp, Uma classe no pode ser final eabstract. Uma classe final no pode ter subclasses. Umaclasse abstract ado pode ser instanciada, Uma classe com somente um método abstract. significa que a classe inteira deve ser abstract. Uma classe abstract pode ter métodos abstracts ounio. oocooooo [A primeira classe concreta aestender uma classe abstract teri que implementar todos os métodos abstracts, Implementacao de interfaces (Objetivo 1.2) C1 Asinterfaces sio contratos que definem o que a classe poder fazer, mas ndo dizem nada sobre a maneira pela qual el devers feo, Asiinterfaces podem ser implementadas por qualquer classe, de qualquer érvore de heranga, ‘Alinterface é como uma classe 100% abstract,e seri implicitamente abstract caso vocé digite ou noo modificadorabstract nadeclaragio. a a Uma interface sé pode ter métodos abstracts, nenhum método conereto€ permitide, a ‘Os métodos das interfaces sio, por padrio, public eabstracts —adeclaragio explicita desses modificadores € copcional o As interfaces podem ter constantes, que sio sempre implicitamente public, statice final. o [As declaragies da constante de interface com publ ic, static ¢ final sto opcionais em qualquer combinagio. o Uma classe de implementagio nlo-abstract vilida teas propriedades a seguir: 1 Fornecer implementagies concretas dos métodos da interface Deve seguis todas as regeas de sobrecarga vidas para 0s métodos que implementa 0 Nio deve declararnenhuma excegio nova do método de implementagao. G1 Nio deve declararnenhuma exceso que sca mais abrangente do que as delaras no mérodo da interface. O Pode declara excegdes de tempo de execucio em qualquerimplementa¢io de método da interface, independente do que constar na declaracio da interface. Deve mantera assinatura (so permitidos retornos covariantes)« 0 tipo de retorno exatos dos métodos que implementa (mas no precisa declararas excegdes da interface), Uma classe que estiver implementando uma interface pode ela proptia ser abstract. Uma classe de implementagio abstract: nio precisa implementar os métosios da interface (masa primeira subclasse conereta precisa) OA classe sé pode estender uma classe (sem heranga miltipla), porém, pode implementar vétis. OF Asinterfaces podem estender uma ou mais interfaces. 0 Asinterfices aio podem estender uma classe ou implementar uma classe ou interface © Quando fizer o exame, verifique seas declaracies de interface e classe slo vilidas antes de verificar outras Tigicas do c6digo. 42 Capitulo 1: Declaracoes e Controle de Acesso Modificadores de acesso a membros (Objetivos 1.3 e 1.4) O Os métodos eas vasiiveis de instancia (aio locais) sio conhecidos como “membros”. C1 Os membros podem usar todos os quatro niveis de acesso: public, protected, default, private. OO acesso aos membros se dé de duas formas: 1 Océdigo de uma clase pode acessar um membro de outra classe Una subclasse pode herda um membeo de sua superclasse Se uma classe no puer ser acesaa, seus membros também aio poderio, A visibilidade da classe deve ser determinada antes da dos membros. (Os membros pub] ic podem ser acessados por todas as outras classes, mesmo de pacotes diferentes. ‘Se um membro da superclasse for publ ic, a subelasse o herdat wdependente do pacote ‘Osmembros acessados sem 0 operador ponto () tém que pertencer& mesma cass. this sempre referenciario objeto qu estiver sendo executado no momento this.aMethod( ) €o mesmo que simplesmente chamar aMethod ( ) ‘Osmembros private s6 podem ser acessados por um eédigo da mesma classe. Os membros private ilo ficam visfves para as subclasses, portanto, nfo podem ser herdados. ocoooccooooono Osmembros default eprotect sé diferem quando subclasses estio envolvidas © Osmembros default s6 podem ser acessados por outras classes do mesmo pacote, G Osmembros protect podem sex acessados por outras lasses do mesmo pacote, além de por subclasses, independence do pacote O protect = pacote + kids (kid sigifcando subclasses Por subclasses externas 20 pacote,o membro protect sé pode ser acessado através da heranca: uma subclasse externa a0 pacote nllo pode acessar um membro protect: usando a referéncia a uma instincia da superclasse em ‘outras palavras, a heranga éo tinico mecanismo para uma subelasse externa a0 pacote acessar um membro protect desua superclasse) Q Ummembro protect herdado por uma subclasse de outzo pacote nio pode ser acessado por nenhuma outa classe do pacote da subclase, exceto pelas préprias subclasses dessa, Varidveis locais (Objetivo 1.3) OAs dedlaaees de variveis locas (de métode, automatics, de pilha) io podem tet modifcadores de aesso. Q £inal éo tinico modificador disponivel para variiveis locais. Asvariiveislocais nao recebem valores padio, portanto, devem ser inicializadas antes do uso. Outros modificadores - membros (Objetivo 1.3) 0 Osmétodos final aio podem ser sobrecarregados em uma subclass. Osmétodos abstract: foram declarados, com uma assinsturs um tipo de retorno e uma clausula throws opcional, ‘mas no foram implementados OF Osmétodos abstract terminam com um ponto-e-virgula,¢ aio chaves. Hi tts mancimas de identificar um método néo abstract 1 O método no é marcado como abstract. DO método possu chaves. DO método possui um eédigo entre as chaves OF A primeira classe nio-abstrata (concreta)aestender uma classe abstract deve implementar todos os métodos ab- stract dessa OO modificador synchronized 6 aplicado a métodos ea blocos de cddiga OF Osmétodos synchronized podem ter qualquer controle de acesso e também serem marcados como final. O Osmétodosabstract devem ser implementados por uma subclass, portanto, tém de set hetdados, Por essa tazio: O Osmétodos abstract nio podem ser private. © Os métodos abstract aio podem ser final, JAVAS 43 1D O modificador nat ive s6 éaplicado a métodos. C1 O modificador strict p s6 éaplicadoa classes e métodos. Métodos com Argumentos Variéveis (var-args) (Objetivo 1.4) 1D A pant de Java 5, 05 métodos podem declarar um parimerro que aceita de zero a virios argumentos, é 0 chamado metodo vararg, O_Um parimeteo var-arg édeclarado com a sintaxe tipo... rome; por exemplo: dostuff (int... x) { } Um método var-arg s6 pode ter um parimetzo var-atg, Dm métodos com parimetros normais ¢ um var-arg, o var-arg deve vir por tltimo. Declaragées de Variéveis (Objetivo 1.3) D1 Asvariveis de instincia podem: CO Terqualquer tipo de controle de acesso O Setem marcadas como final ou transient As vasives de instinci ndo podem ser declaradas com abstract, sychronized, nativeoustrictfp. 1D fevilido declarar uma varidvel local como mesmo nome de uma varivel de instancia; isso & chamado de “sombreamento”, OF Asvasiveis €inal apresentamas seguintes propriedades: Nao podem se reinicilizadas, uma vez que tverem um valor atibuido, CD Asvatiiveis de referéncia final nio podem referenciar um objeto diferente se ja tiverem um objeto atribuido a chs. LD Asvasiiveis de referéncia £inal devem serinicalizadas antes que a execugio do construtorseja conchuida. 1 Nioexistem objetos £inal. Uma eferénciaa objeto marcada como final. ito sejainalterivel, 10 significa que o objeto propriamente © Omodificador transient s6 pode ser aplicado a variiveis de instincia © Omodificador volatile 36 pode seraplicado a varveis de instincia, Declaragées de Arrays (Objetivo 1.3) © Os arrays podem atmazenar tipos primitives ou objetos, mas o array propriamente dito € sempre um objeto, Quando woo! declara um array, os colchetes podem iar exqueda ou dteta do nome da vase C1 Nunes vildo inclu o tamanbo do array na declaracio. 1 Uim array de objetos pode armazena qualquer objeto que passe no este £-UM (owinstanceof pat tip decarado do Mi Poresompla se Horse een Animal ento wm objeto Hors pode ser clocado erm um aray de Animal Variaveis e métodos static (Objetivo 1.4) 1 Nao sioassocados a nenbma instincia expeciia da classe Nioénecessizia a existéncia da instincia de uma classe para que os membros static desta sejam usados. G Shaver uma cépia da variivel ou classe Static ¢ todas as instincias « compartilhario, OF Osmétodos static ado tém acesso direto a membros nao-static Enums (Objetivo 1.3) 1D Umenum especifica uma lista de valores constantes que podem ser atribuidos a um determinado tipo. Umenum nioé uma Suing nem um int; tipo constant de um enum €0 tipo do préprio enum . Por exemplo, INVERNO, PRIMAVERA, VERAO e OUTONO sio do rp enum Estagio, © Um enum pode set declarado fora ou dentro de uma classe, mas nao em um método. G Umenum declarado fora de uma classe ndo pode ser marcado com static, final, abstract, pro- tected ou private. eee GOES © ONION GE ACESSO- 1D Osenums podem conter construtores, métodos, ¥ veise compos de classes constantes. OF As constantes enum podem caviar argumentos para o construtor enum, usando a sintaxe BIG(®), onde o literal int. 8 € passado 20 construtor enum. 1 Os construtores enum podem ter argumentos e podem ser sobrecsrtegados, © Os conserutores enum na podem ser chamados diretamente no cédigo. Ele sio sempre chamados aautomaticamente quando um enum ¢ incializado OO ponto-e-vigula a0 final da declaragio de um enum é opcional. Ambossiovilios: fenun Feo ( ONE, TWO, THREE} enum Foo { ONE, TWO, THREE}; Teste Individual As seguintes questies oajudatio a avaliar sua compreensio do material apresentado neste capitulo, Leia todas as opies ccuidadosamente, porque poder haver mais de uma resposta correta, Selecione todas as respostas corretas para cada questio, ‘Mantenhao foco, Caso tenha dificuldades com as perguntas no inicio, ndo se desespere. Pense positvo, Repita boas afirmagdes pata si mesmo do tipo “Eu sou inteligente o sufciente para entender enum” e “Tudo bem, aquele cara ali entende mais de enum do que eu, mas aposto que cle ndo consegue como eu. I. Dado o seguinte cédigo =, te 1, interface Base { a) jer 2. boolean mi () et i so 3. byte a2(short 9); ae 3 ~~ (Qual fragmento de cédigo ir compilar? (Marque todas as corretas) A. interface Base2 implements Base ( } Gxe*DE B abstract class Class? extends Base { | mPhemos TL public boolean CBabstract class Class? implements Base { } abstract class Class2 implements Base { Public boolean mi() { return (true); } } E. class Class2 implements Base { ) (Tetum true; } ) boolean ml() {return false; } byte ma(short s) { return 42; } } 2. Qual das seguintes opgées declara uma classe abstract compilavel? (Marque todas corretas.) public abstract class Canine { public Bark speak(); } ublic abstract class Canine { public Bark speak() { } } © public clase Canine { public abstract Bark speak(); } D. public class Canine abstract { public abstract Bark speak); } 3. Qual das seguintes afirmativas esta correta? (Marque todas as corretas.) A. “X estende Y" 6 correto se, e somente se, X for uma classe e ¥ for uma interface B "x estende ¥" € correto se, e somente se, x for uma interface e Y for uma classe JAVAS 45 Ko estende ¥" 6 correto se X ¥ fore anbos classes ou ambos interfaces. D °x estende Y" & correto para todas as combinagdes de x e ¥ sendo classes e/ ou interfaces. 4. Quais das seguintes s4o declaracées validas? (Marque todas as corretas.) int $x; Bint 123; N& int 123; D, int #aim; E, int *percent; F int *divide; wee central_sales_region_Summer_2005_gross_sales; 5. Quais nomes de métodos obedecem ao padrao JavaBeans? (Marque todas as corretas) “I Joc Aaddsize A prey’ 5 val getcust — causa K ) [av el © 95 deleteRep a set => isColorado entry Yeerhes wesse (ste putDimensions 6. Dado o cédigo: 1, class oop { 2. public static void main(string 0) args) { 3 dostute (2); 4 dostutt (2,2); 5} 6. // Snaixa c6digo aqui 1} Qual destas opges,nserdas independentemente na inha 6, iri compar? (Marque todas a corretas) Yi static void dostuff (int... doargs) { } A B static void dostuft (int) dongs) ( ie (0 i © static void dostufs (int doargs...) { } \ D. static void dostuff (int... doargs, int y) { } / Ketatic void dostuff (int x, int... doargs) { }e 7. Quais das seguintes opgées so declaracées validas? (Marque todas as corretas.) short x (J; shore (vi ald sobre Cores x2; egtuder ‘ oes de Arrays D short 22 (51; loves mere 22 C1 Ch aoe FE short [] y2 = (5) \ (ep die 18 DE THAI — ‘40 Capitulo |: Declaracées e Controle de Acesso_ Dado 0 cédigo: 2. enum Animale { 2. DOG(*Woof"), CAT(*meow"), PISH(*burble”) ; 3. String sound; 4. animais(string 6) { sound = 2; } 5.) 6. clase Testnun { 1. static Animas a; 8, public static void main(String] args) { 9. Syaten.out.printin(a.D0¢.eound + * * + a.FISH.sound) 2. } ne) Exttanete como nagirer, yal 0 resuado? ee ee mes & bow estedar seit? vais B. Miltiplos erros de compilaio SOE euums . A complago fala devido um exo nalinha2 D. A complago filha devido aum erro salinha 3 E, A compilago fia devido um exo naliaha 4 F. A.compilacio falha devido a um erro na linha 9 9. Dado o cédigo: ema A { A} 2. clase 22 i Cums wag pode~ ) 3. emma {3 are 4. woid C0) Sekar ctectoo (her locur Ge emmo (DD de um whtodr. 6) , Qa das femasvs io verdes? (Magu ods cores) A. Océdigo compa sl . Seapenas alka 3 orremovda,o bigo comp, feat reise Seas linas 1 €3forem remove, o ig compa YK Sa thas 1 3.5 orem remoias, oc compile Respostas do Teste Individual 1. CeDestio comtetas. Cesti correta porque uma classe abstract niio precisa implementar nenhum dos métodos dda sua interface. D esta correra porque 0 método esti implementado corretamente, Asti incorreta porque as interfaces no implementam nada. B esti incorreta porque as classes no estendem interfaces. Eesti incorreta porque os métodos de interfaces so implicitamente public, entao os métodos sendo. implementados precisam ser public: (Objetivo 11) 2. Besti correta. As classes abstract: nfo precisam ter nenhum método abstract. Acti incorreta porque os métodos abstract devem ser marcados como tais. Cestiincorreta porque nio é possivel rerum método abstract semque a classe seja abstract. Desté incorreta porque a palavra-chave abstract deve virantes do nome da classe, (Objetivo 1.1) JAVA 5 47 3. Cesticonea A. esthincorreta porque as classes implementam interfaces, mas no as estendem. B esti incorreta porque as interfaces, 6 “herdam de” outras interfaces. D estdincorreta com base nas regras anteriores. (Objetivo 1.2) A,CeGsio identificadores vals. B estdincorreta porque um identificador no pode comecar com um digito. D, E eF estio incozretas porque os identificadores deve comegar com $ ou ums letra, (Objetivo 1.3) Be D usam os prefixos vilidos get e is. A, Ce estioincorretas porque add, delete e put nio sio nomes de prefixos JavaBeans padrdes. (Objedivo 1.4) ‘AcE usam sintaxe var-arg vida Be Cusam sintaxe var-arg invilda, eD ¢invaldo porque 0 var-arg deve sero ikimo argumento do método (Objetivo 1.4) 1. A, Bc E sio declaragées de arrays corretas;E é um array tsidimensional, C, De Festio incorretas, nio é possivel incluir o tamanho do seu array em uma declaragiio a nfo ser que vocé também, instancie o objeto array. F usa uma sintaxe de instanciamento invalida. (Objetivo 1.3) Accsti correta; enumms, podem ter construtores e varivels. B, C,D, Ee Festio incorretas; todas essa linhas usam sintaxe correta.(Objetivo 1.3) Dee Festi corretas. A linha 5 € tinica que nio vai compilar, porque os enuums no podem serlocais a um método, A,B, Ce Eestio incozretas com base na afirmagio acima. (Objetivo 1.3) ‘49 Capitulo |: Declaracées e Controle de Acesso

Você também pode gostar