Para baixar este livro acesse a página de DOWNLOADS.
Professor: Gleidson Porto
Complemento das aulas de Linguagem de Programação II
Aluno: Eron Targino da Silva
NOÇÕES DE Orientação a Objetos
Em geral quando estivermos desenvolvendo aplicativos (programas) iremos trabalhar com duas ou mais classes, cada uma contendo um ou mais métodos.
1 - Classes (class), Objetos, Métodos e Atributos (variáveis de instância).
CLASSE é um modelo para criar objetos.
Objetos são instâncias de uma classe.
Um objeto tem atributos que são carregados com o objeto quando ele é utilizado em um programa. Esses atributos são especificados com parte da classe do objeto.
Por exemplo, um objeto conta bancária tem um atributo 'saldo', que representa a quantidade de dinheiro na conta. Cada objeto 'conta bancária' sabe o saldo da conta que ele representa, mas não sabe o saldo de outras contas no banco. Os atributos são específicados pelas variáveis de instância da classe.
ATRIBUTOS são campos do objeto, declarados fora de qualquer método e inicializados quando é instanciado um objeto da classe.
Todo método pode especificar parâmetros que representam informações adicionais que o método exige para realizar corretamente sua tarefa. Uma chamada de método fornece argumentos aos parâmetros do método.
Para realizar uma tarefa em um programa é necessário um método. O MÉTODO descreve os mecanismos que realmente realizam suas tarefas. O método oculta de seus usuários as tarefas complexas que ele realiza.
Outro exemplo poderia ser uma classe Carro, onde teríamos Atributos como (Chassi, Placa e Cor) e os métodos (Ligar e Desligar). Um objeto dessa classe seria Fusca.
Palavra reservada para criar objetos: NEW
Por exemplo, um classe que representa uma conta bancária (Figura1) poderia conter um método para fazer depósitos de dinheiro em uma conta, outro para fazer saques e um terceiro para perguntar qual é o saldo atual. Em uma classe podemos fornecer um ou mais métodos.
Em nossos exercícios utilizaremos a IDE Eclipse.
IDE (Integrated Development Environment), um ambiente integrado para desenvolvimento de software.
Exemplo Conta bancária (Figura1)
2 - Declarando uma classe com um método e instanciando um objeto de uma classe
Na seção anterior você criou uma classe ContaBancaria, e então utilizou essa classe para sacar e depositar. Nesta seção, você criará uma nova classe e irá usa-lá para criar um objeto. Iremos criar a classe Banco.
A classe ContaBancaria (Declarada no arquivo ContaBancaria.java) será utilizada para sacar e depositar de uma conta bancária. A classe Banco (Declarada no arquivo Banco.java)é uma classe de aplicativos no qual o método main utilizará um objeto da classe ContaBancária. Cada declaração de classe que inicia com a palavra- chave public deve ser armazenada em um arquivo que tenha o mesmo nome da classe e terminar com a extensão de nome de arquivo .java. Dessa forma, as classe ContaBancaria e Banco devem ser declaradas em arquivos separados, porque cada classe é declarada public.
Lembre-se de que main é um método especial (executável) que sempre será chamado automaticamente pela JVM (Java Virtual Machine)quando você executar um aplicativo.
Para instanciar um objeto de uma classe temos que gerar os getters e setters dos atributos 'saldo e numero' declarado na conta bancaria.
Os atributos são representados como variáveis em uma declaração de classe. Essas variáveis são chamadas campos e estão declaradas dentro de uma declaração de classe, mas fora do corpo das declarações de método da classe. Quando cada objeto de uma classe mantém sua própria cópia de um atributo, o campo que representa o atributo também é conhecido como uma variável de instância - cada objeto (instância) da classe tem uma instância separada da variável na memória. O Exemplo nesta seção demonstra uma classe ContaBancária que contêm uma variável de instância saldo para representar o saldo de um objeto ContaBancaria particular.
2.1 - A Classe ContaBancaria (Figura2), com uma variável de instância, um método set e um método get.
Em nosso próximo aplicativo (Figura2), a classe ContaBancaria mantém o nome do saldo com uma variável de instância para que ele possa ser utilizado ou modificado a qualquer hora durante a execução de um aplicativo. A classe contém dois métodos - setSaldo e getSaldo. O método setSaldo armazena o valor de um saldo de uma ContaBancaria. O método getSaldo obtém o saldo de uma ContaBancaria. O método agora obtém o saldo da conta chamando outro método na mesma classe - getSaldo (retorna o saldo).
Exemplo Classe ContaBancaria (Figura2)
Criando os métodos getters e setters e verificanso se a saldo na conta.
Implementando a classe pública Banco e instanciando os objetos da ContaBancaria
MÉTODO CONSTRUTOR
Cada classe que você declara pode fornecer um método especial chamado construtor que pode ser utilizado para inicializar um objeto de uma classe quando o objeto for criado. De fato, o Java requer uma chamada de construtor da classe correspondente para inicializar o objeto. A chamada é indicada pelos parênteses depois do nome da classe. Um construtor deve ter o mesmo nome que a classe.
Por padrão, o compilador fornece um construtor padrão sem parâmetros em qualquer classe que não inclui explicitamente um construtor. Quando uma classe tem somente o construtor padrão, suas variáveis de instancia são inicializadas de acordo com seu valores padrões.
Ao declarar uma classe, você pode fornecer seu próprio construtor a fim de especificar a inicialização personalizada para objetos de sua classe.
Por exemplo, talvez você queira especificar a placa de um objeto Vectra quando o objeto é criado, como em:
HERANÇA, POLIMORFISMO E INTERFACES UTILIZANDO JAVA
1 Objetos, Construtor e Herança
Objetos e Construtor
Objetos são criados através da declaração new, seguida de um método construtor.
Exemplo:
Automovel gol1 = new Automovel(“Gol III”);
Uma classe pode ter construtores especializados ou somente o construtor default (gerado pelo compilador);
Um construtor recebe sempre o mesmo nome da sua classe;
O método construtor gera uma instância do objeto em memória e o seu código é executado imediatamente após a criação do objeto provendo-lhe um estado inicial; Quando declaramos variáveis de qualquer tipo primitivo (boolean, byte, short, char, int, long, float, ou double) o espaço em memória (na área de dados) é alocado como parte da operação.
A declaração de uma variável referência a um objeto não aloca espaço em memória.
A alocação de memória (no heap) é feita somente quando o objeto é criado.
Considere o exemplo abaixo:
Automovel gol;
gol = new Automovel();
• O primeiro comando, a declaração, aloca apenas o espaço suficiente para a referência. O segundo, aloca o espaço para os atributos do objeto gol.
• Somente após a criação do objeto é que seus membros (atributos e métodos) podem ser referenciados.
Herança
É uma forma de reutilização de software em que uma nova classe é criada absorvendo membros de uma classe existente e aprimorada com capacidades novas ou modificadas. Com a herança, você pode economizar tempo durante o desenvolvimento de um programa baseando novas classes no software existente testado, depurado e de alta qualidade. Isso também aumenta a probabilidade de que um sistema será implementado e mantido efetivamente.
Ao criar uma classe, em vez de declarar membros (atributos e métodos) completamente novos, você pode designar que a nova classe deve herdar membros de uma classe existente.
A classe existente é chamada de superclasse e a nova classe, de subclasse. Cada subclasse pode torna-se uma superclasse para subclasses futuras.
Uma subclasse pode adicionar seus próprios campos e métodos. Portanto, uma subclasse é mais específica que sua superclasse e representa um grupo mais especializado de objetos. A subclasse expõe os comportamentos da sua superclasse e pode adicionar comportamentos que são específicos à subclasse.
Herança - terminologia
• estender = criar uma nova classe que herda todo o conteúdo da classe existente.
• superclasse = uma classe progenitora ou “base”.
• subclasse = uma classe filha que herda, ou estende, uma superclasse.
this é uma palavra-chave usada num método como referência para o objeto
corrente.
• ela tem o significado de: “o objeto para o qual este trecho de código está sendo
executado”.
super é uma palavra chave usada numa subclasse como referência para membros
da superclasse.
• ela tem o significado de: “a superclasse da classe corrente”.
Polimorfismo (Várias formas)
Ocorre quando uma classe possui um método com o mesmo nome e assinatura (número, tipo e ordem de parâmetros) de um método na sua superclasse;
Toda vez que isto ocorrer, a máquina virtual irá executar o método da classe mais
especializada (a subclasse) e não o método da superclasse. Note que esta decisão ocorre em tempo de execução;
Polimorfismo ocorre também quando existem dois métodos com mesmo nome, na mesma classe com e assinaturas diferentes. O método será escolhido de acordo com o número de parâmetros, tipo ou valor de retorno esperado. Note que esta decisão ocorre em tempo de compilação.
Membros com mesmos identificadores substituem membros herdados.
• Os membros definidos na superclasse podem ser acessados na subclasse através
do qualificador super.
• Métodos declarados como final não podem ser redefinidos.
• Métodos abstratos devem ser redefinidos ou declarados como abstratos.
Polimorfismo Sobrescrita e Sobrecarga
O Java permite que você tenha métodos com o mesmo nome, mas com assinaturas diferentes, isto chama-se sobrecarga. O interpretador determinará qual método deve ser invocado pelo tipo de parâmetro passado. Os trecho abaixo é válido para uma compilação Java.
1. ...
2. public void print( int i ) { ... }
3. public void print( float f ) { ... }
4. public void print( String s) { ... }
5. ...
Quando você escreve o código para chamar um desses métodos, a chamada deverá coincidir com tipos de dados da lista de parâmetros de algum dos métodos.
Diferente da sobrecarga, a sobrescrita acontece quando um método existe em uma classe ? pai ? e é reescrito na classe ? filha ? para alterar o comportamento. A assinatura do método deve ser igual na classe ? pai ? e na classe ? filha ?. Como um exemplo abaixo está o código desenvolvido na seção this e super.
O método public int lançar (int numero) existe na classe filha e na pai, o primeiro a ser invocado é o Filho, e, via a palavra chave super, o interpretador chamará o método pai. Caso não houver o comando super.lançar (numero); o método pai não seria invocado.
POLIMORFISMO SOBRECARGA
POLIMORFISMO SOBREESCRITA
INTERFACES
Interfaces são conjuntos de métodos vazios (não implementados) e constantes. As interfaces não possuem atributos e interfaces são, de forma simplificada, como roteiros a serem seguidos pelas classes que a implementam. Quando uma classe implementa certa interface ela deve implementar cada um dos seus métodos.
Encapsulamento
Outro benefício importante da OOP reside no chamado encapsulamento. Este consiste na habilidade de efetivamente isolar informações do restante do programa. Isto traz uma série de vantagens. Uma vez concluída uma classe intricada, por exemplo, é virtualmente possível esquecermos suas complicações internas, passando a tratá-la através de seus métodos. Ainda que mais tarde seja preciso realizar mudanças significativas no interior de uma classe, não será necessário modificar o restante do programa. Outro benefício desta prática é garantir que a informação não será corrompida acidentalmente pelo resto do programa. Criamos, assim, programas mais robustos e confiáveis.
REVISÃO PARA A PROVA
Integração com Banco de Dados
JDBC - Java Database Connectivity
Introdução
• JDBC é uma API (Application Program Interface) para acesso a SGDB (Sistemas Gerenciadores de Banco de Dados) relacionais por meio de comandos SQL (Structured Query Language).
• Quando o SGBD não dispõe de um driver JDBC mas somente o ODBC, será necessário uma ponte para o acesso ao banco. A figura a seguir ilustra o que acontece.
JDBC e o caminho da comunicação com o Banco de Dados
Vantagens
A API para programação do sistema é a mesma para qualquer SGBD, não há necessidade de se desenvolver aplicações voltadas para um SGBD específico.
• Permite a construção de páginas WWW que acessam Banco de Dados.
• Mantém a independência de plataforma da linguagem Java.
Comparação com Microsoft ODBC
• ODBC tem o mesmo propósito e existe para várias plataformas, por que não usar ODBC?
- Os drivers ODBC são escritos em C, o que limita a portabilidade e auto-instalação dos programas Java.
- O ODBC tem que ser instalado e configurado na máquina do cliente.
- Imagine instalar e configurar o ODBC em 40.000.000 computadores da Internet!
• Entretanto, banco de dados que utilizam ODBC podem ser utilizados em aplicações Java via a ponte JDBC-ODBC.
Carga do driver no programa Java
• Vários drivers podem ser carregados com o método Class.forName, este método força o carregamento do driver.
Por exemplo:
Class.forName (“oracle.jdbc.driver.OracleDriver”);
Class.forName (“sun.jdbc.odbc.JdbcOdbcDriver”);
• Caso não seja encontrada a classe é lançada uma exceção
ClassNotFoundException
• A JVM deve poder encontrar estas classes e para aplicações, a variável de
ambiente CLASSPATH deve incluir os drivers.
Conexão com o BD
• A abertura da conexão é feita pelo método getConnection da classe DriverManager.
- O DriverManager tenta conectar com o primeiro driver carregado, se não consegue, tenta o driver seguinte.
- Caso não seja localizado, é lançada uma exceção SQLException.
• getConnection(String url, Properties info)
– url: a url do banco de dados;
– info : propriedade do sistema como: usuário e senha.
• getConnection(String url, String user, String password)
– url: a url do banco de dados;
– user: o usuário que está conectando ao banco de dados;
– password: a senha do usuário.
• getConnection(String url)
– url: a url do banco de dados
A Classe Connection
• public abstract void setAutoCommit(boolean autoCommit) throws SQLException
• public abstract void commit() throws SQLException
• public abstract void close() throws SQLException
• public abstract DatabaseMetaData getMetaData() throws SQLException
• public abstract Statement createStatement() throws SQLException
• public abstract PreparedStatement prepareStatement(String sql) throws
SQLException
– sql: comando SQL que pode conter um ou mais '?' parâmetros.
Exemplo de conexão com um Banco de Dados postgres
Clique na imagem para ampliar
Envio de comandos SQL
• Statement
- O envio de um comando SQL é feito por meio de um Statement
- Statement é utilizado para enviar comandos SQL simples
• PreparedStatement
- O comando SQL é pré-compilado e utilizado posteriormente, sendo mais eficiente nos casos onde o mesmo comando é utilizado várias vezes.
• CallableStatement
- Utilizado para chamar procedimentos SQL armazenados no BD.
A classe Statement
• Um objeto desta classe é criado e recebe um Statement da conexão com o banco de dados para envio de comandos SQL.
Statement stmt = con.createStatement ( );
• Execução de comandos SQL
- Método executeQuery usado para comandos SQL que retornam uma
tabela (ResultSet).
ResultSet rs = stmt.executeQuery (“SELECT * FROM
TB_COLABORADORES”);
- Método executeUpdate usado para executar comandos SQL que retornam
int.
A classe PreparedStatement
• Comandos SQL com ou sem parâmetros podem ser pré-processados e armazenados em um objeto do tipo PreparedStatement.
• É possível preparar uma consulta com uma variável para ser usadas muitas vezes, apenas inserindo uma string diferente para a variável a cada vez.