Orientação a Objetos e a Linguagem Java Afrânio Assis [email protected] Novembro/2006 1 Encapsulamento e Visibilidade Novembro/2006 2 Introdução • Cenário de uso de software – De um lado, programadores de bibliotecas – Do outro, programadores clientes • Por que esconder a implementação dos programadores clientes? – Eles não precisam reescrever código – Programadores de bibliotecas tem liberdade de modificar código interno sem se preocupar se o código dos usuários vai compilar Novembro/2006 3 Introdução • Como evitar que um objeto altere as variáveis de um outro objeto? • Como definir os métodos de objeto que são apenas de uso interno? • Precisamos de especificadores de acesso Novembro/2006 4 package • Antes de definirmos os especificadores de acessos precisamos conhecer o conceito de pacote – Um conjunto de classes sobre algum domínio – Ex: biblioteca de elementos gráficos, biblioteca matemática • import import java.util.*; – Mecanismo para gerenciar espaço de nomes – Através do import podemos distinguir a Classe A da biblioteca X da classe A da biblioteca Y Novembro/2006 5 package • Um arquivo fonte implica em uma unidade de compilação – extensão “.java” – uma única classe pública, outras são de suporte – compilação gera “.class” • Em cada arquivo fonte devemos definir a qual pacote as classes daquele arquivo pertencem. package figuras.quadrilateros; public class Quadrado { } package figuras.quadrilateros; public class Retangulo { } Novembro/2006 6 package • Quando não definimos um pacote, as classes pertencerão ao package default, que é formado por todas as classe do “diretório corrente” Novembro/2006 7 package • A estrutura de diretórios na qual uma classe se encontra deve respeitar o pacote definido para ela. Por exemplo, seja o pacote: package figuras.quadrilateros; public class Quadrado { } • A classe Quadrado deve estar no diretório: ...\figuras\quadrilateros Novembro/2006 8 package • Para usar a classe Quadrado devemos fazer um import no início do programa import figuras.quadrilateros.Quadrado • A JVM usa a variável de ambiente CLASSPATH para localizar classes importadas. • Na JVM o diretório atual sempre faz parte do CLASSPATH. • Quando adicionamos uma library ao nosso projeto no JDeveper ela é inserida no CLASSPATH do projeto. Novembro/2006 9 package • O que acontece se duas bibliotecas importadas via “*” definem a mesma classe X? – se você não usa a classe X, tudo bem! – se não, usar o nome qualificado (completo) da classe Novembro/2006 10 Especificadores de Acesso Especificadores: public, private e protected • Nenhum especificador: “friendly” ou “package” – Todas as classes X do mesmo pacote da classe A têm acesso aos membros (métodos e atributos) de A – Todas as classes X externas ao pacote da classe A não têm acesso aos membros de A • mesmo que sejam subclasses de A • public: membros “disponíveis para todo mundo!” Novembro/2006 11 Especificadores de Acesso • private: “não disponibilizo para ninguém!” – Ninguém pode acessar, apenas a própria classe – Útil para UM programador de biblioteca • “package” é útil para TODOS programadores de biblioteca – Boas práticas de programação: • Objetos como caixas-pretas • O acesso deve ser liberado apenas quando for necessário Novembro/2006 12 Especificadores de Acesso • protected: “somente para filhos” – Classes filhas têm acesso aos membros da classe mãe. – Além disso, todas as classes X do mesmo pacote da classe A têm acesso aos membros de A. Novembro/2006 13 Especificadores de Acesso Especificador classe subclasse classes classes A de A pacote mundo private ok protected ok ok ok public ok ok ok “friendly” ok ok* ok ok • * apenas se estiver declarada no mesmo pacote Novembro/2006 14 Especificadores de Acesso • Construtores – Se private, criação de objetos apenas pode ser feita dentro da classe – Se protected, apenas subclasses e classes do mesmo pacote (além da própria classe) podem criar objetos utilizando o construtor • Variáveis locais – Usar modificadores de acesso dentro de métodos é ilegal e não faz sentido (pois variáveis locais só têm escopo local) Novembro/2006 15 Acesso de Classes • Especificadores de acesso para classes – Determinam se uma classe pode ser vista dentro de outro pacote (public) ou não (“friendly”) • Restrições – Uma única classe pública por unidade de compilação – Nome da classe pública exatamente nome do arquivo Novembro/2006 16