Curso Java - Básico - Conceitos Importantes

Criação e destruição de objetos

  • Para a criação de novos objetos, Java garante que cada classe tenha um construtor: O construtor default
  • Programador pode criar um construtor explicitamente e determinar suas operações de inicialização
  • Objetos são destruídos automaticamente pelo sistema.

Construtores e sobrecarga

  • Construtores default (sem argumentos) só existem quando não há construtores definidos explicitamente no código
    • A criação de um construtor explícito substitui o construtor fornecido implicitamente
  • Uma classe pode ter vários construtores (isto se chama sobrecarga de nomes)
    • Distinção é feita pelo número e tipo de argumentos (ou seja, pela assinatura do construtor)
  • A assinatura é a identidade do método. É pela assinatura que ele se distingue dos outros métodos. Consiste de
    • Tipo de retorno
    • Nome
    • Tipo de argumentos
    • Quantidade de argumentos

Sobrecarga de métodos

  • Uma classe também pode ter vários métodos com o mesmo nome (sobrecarga de nomes de métodos)
    • Distinção é feita pela assinatura: tipo e número de argumentos, assim como construtores
    • Apesar de fazer parte da assinatura, o tipo de retorno não pode ser usado para distinguir métodos sobrecarregados

./images/sobrecargametodos.jpg

  • Na chamada de um método, seus parâmetros são passados da mesma forma que em uma atribuição
  • Valores são passados em tipos primitivos
  • Referências são passadas em objetos

this()

  • Em classes com múltiplos construtores, que realizam tarefas semelhantes, this() pode ser usado para chamar outro construtor local, identificado pela sua assinatura.

    ./images/this.jpg

super()

  • Todo construtor chama algum construtor de sua superclasse
    • Por default, chama-se o construtor sem argumentos, através do comando super() (implícito)
    • Pode-se chamar outro construtor, identificando-o através dos seus argumentos (número e tipo) na instrução super()
    • super(), se presente, deve sempre ser a primeira instrução do construtor (substitui o super() implícito)
  • Se a classe tiver um construtor explícito, com argumentos, subclasses precisam chamá-lo diretamente. Não existe mais construtor default na classe.

this

  • A palavra this é usada para referenciar membros de um objeto

./images/this2.jpg

super

  • super é usada para referenciar os valores originais de variáveis ou as implementações originais de métodos sobrepostos

./images/this3.jpg

./images/this4.jpg

Coleta de lixo (1)

  • Memória alocada em Java não é liberada pelo programador.
    • Ou seja, objetos criados não são destruídos pelo programador
  • A criação de objetos em Java consiste de
    • Alocar memória no heap para armazenar os dados do objeto
    • Inicializar o objeto (via construtor)
    • Atribuir endereço de memória a uma variável (referência)
  • Mais de uma referência pode apontar para o mesmo objeto

./images/garbage.jpg

Coleta de lixo (2)

  • Quando um objeto não tem mais referências apontando para ele, seus dados não mais podem ser usados, e a memória deve ser liberada.
  • O coletor de lixo irá liberar a memória na primeira oportunidade

./images/garbage2.jpg

Finalizadores

  • Existem recursos que o Garbage Collector não pode liberar: como descritores de arquivos e sockets.
  • Neste caso, é necessário ter um método finalizador para liberar esses recursos.
  • Se um objeto tem um finalizador, ele é executado antes do objeto ser eliminado pelo Garbage Collector.

Pacotes e o Espaço de Nomes

  • Pacotes
    • Contém um número qualquer de classes e interfaces, que se relacionam pelo objetivo, escopo ou herança.
    • Seu principal objetivo é controlar a visibilidade de classes e interfaces entre pacotes, evitando colisão de nomes. Podem ser usados também para identificar classes e interfaces.
  • Espaço de Nomes
    • É uma convenção para atribuição de nomes de pacotes. A recomendação da Sun é utilizar seu nome de domínio na Internet com os elementos invertidos.

