DECLARÇÕES E CONTROLE DE ACESSO • Declarar Classes e Interfaces; • Desenvolver Interfaces e Classes Abstract; • Usar Primitivos, Arrays, Enums e Identificadores Legais; • Usar Métodos Static, Nomeação JavaBeans; • Exercícios; O que é um programa em Java ? É principalmente uma coleção de objetos falando com outros objetos por meio da invocação do métodos uns dos outros. Classe – Um modelo que descreve os tipos de estado e de comportamento que os objetos do seu tipo podem ter. Objeto – é uma instância de uma determinada classe. Essa instância terá o próprio estado e terá acesso a todos os comportamentos definidos pela classe da qual foi criada. (Ex: new CidadeVO();) Estado – Cada objeto terá o seu conjunto único de variáveis de instância conforme definido na classe. Coletivamente, os valores atribuídos às variáveis de instância de um objeto compõem o estado do objeto. Método (COMPORTAMENTO) – ao criar uma classe o programador cria métodos para essa classe. É nos métodos que a lógica da classe é armazenada. Nos métodos, o verdadeiro trabalho é realizado. Identificadores – Todos os componentes de Java – classes, variáveis e métodos - precisam de nomes, esses nomes são conhecidos como identificadores. Herança – Permite ao código definido em uma classe ser reutilizado em outras classes. (SuperClasses, SubClasses, Ex: SuperVO, CidadeVO); Interfaces - É uma espécie de superclasse 100% abstract que define os métodos que uma subclasse deve suportar. OBS: abstract é a forma de obrigar métodos ou classes a serem implementadas em suas classes filhas. Identificadores Abordados na Certificação: Identificadores Legais Convenções de Código Java da Sun Padrões de nomeação JavaBeans Regras dos Identificadores Legais: Devem começar com letras. (Ex: _a, $c, cont); Não podem começar com números. Depois do primeiro caractere pode conter combinação de letras, caracteres de moedas, de conexão (_), e números. Não há limite para número de caracteres de um identificador. Não se pode usar uma palavra-chave Java como identificador .(Ex: final, double, int, ...). Os identificadores Java são case sensitive, ou seja, foo e Foo, são diferentes. A Sun Criou um conjunto de padrões de programação para Java e publicou esse padrões em um documento chamado “Convenções de Código Java”. Veremos essas convenções a seguir. Ops!!! – As questões do exame não seguem as convenções de código, devido a limitações do programa de provas que usado para ministrar o exame internacionalmente. Exemplo de Código: Class Wombat implements Runnable { private int i; public synchronized void run() { if (i%5 != 0) { i++; } for (int x=0; x<5; x++; i++) { if (x > 1) thread.yield(); } System.out.print(i + “ ”); } Public static void main(String[] args) { Wombat n = new Wombat(); for ( int x=100; x>0; --x) { new thread(n).start();} }} O único padrão que é seguido tanto quanto possível no exame real é o dos padrões de nomeação. Como: • Classes e interfaces - Primeira letra maiúscula e, se várias palavras forem escritas juntas a primeira letra de cada palavra deve ser maiúscula (formato inglês de “camelCase”). Para Classes os nomes devem ser substantivos. Ex: Impressora, Conta, ... • Métodos - A primeira letra deve ser minúscula, o formato camelCase deve ser usado. Ex: getBalanco, getNomeCliente; • Variáveis – segue as mesmas regras dos métodos. • Constantes: São criadas marcando-se variáveis como static e final. Devem ser nomeadas usando-se letras maiúsculas e (_) como separador de palavras. Ex: ALTURA_MINIMA; JavaBeans são classes Java que têm propriedades. Propriedades são como variáveis de instância private. Sendo assim a única maneira pela qual podem ser acessadas de fora da sua classe é através de métodos da classe. (setter , getter); Segue as Regras de nomeação de propriedades JavaBeans para o exame: • getSize() prefixo get, seguido pela primeira letra maiúscula; • Boolean – get ou is. Ex: getMaior(); ou isMaior(); • setSize() prefixo set, seguido pela primeira letra maiúscula; • public void setNomeAluno(String nome){...}; • public String getNomeAluno () {..} Escrevendo código Java estamos escrevendo classes ou interfaces. Dentro dessas classes temos variáveis e métodos, onde a forma como isso tudo é escrito pode afetar drasticamente o comportamento do código. Uma prova disso são métodos do tipo public ou do tipo private, ambos podem causar grandes diferenças na execução do código. Deve existir somente uma classe public em cada arquivo de código-fonte. Os comentários podem aparecer em qualquer lugar do código-fonte. São independentes de quaisquer regra. Se houver uma classe public no arquivo o nome do arquivo deve ser o mesmo da classe. Ex: public class Cidade{}, Cidade.java; Declaração de pacote deve estar na primeira linha do código-fonte, e as importações logo abaixo. Um arquivo pode ter mais de uma classe não-public. Arquivos que não possuam classes public podem ter o nome diferente das classes do arquivo. Seque a declaração de uma Classe simples. Ex: class minhaClasse{ } É possível adicionar modificadores antes da declaração da classe. Ex: public classe MinhaClasse {} Existem duas categoria de modificadores: De acesso: public, protected, private; Que não se referem a acesso: strictfp, final, abstract; Quando dizemos que uma classe A tem acesso a uma classe B, estamos dizendo que, a classe A pode instanciar a Classe B, pode estender a classe B, pode também acessar a classe B, dependendo do controle de acesso dos métodos e variáveis dessa classe. Consiste em a classe não possuir modificadores precedendo-a na declaração. Ex: class Estado{} É um acesso restrito ao nível de pacote, onde uma classe com acesso default só pode ser vista (acessada) por classes de dentro do mesmo pacote. Ex: package financeiro; class ContasPagar {} Observe o segundo arquivo: package venda; import financeiro.ContasPagar; class Venda extends ContasPagar { } Erro: Can`t acess class financeiro.ContasPagar. Class or interface must be public, in same package, or an acessible member class. A declaração de uma classe com a palavra-chave public dá a todas as classes de acesso, de todos os pacotes, acesso público à classe. Sendo indispensável ainda a importação dessa classe. Considerando o exemplo anterior (Acesso Default), como poderíamos corrigir o erro apresentado: package financeiro; public class ContasPagar {} package venda; import financeiro.ContasPagar; class Venda extends ContasPagar { } O programado pode modificar uma classe usando as palavras-chave final, abstract, ou strictfp. Esse modificadores existem em adição a qualquer controle de acesso. Então é possível declarar uma classe como public e final ao mesmo tempo. Mas não é sempre que isso ocorre. É possivel marcar uma classe como final e strictfp ao mesmo tempo, mais nunca, marcar uma classe como final e abstract. Considerações strictfp => página 8. Usando na declaração de sua classe a palavra-chave final , você está classificando sua classe em questão a não permitir que ela possa ser subclassificada. Em outras palavras jamais outra classe poderá estender uma classe final. Caso o faça ocorrerá uma exceção. Por que criar uma classe final ? Para uma garantia absoluta de que nenhum dos métodos dessa classe jamais vai ser substituído. Um exemplo disso são as classes das bibliotecas fundamentais do Java, como a classe String. Sendo assim use final para segurança. Uma classe definida com abstract nunca poderá ser instanciada. Sua única função é ser estendia (subclassificada). abstract class Carro { private String cor; private String chassi; public abstract void PotenciaMotor(); public abstract void VelociadadeMaxima(); } Uma interface é um contrato. Você está definindo o que a classe pode fazer, sem mencionar nada sobre como a classe o fará. Uma interface pode ser implementada por qualquer classe, de qualquer árvore de herança. Podendo assim definir que duas classes implemente a mesma interface. Considere uma interface, sendo uma classe 100% abstract. Verificar figura página 11. Regras para declaração de métodos e variáveis em uma interface: Todos os métodos são implicitamente public e abstract; As interfaces só podem declarar constantes e não variáveis de instância. Assim toda variável deve ser definida public, static e final; Já que os métodos são abstract, ele não podem ser marcados como final, native, strictfp ou synchronized; Uma interface pode estender uma ou mais interfaces diferente; Uma interface não pode estender nada que não seja outra interface; Um interface não pode implementar outra interface ou classe; Uma interface deve ser declarada com a palavra-chave interface; Exemplo de declaração de uma interface: public abstract interface CidadeInterface { } O modificador abstract é considerado redundante, as interfaces são implicitamente abstract. O modificador public na declaração da interface é obrigatório de você deseja que ela tenha acesso público e não o default. Já os modificadores public e abstract nos métodos é redundante já que todos os métodos de uma interface são implicitamente public e abstract. Verificar exemplos página 12; Ao colocar uma constante em uma interface, você está garantindo que todas as classes que implementarem essa interface terão acesso a essa constante. Discutir código página 13; Modificadores de Acesso: public; protect; default; private; Modificadores não referente a Acesso. Declarando Enums. Quando um método ou variável é declarado public , isso significa que todas as outras classes, independente do pacote ao qual pertençam, podem acessar o membro em questão (Assumindo-se que a própria classe esteja visível). Ex: Existem três formas de acessar um método: Invocando um método declarado na mesma classe; Invocando um método usando uma referência da classe; Invocando um método herdado; Ex: package venda; import basico.*; class Venda { public static void main (String[] args) { Cidade c = new Cidade(); c.incluir(); } } package basico; public class Cidade { public void incluir() { System.out.println(“DADOS INCLUIDOS”); } } Membros marcados como private não podem se acessados por código em nenhuma outra classe que não aquela na qual o membro private foi declarado. Ex: package basico; public class Cidade { private void incluir() { System.out.println(“DADOS INCLUIDOS”); } } package venda; import basico.*; class Venda { public static void main (String[] args) { Cidade c = new Cidade(); c.incluir(); } } Erro: cannot find symbol Symbol : method incluir() E se uma subclasse tentasse herdar um membro private da sua superclasse ? Quando um membro é declarado private, uma subclasse não pode herdar dele. Assim uma subclasse não pode ver, usar e nem sequer pensar nos membros private da sua superclasse. Os níveis de controle de acesso protect e default são quse idênticos, mas com uma diferença fundamental. Um membro default só pode ser acessado se a classe que o estiver acessando pertencer ao mesmo pacote, enquanto que um membro protect pode ser acessado (atráves da herança) por uma subclasse mesmo se a subclasse estiver em um pacote diferente. Exemplo página 19. Quando criamos uma variável de instância protect, ela se torna acessível para todas as classes do pacote onde está a classe na qual ela foi criada, bem como herdável por quaisquer subclasses de fora do pacote, ou seja, subclasses da classe onde foi criada a variável terão acesso a essa variável, podendo essas subclasses estarem fora do pacote da mesma. Exemplo página 20 e 21. Quando uma subclasse, de fora do pacote herda um membro protect, esse membro torna-se essencialmente private dentro da subclasse, de forma tal que apenas a subclasse e as suas subclasses podem acessá-los. Pacote A Parente protect variável x Pacote B herda Filho private variável x Sobrinho new Filho(); x não é acessível Exemplo de código usando Default: package basico; public class Cidade { int x = 9; } package basico; public Estado extends Cidade{ static public void main(String[] args) { System.out.println(“variavel x = ” + x); } } Se mudarmos o pacote da segunda classe, ocorre o seguinte erro de compilação: Estado. Java:4: Undefined variable: x System.out.println(“variavel x = ” + x); 1 error A palabra-chave final impede que um método possa ser substituído em uma subclasse, e frequentemente é usada para forçar os recursos API de um método. Exemplo disso é a classe String, nã0 é possível subclassificar essa classe, ou seus métodos, devido a argumentos final em seus métodos. Esse argumento pode ser usado também em variáveis, quando isso ocorre essa variável passar a não poder ser alterada, quanto ao seu valor. É um método declarado, mas não implementado. Um método é marcado como abstract quando se quer forçar as subclasses a fornecer a implementação deste. Ex: public abstract void doIt(); Obs: É inválido ter um único método abstract que seja em uma classe que não seja declarada explicitamente como abstract. Porem o inverso é permitido, ou seja, possuir uma classe abstract e dentro dela possuir métodos que não sejam abstract. A primera subclasse concreta (não-abstract) de uma classe abstract deve implementar todos os métodos abstract da superclasse. Exemplo página 25. A palavra-chave synchronized indica que um método só pode ser acessado por um thread de cada vez. Essa questão será tratada no capítulo 9. Basta apenas saber que esse modificador só pode ser aplicado a métodos – não a variáveis, nem classes, apenas a métodos. Ex: public synchronized Record retrieveUserInfo (int id){} O modificador native indica que o método está sendo implementado dependente da plataforma, freqüentemente em C. Não é necessário saber como usar métodos nativos para o exame, apenas saber que native é um modificador e que native só pode ser aplicado a métodos – não a classes, nem variáveis, apenas a métodos. Existem dois tipo de variáveis em Java: primitivos – um primitivo pode ser de oito tipos diferente: char, boolean, byte, short, int, long, double ou float. Uma vez declarado o seu TIPO primitivo não pode nunca ser alterado, embora seu valor possa se modificar. variáveis de referência – são usadas para se referir a um objeto. Esse contexto será melhor abordado no capítulo 2. byte b; boolean isNovo; int x, y, z; Object o; Dog minhaNovaReferencia; String s1, s2, s3; São definidas dentro da classe porem fora de qualquer método, e só são inicializados quando a classe é instânciada. class Pessoa { // Defini campo (variáveis de instância) para a // instância de Pessoa. private String nome; private String sobrenome; private String enreco; } Para o exame você precisa saber que as variáveis de instância: podem usar todos os níveis de acesso; podem ser marcadas como final e transient; não podem ser marcadas como: abstract, sinchronized, strictfp, native, static. São aquelas variáveis declaradas dentro de um método. Isso significa que a variável não é apensa inicializada dentro do método, mas também declarada dentro dele. Ela é inicializada e destruída quando o método inicia e logo após quando ele é finalizado. Declarar uma variável com a palavra-chave final impossibilita a reutilização dessa variável depois de ela ter sido inicializada com um valor explícito. Isso significa, que depois que uma variável final receber um valor, esse valor não poderá ser alterado novamente. Se marcar uma variável de instância como transient, você está dizendo à JVM para ignorar essa variável quando você tentar serializar o objeto que a contém. Serialização foi adicionada ao exame na versão 5 do Java, e será estudado no capítulo 5. Diz à JVM que um thread que acesse a variável deve sempre reconciliar a sua cópia private da variável com a cópia master presente na memória. Como é que é? Não se preocupe no exame tudo que você precisa saber é que , assim como transient, esse modificador só pode ser aplicado a variáveis de instância. É usado para criar variáveis e métodos que irão existir independentemente de quaisquer instância criadas para a classe. Membros static existem antes mesmo de você criar uma nova instância de uma classe. Permite restringir uma variável para ter um de apenas uns poucos valores pré-definidos, em outras palavras, um valor de uma lista enumerada. Ex: enum Cafe {PEQUENO, MEDIO, GRANDE} Para pegar o valor, será necessário: Cafe cf = Cafe.PEQUENO; Um ENUM pode ser declarado como as suas próprias classes separadas, ou como membros de classes, mas não podem ser declarados dentro de um método. Isso pode modificar a forma como acessar um ENUM. Exemplo página 36 e 37. Página 44 – Teste Individual (9 Questões).