Pacotes e o Espaço de Nomes 2

  • Um pacote genérico seguindo a convenção proposta pela Sun, teria o seguinte formato:

./images/pacotes.jpg

Especificando e Importando Pacotes

  • O Comando Package
    • Serve para especificar a que pacote uma determinada classe ou interface pertence
  • O Comando Import
    • Este comando torna disponível para o pacote corrente, as classes dos pacotes mencionados após a cláusula import

Resolvendo Nomes e Colisões

  • Quando dois ou mais pacotes são importados para um determinado programa e eles contém classes de mesmo nome isso não representa problemas de colisão caso tais classes não sejam utilizadas
  • No caso de ser necessário fazer referência a uma das classes citadas acima, deve-se fazê-lo de modo explícito para que não haja problemas de colisão. Caso isso não seja feito o compilador enviará uma mensagem de erro, forçando que essa chamada seja explicitada.

API Java 2

  • A API do Java 2 consiste de classes organizadas em pacotes.
  • Pacotes básicos
    • java.lang: classes fundamentais - importado automaticamente
    • java.util: classes utilitárias
    • java.io: classes para entrada e saída
    • java.net: classes para uso em rede (TCP/IP)
    • java.sql: classes para acesso via JDBC
    • java.awt: interface gráfica universal nativa
    • java.text: internacionalização, transformação e formatação de texto

java.lang: Controle e acesso ao sistema

  • Classe System dá acesso a objetos do sistema operacional
    • System.out - saída padrão (java.io.PrintStream)
    • System.err - saída padrão de erro (java.io.PrintStream)
    • System.in - entrada padrão (java.io.InputStream)

A classe java.lang.String

  • É uma seqüência de caracteres imutável
  • Representa uma cadeia de caracteres Unicode
  • Otimizada para ser lida, mas não alterada
  • Nenhum método de String modifica o objeto armazenado
  • Há duas formas de criar Strings
    • Através de construtores, metodos, fontes externas, etc:

./images/string.jpg

  • Através de atribuição de um literal

./images/string2.jpg

  • Strings criados através de literais são automaticamente armazenadas em um pool para possível reuso.
    • Mesmo objeto é reutilizado: comparação de Strings iguais criados através de literais revelam que se tratam do mesmo objeto

Vetores

  • Vetores São Objetos.
  • Vetores de Atributos.
  • Inicialização de Vetores.
  • Vetores Multidimensionais.

Vetores São Objetos

  • Em C, C++, VB e Delphi, vetores são blocos de memória. Nelas pode-se acessar o vetor fora de seu bloco de memória ou antes de sua inicialização, causando resultados imprevisíveis.
  • Em Java, um vetor é um objeto. E como todo objeto tem que ser criado explicitamente.
    • Logo é garantida a inicialização do vetor, assim não é possível acessá-lo além do seu limite.

Vetores de Atributos

  • Vetores são uma seqüência de elementos primitivos ou de elementos que são objetos.
  • Esses elementos são todos do mesmo tipo, e identificados por um nome único.
  • Quando um vetor de tipos primitivos é criado, seus elementos são inicializados automaticamente com valores default.
  • Quando um vetor de objetos é criado, está sendo criado um vetor de referências.
    • Cada referência é automaticamente inicializada com o valor especial null.

Inicialização de Vetores (1)

  • Para definir um vetor, pode ser usada uma das duas formas:
    • tipo[ ] nome;
      • tipo nome[ ];
  • A inicialização pode ser feita do ponto da declaração:

    ./images/vetores.jpg

Inicialização de Vetores (2)

  • O vetor possui um membro intrínseco que pode ser acessado, mas não pode ser modificado. O membro é length, que retorna o tamanho do vetor.
  • O maior índice acessível num vetor é length - 1, já que o primeiro índice é zero.

Vetores Multidimensionais

  • Vetores multidimensionais podem ser facilmente criados:

./images/vetores2.jpg

¥ N