Escolar Documentos
Profissional Documentos
Cultura Documentos
com
julianafigueiredo204@gmail.com
Acesso ao Banco de Dados Página 2
LISTA DE FIGURAS
LISTA DE QUADROS
LISTA DE TABELAS
SUMÁRIO
7.1 Introdução
Oracle Database.
PostgreSQL.
Sysbase.
MySQL Server.
Apache Derby.
Vamos começar com o banco de dados. Primeiro vamos nos conectar à base
de dados Oracle utilizando a ferramenta Oracle Developer.
Pronto! A tabela está criada! Agora vamos criar uma sequence para gerar os
valores do código do colaborador. Para isso, vá novamente à área de conexões e
procure por “Sequências”, clique com o botão direito do mouse e escolha a opção
“Nova Sequencia”, conforme a figura abaixo:
Agora sim, estamos prontos para começar! O próximo passo é conhecer alguns
comandos básicos para a manipulação de informações da tabela.
Outro detalhe é a função TO_DATE, que converte um texto para uma data:
TO_DATE(‘10/10/2010’,’dd/mm/yyyy’). O primeiro valor é a String que será convertida
para data e o segundo é o formato (máscara) da data que foi informada:
Para isso, precisamos adicionar filtros nas nossas buscas. Esses filtros
permitem recuperar os registros de acordo com condições, além de trazer registros
mais específicos, também utiliza menos capacidade processamento. Observe o
exemplo abaixo:
Exemplos:
Às vezes são necessárias duas condições para filtrar uma busca. Por exemplo:
buscar todos os colaboradores que têm o salário menor do que R$ 1.500,00 e que
foram contratados antes do ano 2000. Para isso, será necessário utilizar os
operadores lógicos:
Exemplos:
A sintaxe básica é:
Exemplo:
Esse comando também precisa de condição, pois sem ela, todos os registros
da tabela serão apagados.
Exemplo:
Primeiro, vamos criar um novo projeto para manipular a base de dados. Para
isso, vá à opção “File” do menu e escolha “New” e depois “Java Project”, conforme a
figura abaixo:
Para isso, crie uma pasta chamada lib e adicione o driver do Oracle, conforme
os seguintes passos:
Agora copie o driver do Oracle para dentro da pasta e adicione no build path do
projeto, para que as classes e interfaces do driver fiquem disponíveis para o uso
dentro do projeto. Para adicionar no build path, clique com o botão direito do mouse
no driver e escolha: “Build Path” -> “Add to Build Path”, conforme a figura abaixo:
Abaixo, apresentamos uma classe de teste que realiza a conexão com o banco
de dados:
package br.com.fiap.teste;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
//Registra o Driver
Class.forName("oracle.jdbc.driver.OracleDriver");
"jdbc:oracle:thin:@192.168.60.15:1521:ORCL", "OPS$PF0392",
"123456");
System.out.println("Conectado!");
//Fecha a conexão
conexao.close();
//Tratamento de erro
} catch (SQLException e) {
System.err.println("Não foi possível
conectar no Banco de Dados");
e.printStackTrace();
} catch (ClassNotFoundException e) {
System.err.println("O Driver JDBC não foi
encontrado!");
e.printStackTrace();
}
}
}
O primeiro passo para obtermos uma conexão é registrar o driver que será
utilizado. Depois, através do método DriverManager.getConnection() obtemos uma
conexão com o banco de dados. Os parâmetros desse método são:
Após obter a conexão é possível enviar qualquer comando SQL para realizar
alguma operação no banco de dados. Veremos isso daqui a pouco. Depois de enviar
as instruções, devemos fechar a conexão utilizando o método close().
Agora vamos discutir um pouco sobre cada uma das classes e interfaces que
iremos utilizar para se conectar e realizar as operações na base de dados:
DriverManager:
Determina qual driver de conexão será utilizado. Funciona como uma ponte
entre o JDBC e o driver escolhido.
Nas versões atuais do Java não é necessário realizar esse processo, pois a
partir da String de conexão a JVM reconhece qual driver deve ser utilizado.
Connection:
7.2.6 Statements
Exemplos:
Inclusão:
Alteração:
Exclusão:
Busca:
Exemplo:
stmt.executeUpdate();
Observe que no lugar dos valores dos parâmetros foi adicionado o ponto de
interrogação ?, para posteriormente adicionarmos valores a eles através dos métodos
setXXX, dependendo do tipo de dado. Esse método recebe dois parâmetros: o
primeiro é a posição do sinal ?, que inicia-se em 1, já o segundo é o valor que será
atribuído a essa posição.
Alteração:
Exclusão:
Busca:
ResultSet:
Principais métodos:
Exemplo:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
System.out.println("Conectado!");
java.sql.Date data =
result.getDate("DATA_CONTRATACAO");
//Exibe as informações do registro
System.out.println(codigo + " " + nome + " " +
email + " " + salario + " " + data);
}
//Fecha a conexão
conexao.close();
//Tratamento de erro
} catch (SQLException e) {
System.err.println("Não foi possível conectar no
Banco de Dados");
e.printStackTrace();
} catch (ClassNotFoundException e) {
System.err.println("O Driver JDBC não foi
encontrado!");
e.printStackTrace();
}
}
}
7.2.7 CallableStatement
//Cria o CallableStatement
CallableStatement cs = conexao.prepareCall("{call
SP_Contar_Colaboradores(?,?)}");
//Executa a procedure
cs.executeUpdate();
//Cria o CallableStatement
CallableStatement cs = conexao.prepareCall("{call
SP_Retornar_Todos_Colaboradores(?,?)}");
//Executa a procedure
cs.execute();
Essa classe deve possuir atributos que representam cada coluna da tabela.
Utilizamos o encapsulamento, deixando os atributos com o modificador de acesso
private e disponibilizamos os métodos assessores (gets e sets). Foi implementado
também o construtor padrão e com parâmetros. Para armazenar a data de contratação
utilizamos a classe java.util.Calendar.
package br.com.fia.bean;
import java.util.Calendar;
public class Colaborador {
Agora vamos criar uma classe que será responsável por fornecer uma conexão
com o banco de dados. Observe que para cada operação no banco de dados
(INSERT, UPDATE, SELECT e DELETE) foi necessário primeiro obter uma conexão.
Com essa classe, não vamos precisar escrever código repetido, utilizando assim os
conceitos de orientação a objetos.
package br.com.fiap.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
Class.forName("oracle.jdbc.driver.OracleDriver");
conexao = DriverManager.getConnection(
"jdbc:oracle:thin:@oracle.fiap.com.br:1521:ORCL",
"OPS$XXXX", "XXXXX");
} catch (Exception e) {
e.printStackTrace();
}
return conexao;
}
Observe que essa classe possui somente um método estático que cria e retorna
uma conexão com o banco. O método é estático para não precisar de uma instância
para ser invocada, bastando referenciá-la através do nome da classe:
EmpresaDBManager.obterConexao();
package br.com.fiap.dao;
A classe DAO deve possuir um atributo para armazenar o objeto que representa
a conexão com o banco de dados.
try {
conexao = EmpresaDBManager.obterConexao();
String sql = "INSERT INTO
TAB_COLABORADOR(CODIGO_COLABORADOR, NOME, EMAIL, SALARIO,
DATA_CONTRATACAO) VALUES (SQ_COLABORADOR.NEXTVAL, ?, ?, ?,
?)";
stmt = conexao.prepareStatement(sql);
stmt.setString(1, colaborador.getNome());
stmt.setString(2, colaborador.getEmail());
stmt.setDouble(3,
colaborador.getSalario());
java.sql.Date data = new
java.sql.Date(colaborador.getDataContratacao().getTimeInMillis
());
stmt.setDate(4, data);
stmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
stmt.close();
conexao.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import br.com.fiap.bean.Colaborador;
import br.com.fiap.jdbc.EmpresaDBManager;
Para isso, crie uma classe com o método main, conforme a listagem abaixo:
package br.com.fiap.teste;
import java.util.Calendar;
import br.com.fiap.bean.Colaborador;
import br.com.fiap.dao.ColaboradorDAO;
//Instancia o Colaborador
Colaborador colaborador = new Colaborador();
colaborador.setNome("Pedro");
colaborador.setEmail("pedro@fiap.com.br");
colaborador.setSalario(5000);
colaborador.setDataContratacao(Calendar.getInstance());
System.out.println("Cadastrado!");
}
dataContratacao.setTimeInMillis(data.getTime());
//Cria um objeto Colaborador com as
informações encontradas
Colaborador colaborador = new
Colaborador(codigo, nome, email, salario, dataContratacao);
//Adiciona o colaborador na lista
lista.add(colaborador);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
stmt.close();
rs.close();
conexao.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return lista;
}
Esse método retorna uma lista com todos os colaboradores cadastrados. Não
se esqueça de adicionar os imports do List, ArrayList e ResultSet:
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
Agora vamos para a classe de teste! Para ficar mais organizado, criaremos uma
nova classe de teste que será responsável pelo teste da listagem:
package br.com.fiap.teste;
import java.util.List;
import br.com.fiap.bean.Colaborador;
import br.com.fiap.dao.ColaboradorDAO;
try {
conexao = EmpresaDBManager.obterConexao();
String sql = "DELETE FROM TAB_COLABORADOR
WHERE CODIGO_COLABORADOR = ?";
stmt = conexao.prepareStatement(sql);
stmt.setInt(1, codigo);
stmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
stmt.close();
conexao.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
package br.com.fiap.teste;
import br.com.fiap.dao.ColaboradorDAO;
int codigo =
rs.getInt("CODIGO_COLABORADOR");
String nome = rs.getString("NOME");
String email = rs.getString("EMAIL");
double salario =
rs.getDouble("SALARIO");
java.sql.Date data =
rs.getDate("DATA_CONTRATACAO");
Calendar dataContratacao =
Calendar.getInstance();
dataContratacao.setTimeInMillis(data.getTime());
colaborador = new Colaborador(codigo,
nome, email, salario, dataContratacao);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
stmt.close();
rs.close();
conexao.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return colaborador;
}
try {
conexao = EmpresaDBManager.obterConexao();
String sql = "UPDATE TAB_COLABORADOR SET
NOME = ?, EMAIL = ?, SALARIO = ?, DATA_CONTRATACAO = ? WHERE
CODIGO_COLABORADOR = ?";
stmt = conexao.prepareStatement(sql);
stmt.setString(1, colaborador.getNome());
stmt.setString(2, colaborador.getEmail());
stmt.setDouble(3,
colaborador.getSalario());
java.sql.Date data = new
java.sql.Date(colaborador.getDataContratacao().getTimeInMillis
());
stmt.setDate(4, data);
stmt.setInt(5, colaborador.getCodigo());
stmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
stmt.close();
conexao.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
package br.com.fiap.teste;
import br.com.fiap.bean.Colaborador;
import br.com.fiap.dao.ColaboradorDAO;
7.3.1 Transação
Por padrão, toda conexão com JDBC está configurada para realizar o COMMIT
automaticamente, ou seja, o COMMIT é realizado de forma automática após a
execução de um comando SQL.
Exemplo:
try {
//Desabilita o autocommit
conexao.setAutoCommit(false);
Dessa forma, devemos desenvolver uma classe DAO para cada entidade, a fim
de separar a responsabilidade do acesso à base de dados da entidade a seus
respectivos DAOs:
package br.com.fiap.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import br.com.fiap.bean.Colaborador;
import br.com.fiap.jdbc.EmpresaDBManager;
try {
conexao = EmpresaDBManager.obterConexao();
String sql = "INSERT INTO
TAB_COLABORADOR(CODIGO_COLABORADOR, NOME, EMAIL, SALARIO,
DATA_CONTRATACAO) VALUES (SQ_COLABORADOR.NEXTVAL, ?, ?, ?,
?)";
stmt = conexao.prepareStatement(sql);
stmt.setString(1, colaborador.getNome());
stmt.setString(2, colaborador.getEmail());
stmt.setDouble(3,
colaborador.getSalario());
stmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
stmt.close();
conexao.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
dataContratacao.setTimeInMillis(data.getTime());
//Cria um objeto Colaborador com as
informações encontradas
Colaborador colaborador = new
Colaborador(codigo, nome, email, salario, dataContratacao);
//Adiciona o colaborador na lista
lista.add(colaborador);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
stmt.close();
rs.close();
conexao.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return lista;
}
try {
conexao = EmpresaDBManager.obterConexao();
String sql = "UPDATE TAB_COLABORADOR SET
NOME = ?, EMAIL = ?, SALARIO = ?, DATA_CONTRATACAO = ? WHERE
CODIGO_COLABORADOR = ?";
stmt = conexao.prepareStatement(sql);
stmt.setString(1, colaborador.getNome());
stmt.setString(2, colaborador.getEmail());
stmt.setDouble(3,
colaborador.getSalario());
java.sql.Date data = new
java.sql.Date(colaborador.getDataContratacao().getTimeInMillis
());
stmt.setDate(4, data);
stmt.setInt(5, colaborador.getCodigo());
stmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
stmt.close();
conexao.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
try {
conexao = EmpresaDBManager.obterConexao();
if (rs.next()){
int codigo =
rs.getInt("CODIGO_COLABORADOR");
String nome = rs.getString("NOME");
String email = rs.getString("EMAIL");
double salario =
rs.getDouble("SALARIO");
java.sql.Date data =
rs.getDate("DATA_CONTRATACAO");
Calendar dataContratacao =
Calendar.getInstance();
dataContratacao.setTimeInMillis(data.getTime());
colaborador = new Colaborador(codigo,
nome, email, salario, dataContratacao);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
stmt.close();
rs.close();
conexao.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return colaborador;
}
package br.com.fiap.dao;
import java.util.List;
import br.com.fiap.bean.Colaborador;
package br.com.fiap.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import br.com.fiap.bean.Colaborador;
import br.com.fiap.jdbc.EmpresaDBManager;
try {
conexao = EmpresaDBManager.obterConexao();
String sql = "INSERT INTO
TAB_COLABORADOR(CODIGO_COLABORADOR, NOME, EMAIL, SALARIO,
DATA_CONTRATACAO) VALUES (SQ_COLABORADOR.NEXTVAL, ?, ?, ?,
?)";
stmt = conexao.prepareStatement(sql);
stmt.setString(1, colaborador.getNome());
stmt.setString(2, colaborador.getEmail());
stmt.setDouble(3,
colaborador.getSalario());
java.sql.Date data = new
java.sql.Date(colaborador.getDataContratacao().getTimeInMillis
());
stmt.setDate(4, data);
stmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
stmt.close();
conexao.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
int codigo =
rs.getInt("CODIGO_COLABORADOR");
String nome = rs.getString("NOME");
String email = rs.getString("EMAIL");
double salario =
rs.getDouble("SALARIO");
java.sql.Date data =
rs.getDate("DATA_CONTRATACAO");
Calendar dataContratacao =
Calendar.getInstance();
dataContratacao.setTimeInMillis(data.getTime());
//Cria um objeto Colaborador com as
informações encontradas
Colaborador colaborador = new
Colaborador(codigo, nome, email, salario, dataContratacao);
//Adiciona o colaborador na lista
lista.add(colaborador);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
stmt.close();
rs.close();
conexao.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return lista;
}
try {
conexao = EmpresaDBManager.obterConexao();
String sql = "UPDATE TAB_COLABORADOR SET
NOME = ?, EMAIL = ?, SALARIO = ?, DATA_CONTRATACAO = ? WHERE
CODIGO_COLABORADOR = ?";
stmt = conexao.prepareStatement(sql);
stmt.setString(1, colaborador.getNome());
stmt.setString(2, colaborador.getEmail());
stmt.setDouble(3,
colaborador.getSalario());
java.sql.Date data = new
java.sql.Date(colaborador.getDataContratacao().getTimeInMillis
());
stmt.setDate(4, data);
stmt.setInt(5, colaborador.getCodigo());
stmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
stmt.close();
conexao.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
try {
conexao = EmpresaDBManager.obterConexao();
String sql = "DELETE FROM TAB_COLABORADOR
WHERE CODIGO_COLABORADOR = ?";
stmt = conexao.prepareStatement(sql);
stmt.setInt(1, codigo);
stmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
stmt.close();
conexao.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
if (rs.next()){
int codigo =
rs.getInt("CODIGO_COLABORADOR");
String nome = rs.getString("NOME");
String email = rs.getString("EMAIL");
double salario =
rs.getDouble("SALARIO");
java.sql.Date data =
rs.getDate("DATA_CONTRATACAO");
Calendar dataContratacao =
Calendar.getInstance();
dataContratacao.setTimeInMillis(data.getTime());
colaborador = new Colaborador(codigo,
nome, email, salario, dataContratacao);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
stmt.close();
rs.close();
conexao.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return colaborador;
}
}
@Override
public List<Cargo> listar() {
//Implementação
}
@Override
public void cadastrar(Cargo cargo) {
//Implementação
package br.com.fiap.factory;
import br.com.fiap.dao.CargoDAO;
import br.com.fiap.dao.ColaboradorDAO;
import br.com.fiap.dao.OracleCargoDAO;
import br.com.fiap.dao.OracleColaboradorDAO;
Note que a classe acima possui dois métodos estáticos que fornecem as
instâncias dos DAOs. Para sua utilização, basta invocar esses métodos:
import java.util.List;
import br.com.fiap.bean.Colaborador;
import br.com.fiap.dao.ColaboradorDAO;
import br.com.fiap.factory.DAOFactory;
que permite suportar diversos tipos de bancos de dados e estar preparado para
suportar novos tipos.
package br.com.fiap.factory;
import br.com.fiap.dao.CargoDAO;
import br.com.fiap.dao.ColaboradorDAO;
Foram definidas duas constantes, uma para cada banco de dados suportado
pela aplicação. Dois atributos armazenam suas respectivas fábricas de DAO, uma
para cada banco. O método getDAOFactory() recebe o valor de uma das constantes
que representam o banco de dados para devolver a instância da fábrica correta.
Após a classe abstrata criada, é preciso criar duas classes para estender a
DAO Factory, uma para cada tipo de fábrica. Assim, temos o SQLDAOFactory e o
OracleDAOFactory. Nestas classes implementamos os métodos que retornam as
instâncias dos DAOs, de acordo com seu banco de dados.
Para utilizar o DAO Factory, basta invocar o método que recupera a instância
da fábrica, informando o banco de dados escolhido:
package br.com.fiap.teste;
import java.util.List;
import br.com.fiap.bean.Colaborador;
import br.com.fiap.dao.ColaboradorDAO;
import br.com.fiap.factory.DAOFactory;
7.4.4 Singleton
package br.com.fiap.singleton;
import java.sql.Connection;
//Construtor privado
private ConnectionManager(){}
REFERÊNCIAS
DEITEL, Paul; DEITEL Harvey. Java Como Programar. 8.ed. São Paulo: Pearson,
2010.
HORSTMANN, Cay; CORNELL, Gary. Core Java. Volume I Fundamentos. 8.ed. São
Paulo: Pearson 2009.
SIERRA, Kathy; BATES, Bert. Use a cabeça! Java. Rio de Janeiro: Alta Books, 2010.
LISTA DE FIGURAS
LISTA DE QUADROS
LISTA DE TABELAS
LISTA DE CÓDIGOS-FONTE
SUMÁRIO
6.2 Classificação
Error: erro crítico, utilizado pela JVM para indicar que existe um problema
que não permite a execução do programa continuar.
O quadro abaixo apresenta um resumo das exceções no Java:
try-catch
try-catch-finally
try{
//Código
}catch(Exceção){
//Tratamento da exceção
}
O bloco try possui o código que pode gerar uma exceção, ou seja, este trecho
de código será monitorado pela JVM. Se um erro for gerado, o fluxo da execução é
desviado para o bloco catch, para o tratamento do erro. O uso do try indica que o
código está tentando realizar algo “perigoso”, passível de erro.
try{
//Código
}catch(Exceção 1){
//Tratamento da exceção 1
}catch(Exceção 2){
//Tratamento da exceção 2
}catch(Exceção 3){
//Tratamento da exceção 3
}
Dessa forma, somente o primeiro catch que se encaixar com o tipo da exceção
lançada será executado. Os catchs são testados de cima para baixo, um por um, por
isso, as exceções mais específicas devem ser colocadas nos primeiros catchs,
sempre obedecendo à ordem: das exceções mais específicas para as mais genéricas.
Se nenhum catch conseguir capturar a exceção lançada, ela não será tratada,
como se não existisse o bloco try-catch.
Vamos desenvolver um exemplo: Ler dois números para dividir um pelo outro:
//Realiza a divisão
int divisao = numero1/numero2;
//Exibe o resultado
System.out.println("O resultado é: " + divisao);
sc.close();
O código é bem simples, porém pode lançar uma exceção, caso o segundo
número informado pelo usuário for zero. Caso isso aconteça, o erro gerado será:
2
0
Exception in thread "main" java.lang.ArithmeticException: / by
zero
at br.com.fiap.tds.View.main(View.java:16)
// Lê os dois números
int numero1 = sc.nextInt();
int numero2 = sc.nextInt();
try {
// Realiza a divisão
int divisao = numero1 / numero2;
// Exibe o resultado
System.out.println("O resultado é: " + divisao);
} catch (ArithmeticException e) {
System.err.println("Erro ao dividir!");
}
sc.close();
2
0
Erro ao dividir!
A classe Throwable possui alguns métodos que podem exibir informações dos
erros gerados. Portanto, por herança, a exceção ArithmeticException também possuí
esses métodos:
try {
//Tenta acessar uma posição inexistente do vetor
array[2] = 10;
} catch (ArrayIndexOutOfBoundsException e) {
System.err.println("Mensagem de erro: " +
e.getMessage());
e.printStackTrace();
}
Dessa vez, a exceção será gerada quando tentamos acessar uma posição
inválida de um array: ArrayIndexOutOfBoundsException.
Mensagem de erro: 2
java.lang.ArrayIndexOutOfBoundsException: 2
at br.com.fiap.tds.View.main(View.java:10)
Formato geral:
try {
//Fluxo normal que pode gerar uma exceção
} catch (Exception e) {
Esse método pode lançar uma exceção, caso o valor de n2 for zero. Podemos
utilizar o try-catch para tratar a exceção, porém quem chamar o método dividir não
saberá se a operação ocorreu de forma correta ou se aconteceu algum erro:
Dessa forma, a melhor maneira de tratar a exceção é não tratar. Neste caso,
devemos somente propagar a exceção, notificando assim que algum problema
aconteceu na execução. Para isso, devemos adicionar na assinatura do método o
throws, junto da exceção que queremos propagar:
Podemos também lançar uma nova exceção no nosso método. Para isso, basta
utilizar o comando throw:
}
saldo = saldo - valor;
}
O método acima valida se o valor a ser retirado é maior do que o valor do saldo.
Caso o valor do saldo seja insuficiente, uma exception será lançada. Para isso, foi
necessário adicionar o throws na assinatura do método. Dessa forma, quem chamar
o método sacar deve tratar a exceção ou lançá-la novamente:
Após criar um novo objeto conta, chamamos o método sacar, como ela lança
uma exceção checked, precisamos tratá-la ou lançá-la, neste caso, optamos por tratar
a exceção com o bloco try-catch. Já o método depositar lança uma exceção
unchecked, e dessa forma, não fomos obrigados a tratá-la. Porém, se uma exceção
ocorrer, ela será relançada automaticamente pelo método main que irá imprimir o erro
no console.
Para criar uma exceção, basta criar uma classe que herde de Exception
(checked) ou RuntimeException (unchecked).
Vamos criar as nossas exceções, uma para identificar que o valor de saque é
inválido e outra para dizer que o saldo da conta é insuficiente.
Para utilizá-la, vamos modificar o método de sacar, para que ela lance a nossa
exceção customizada:
Agora vamos criar uma exceção checked que identifica que o saldo é
insuficiente:
Em outras palavras, uma stream é uma conexão para uma fonte de dados ou
para um destino de dados. A plataforma Java trata cada arquivo como uma stream.
Um arquivo texto pode ser lido e entendido facilmente pelas pessoas e também
de ser manipulado na plataforma Java. Podem ser utilizados facilmente por diversos
programas, pois é fácil saber a disposição dos registros e campos contidos nestes
arquivos. Geralmente, os registros nestes arquivos são representados pelas linhas,
enquanto os campos são representados por colunas ou valores separados por vírgula:
Abrir o arquivo.
Gravar os dados.
Fechar o arquivo.
try {
//Abre o arquivo
FileWriter stream = new
FileWriter("arquivo.txt");
//Escreve no arquivo
print.println("Teste");
print.println("Escrevendo no arquivo");
print.close();
//Fecha o arquivo
stream.close();
} catch (IOException e) {
e.printStackTrace();
}
print.println("Teste");
print.println("Escrevendo no arquivo");
print.close();
stream.close();
Observe que foi preciso tratar a exceção IOException, pois podemos ter
problemas na hora de abrir ou manipular o arquivo.
Abrir o arquivo.
Utilizar o arquivo (ler os dados).
Fechar o arquivo.
As classes que podemos utilizar para ler os dados de um arquivo são:
java.io.FileReader e java.io.BufferedReader. A classe FileReader descende da classe
InputStreamReader.
try {
//Abre o arquivo
FileReader stream = new
FileReader("arquivo.txt");
reader.close();
//Fecha o arquivo
stream.close();
} catch (IOException e) {
e.printStackTrace();
}
Dessa forma, utilizamos esse método para ler uma linha e depois
criamos um laço de repetição, que vai ser executado até que a String recuperada for
nula, ou seja, até que todas as linhas do arquivo forem lidas.
reader.close();
//Fecha o arquivo
stream.close();
Ao contrário das outras classes que estudamos, esta classe não abre o arquivo
ou permite o processamento de seu conteúdo. A sua função é gerenciar o arquivo ou
diretório, o seu caminho (path), verificar permissões, a existência, criar, renomear etc.
Um objeto da classe File apenas representa o arquivo ou diretório, isto não quer
dizer que o arquivo ou diretório exista de fato.
if (diretorio.exists()){
System.out.println("Diretório existe!");
}else{
if (diretorio.mkdir())
System.out.println("Diretório criado!");
else
System.out.println("Diretório não criado.");
}
}
O objeto File foi instanciado com o valor “fiap”, que é o nome do diretório.
Primeiro verificamos se o diretório existe, caso não exista, utilizamos o método mkdir()
para criar o diretório. Esse método retorna um valor booleano, verdadeiro se o diretório
foi criado ou false, caso contrário.
if (diretorio.exists()){
System.out.println("Diretório existe!");
}else{
if (diretorio.mkdir())
System.out.println("Diretório criado!");
else
System.out.println("Diretório não
criado.");
}
Com esse novo objeto File, tentamos criar o arquivo dentro do diretório.
try {
//Abre o arquivo para escrita
FileWriter writer = new FileWriter(arquivo);
//Abre o arquivo para leitura
FileReader reader = new FileReader(arquivo);
//Código...
} catch (IOException e) {
e.printStackTrace();
}
6.7 Polimorfismo
Com o polimorfismo, é possível escrever um código que não tenha que ser
alterado quando novos tipos de subclasse forem introduzidos no sistema. Porém, a
utilização mais importante do polimorfismo se dá quando dois objetos, sendo um da
superclasse e outro da subclasse, executam ações diferentes quando o mesmo
método é invocado. Isso é possível através da sobrescrita de métodos, quando a
subclasse sobrescreve o método implementado na superclasse. Já vimos isso nos
primeiros capítulos de orientação a objetos.
@Override
public void sacar(double valor) throws SaldoInsuficienteException {
if (valor > saldo + limite){
throw new SaldoInsuficienteException();
}
saldo = saldo - valor;
}
Depois foi chamado o método sacar. Qual método será executado? O método
definido na classe Conta ou da classe ContaCorrente?
No nosso exemplo, a classe Conta é uma conta genérica, que serve como base
para os outros tipos de conta como a conta corrente, conta poupança, conta
investimento etc. Por isso, não faz sentido instanciar uma classe Conta, pois não
existe uma “Conta Genérica” no nosso sistema. O que podemos instanciar são as
subclasses da classe conta. É ai que entra a classe Abstrata.
A primeira característica é que uma classe abstrata não pode ser instanciada,
ou seja, não podemos utilizar o operador new. Dessa forma, nunca vamos ter uma
instancia de uma classe abstrata dentro da nossa aplicação.
Então a nossa classe Conta é perfeita para ser abstrata. Ela será a base para
todas as outras contas em nosso sistema.
Como visto no exemplo acima, podemos definir uma variável com o tipo da
classe abstrata, porém, devemos atribuir um objeto de uma subclasse da mesma, a
fim de utilizar o polimorfismo.
Uma classe que não é abstrata é chamada de classe Concreta. Ao projetar uma
hierarquia de herança, devemos definir quais classes serão concretas e abstratas.
Uma classe abstrata pode conter métodos abstratos. O método abstrato não
possui implementação, ela define somente a assinatura do método. A sua subclasse,
obrigatoriamente, precisará implementar o método, caso esta seja concreta.
É possível ter uma herança com várias classes abstratas, porém a primeira
classe concreta da hierarquia será obrigada a implementar todos os métodos
abstratos definidos pelas suas superclasses.
@Override
public void sacar(double valor) throws SaldoInsuficienteException {
if (valor > saldo + limite){
throw new SaldoInsuficienteException();
}
saldo = saldo - valor;
}
@Override
public double verificarSaldo() {
return saldo + limite;
}
//Gets e Sets
@Override
public double verificarSaldo() {
return saldo;
}
}
A classe Forma é abstrata e possui um atributo com os métodos get e set. Ela
define também um método abstrato calcularArea. Esse método é abstrato porque a
classe Forma não consegue calcular a área, pois isso depende do tipo da forma.
Assim, todas as subclasses deverão implementar o método abstrato e calcular a sua
área.
@Override
public double verificarSaldo() {
return saldo;
}
O código acima não compila, pois a ContaPoupanca está marcada como final
e por isso não pode ser estendida.
O atributo NUMERO_PI está marcado como private, por isso só é visível dentro
da própria classe. Podemos criar um método dentro da classe Circulo para calcular o
valor da sua respectiva área. Para isso, precisamos de um atributo para armazenar o
valor do raio do círculo:
this.raio = raio;
}
No código acima, o método calcularArea foi marcado como final, dessa forma,
se criarmos uma subclasse da classe Circulo e tentar implementar um método para
sobrescrever o método calcularArea, este não irá compilar:
Total 2
Resultado:
Total 2
6.11 Constantes
System.out.println(Constantes.JANEIRO);
System.out.println(Constantes.TAXA_RETIRADA);
6.12 Interfaces:
Uma interface em Java não pode ser instanciada. Assim como as classes, uma
interface pode ser composta por atributos e métodos. Porém, como ela não é
instanciada, não apresenta construtores.
void logou();
Para criar uma interface no eclipse, clique com o botão direito do mouse na
pasta src e escolha a opção New -> Interface:
@Override
public boolean login(String usuario, String senha) {
// TODO Auto-generated method stub
return false;
}
@Override
public void logou() {
// TODO Auto-generated method stub
Figura 6.16 – Exemplo de duas classes que implementam uma mesma interface
Fonte: Elaborado pelo autor (2017)
Podemos ter métodos concretos em uma interface. Para isso, devemos utilizar
o modificador default. Esses método chamado de default method, serão herdados
por todas as classes que implementarem a interface. Não sendo necessário
implementá-la na classe.
Exemplo:
System.out.println("Acelerando");
}
}
@Override
public void parar() {
System.out.println("Avestruz parando...");
}
}
Corredor.acelerar();
REFERÊNCIAS
DEITEL, Paul; DEITEL, Harvey. Java Como Programar. 8.ed. São Paulo: Pearson,
2010.
HORSTMANN, Cay; CORNELL, Gary. Core Java: Volume I Fundamentos. 8.ed. São
Paulo: Pearson 2009.
SIERRA, Kathy; BATES, Bert. Use a cabeça! Java. Rio de Janeiro: Alta Books, 2010.
LISTA DE FIGURAS
LISTA DE QUADROS
SUMÁRIO
5.1 While
Perceba que o loop while nunca será executado se a condição for false
desde o início.
Quando o número for 10, o loop será executado pela última vez, pois o
número será incrementado novamente e a condição do while será falsa, pois o
número será 11, ou seja, maior do que 10.
O loop while é testado na parte inicial do loop, antes que seja executada
a primeira iteração. Outra forma, seria movendo esse teste para o final do
bloco, assim garantimos que o bloco de código será executado ao menos uma
vez. Desta forma, é utilizada outra estrutura de repetição chamada do-while,
que veremos a seguir.
5.2 Do-While
Esse loop primeiramente irá executar todo o bloco de código para depois
testar a condição, e assim verificar se repete novamente o bloco de código.
Sintaxe básica:
5.3 For
Sintaxe básica:
5.4 Arrays
No exemplo acima foi declarado um vetor com tipo de dado inteiro e com
4 posições.
Exemplos:
A resposta são os loops. Eles são perfeitos, pois podemos fazer um loop
para repetir uma quantidade de vezes igual ao tamanho do vetor.
Até este momento, nenhum objeto Carro foi criado. O array foi criado
para armazenar as referências de 5 Carros, e por enquanto as posições do
vetor estão vazias (null).
A sintaxe é:
O tipo do vetor é Carro, a variável que vai receber cada um dos itens do
vetor é o carro e o array que queremos percorrer é o vetor de carros.
Imagine agora que as notas dos alunos devem ser armazenadas por
disciplinas. O curso tem 9 disciplinas com 40 alunos cada. Dessa forma,
podemos criar um array com 9 posições e em cada posição armazenar um
outro array com 40 elementos:
O array de array denominado notas tem 360 posições, uma para cada
aluno em 9 disciplinas. Você pode armazenar a nota do primeiro aluno para a
primeira disciplina com a seguinte instrução:
5.5 Strings
O Java não tem um tipo de dado primitivo como int ou double para
armazenar uma string. Ao invés, podemos utilizar a biblioteca padrão Java que
contém uma classe predefinida chamada string.
ou
A variável nome acima não possui nenhum valor, ou seja, está com null,
quando o programa executar a linha que recupera o tamanho da string e tentar
imprimi-la no console, um erro irá ocorrer.
ou
Agora que entendemos como uma string funciona, vamos pensar como
podemos imprimir ou armazenar aspas (“) ou adicionar um quebra de linha na
string?
Exemplo:
O resultado esperado é:
O resultado será:
Resultado:
O resultado será uma nova string com a palavra “Faculdade”, que está
no índice 16 e se finaliza na posição 24:
O resultado será:
toLowerCase. Lembre-se que uma string é imutável, ou seja, ela não pode ser
alterada. Dessa forma, quando utilizamos esses métodos, uma nova string será
criada com a alteração solicitada.
Exemplo:
O resultado será:
O resultado será:
O último método da classe string que será estudado será o método split.
Este é um método muito útil, que separa o valor de uma string em várias strings
separadas por um delimitador, que deve ser informado ao método:
5.6.1 List
Para criar uma lista, não precisamos passar o tamanho dela, como
temos que fazer no array. Isso quer dizer que a lista se adequa quando
inserimos um elemento, possibilitando adicionar ou remover quantos elementos
forem necessários. Outra grande vantagem é que podemos manipular a lista,
ordenando-a ou buscando um elemento pelo seu valor.
5.6.2 Set
A interface Set define uma coleção que não pode conter valores
duplicados. Corresponde à abstração de um conjunto que funciona de forma
análoga aos conjuntos da matemática. Outro ponto importante, é que nem
sempre a ordem de inserção dos elementos será a dos elementos dispostos na
coleção, isso pode variar de implementação para implementação. A interface
contém somente os métodos herdados da interface Collection:
5.6.3 Map
Podemos utilizar uma lista para isso? Claro que sim, o problema é que
seria necessário percorrer todos os elementos da lista para encontrar o aluno
correto, deste modo, a performance seria comprometida, mesmo para
pequenas listas.
5.6.4 Generics
Sintaxe:
Figura 5.9 – Com Generics, código não permite inserção de elemento que não corresponde ao
tipo de objeto da lista
Fonte: Elaborado pelo autor (2014)
Além disso, não será preciso realizar o cast para obter o objeto de volta
na lista, pois ela pode armazenar somente um tipo de objeto:
REFERÊNCIAS
DEITEL, Paul; DEITEL, Harvey. Java Como Programar. 8. ed. São Paulo:
Pearson, 2010.
SIERRA, Kathy; BATES, Bert. Use a cabeça! Java. Rio de Janeiro: Alta Books,
2010.
LISTA DE FIGURAS
SUMÁRIO
4 HERANÇA ..............................................................................................................4
4.1 Introdução ...........................................................................................................4
4.1 Sobrescrita de métodos.......................................................................................9
4 HERANÇA
4.1 Introdução
Uma classe só pode ter uma superclasse, ou seja, não é possível ter herança
múltipla. Porém, uma classe pode ter um número ilimitado de subclasses.
Sintaxe:
Agora é hora de praticar! Vamos ajustar a classe Conta para que ela possua as
subclasses ContaCorrente e ContaPoupanca. A classe Conta herda da classe Object.
Vamos adicionar outro atributo que será utilizado para armazenar o valor do
cheque especial, ou seja, o valor que o cliente pode utilizar junto do saldo da conta.
Agora que vimos como adicionar atributos na classe filha, vamos adicionar
métodos específicos à ContaCorrente. Uma conta corrente tem o comportamento de
retornar o Saldo Disponível, que é a soma do saldo da conta com o limite do cheque
especial:
Note que o método retorna o valor da soma do cheque especial com o saldo da
conta. Para acessar o saldo da conta foi necessário utilizar o método getSaldo(), pois
o atributo saldo está definido na classe pai como private, por isso não é visível na
classe filha.
Dessa forma, você pode utilizar um objeto de uma subclasse sempre que o
programa esperar por um objeto da superclasse. Assim, é possível atribuir um objeto
do tipo Conta Corrente em uma variável do tipo Conta.
Exemplo:
Observe que se tentarmos realizar o cast e o objeto não for do tipo ou subtipo
da classe que queremos forçar, o Java irá lançar a exceção ClassCastException:
Outra diferença, para o nosso sistema, é que para a conta poupança não há
taxa para efetuar um saque. Na conta corrente do tipo básica existe uma taxa para a
retirada de dinheiro.
O método retirar soma a taxa de retirada (10) ao valor a ser subtraído do saldo.
Como não temos acesso direto ao saldo e não podemos alterar o seu valor na
subclasse (não existe o método setSaldo() na classe Conta), precisamos utilizar o
método retirar que está na classe Conta. A palavra super é utilizada para referenciar
a superclasse, assim a instrução super.retirar(valor) está chamando o método retirar
que está na classe Conta.
conta.retirar(100);
conta.retirar(100);
conta.retirar(100);
A resposta é sim. Isso é feito automaticamente pelo Java, pois a classe Conta
possui o construtor padrão. Então o código abaixo, com a instrução super( ) na
primeira linha do construtor é redundante, pois o Java irá fornecer a instrução caso
não seja definido.
Figura 4.13 – Construtor da classe Conta Corrente com a chamada super de forma explícita
Fonte: Elaborado pelo autor (2017)
REFERÊNCIAS
DEITEL, Paul; DEITEL, Harvey. Java Como Programar. 8.ed. São Paulo. Pearson,
2010.
SIERRA, Kathy; BATES, Bert. Use a cabeça! Java. Rio de Janeiro: Alta Books,
2010.
LISTA DE FIGURAS
LISTA DE QUADROS
LISTA DE TABELAS
SUMÁRIO
3.1 Classe
As informações relevantes para uma conta bancária podem ser o saldo, número
da conta, agência, tipo de conta etc. E as ações ou comportamentos importantes de
uma classe Conta são: sacar, depositar, verificar o saldo etc.
Dessa forma, podemos desenvolver uma classe Conta que contenha essas
informações e comportamentos. Porém, essa classe é somente o modelo para o
conceito de Conta Bancária dentro do nosso sistema. Assim como em um Banco
Financeiro do “mundo real”, antes de guardar dinheiro na conta e depositar ou retirar,
é preciso ir ao Banco para abrir uma Conta. No mundo orientado a objetos, primeiro
precisamos criar um objeto utilizando a classe Conta para depois utilizá-la. Esse
processo de criação de um objeto a partir de uma classe é chamado de instanciação.
new Conta();
Exemplo:
3.2 Atributos
Em uma classe, os atributos são definidos por variáveis, que podem ser do tipo
primitivo (como visto no capítulo anterior) ou do tipo de referência, no qual a variável
armazena uma referência ao objeto. No nosso exemplo, a classe conta pode conter
uma variável para armazenar a referência de um objeto Cliente. Assim, a classe Conta
possui um Cliente.
boa prática, devemos utilizar substantivos e nomes bem definidos para os atributos,
como por exemplo: saldo, dataNascimento, email etc. Nomes poucos sugestivos
devem ser evitados: x, y, abc entre outros.
Declarar uma variável de instância segue a mesma sintaxe das variáveis locais,
visto no capítulo anterior.
Por exemplo:
class Conta {
double saldo;
Neste caso, a variável saldo recebe o valor padrão 0. Podemos também, atribuir
um valor na hora de declarar um atributo, assim o valor padrão não será utilizado:
class Conta {
3.3 Métodos
Por convenção, o nome dos métodos, assim como os seus atributos, devem
sempre ser escritos em lowerCamelCase, e geralmente utilizamos verbos para os
nomes. Exemplos: exibirSaldo, depositar, calcularTaxa, pois os métodos executam
ações.
[instrucoes];
Caso o método não precise retornar nenhum valor, podemos definir o retorno
como void. No exemplo acima, o método depositar não retorna nenhum valor.
No exemplo acima (Figura 4), a classe Conta possui dois métodos com o nome
retirar, com assinaturas diferentes. Um que recebe um valor para retirada e outro que
recebe um valor de retirada e o valor da taxa de retirada.
A palavra reservada this faz referência ao próprio objeto. É por meio dela que
é possível acessar atributos, métodos e construtores do objeto em questão.
Quando houver duas variáveis com o mesmo nome, uma sendo uma variável
de instância (atributo da classe) e outra pertencente ao método, utilizaremos a palavra
this para referenciar o atributo da classe, como mostra a Figura 5.
3.3.2 Construtor
Dessa forma, quando uma instância de Conta for criada (new Conta();), o
atributo saldo será inicializado com o valor 100 e será impresso no Console a frase
“Criando uma instância de Conta.”.
Neste exemplo, o construtor padrão (sem parâmetros) não será fornecido pelo
Java. O único construtor que a classe Conta tem é o que recebe um valor double como
parâmetro. Esse valor é utilizado para inicializar o valor do atributo saldo.
Da mesma forma que os métodos, a instrução this foi utilizada para acessar as
variáveis de instância de um objeto atual:
Assim como os métodos, uma classe pode ter vários construtores com
diferentes tipos e quantidades de argumentos. Isso é chamado de sobrecarga de
métodos construtores. Dessa forma, uma classe pode ser instanciada com qualquer
construtor.
• new Conta().
• new Conta(100).
• new Conta(10,100).
Para consolidar os conceitos, vamos criar uma classe Conta com os atributos
saldo, agência e número. Vamos desenvolver também os métodos de retirar,
depositar e verificarSaldo. Para facilitar a construção dos objetos dessa classe, vamos
implementar dois construtores: um construtor padrão e outro que recebe três
argumentos: o saldo, a agência e o número.
Para isso, crie uma nova Classe chamada Conta dentro do pacote
br.com.fiap.banco e depois implemente os atributos, métodos e construtores.
Agora, vamos criar uma classe de Teste (Figura 12) com o método main para
criar instâncias da classe Conta. Para isso, crie uma nova classe chamada Teste, no
pacote br.com.fiap.banco, e implemente o método main:
Dentro do método main, vamos instanciar uma Classe conta (Figura 13) e
armazenar a referência desse objeto em uma variável.
A variável cc tem uma referência ao objeto Conta. É por meio dela que
podemos acessar os atributos e métodos do objeto.
System.out.println(cc.saldo);
cc.saldo = 1000;
cc.depositar(100);
cc.verificarSaldo();
Vamos criar mais uma instância da classe conta, atribuir alguns valores aos
seus atributos e chamar os métodos.
No exemplo acima, foram criados dois objetos do tipo Conta. No primeiro objeto
(cc), foram atribuídos valores aos seus atributos e invocados os métodos depositar e
verificarSaldo, imprimindo o resultado no console. O segundo objeto criado
(poupança) recebeu os valores iniciais de seus atributos pelo construtor. Após isso,
foram chamados os comportamentos de retirar e verificarSaldo.
O segundo objeto recebe um valor inicial de 1000. Após isso o método retirar é
acionado com o valor 50. Assim, o saldo final é 950.
Observe que cada objeto possui os seus próprios valores para as variáveis de
instância e seus métodos atuam dentro do próprio objeto, independentemente.
Uma variável que armazena a referência de um objeto pode ter o valor null.
Esse valor quer dizer que a variável está vazia e não faz referência a nenhum objeto.
Devemos tomar cuidado, pois no caso de tentar acessar um atributo ou método em
uma variável vazia, irá ocorrer um erro na execução do programa.
É possível utilizar o valor null na lógica do seu programa sempre que for
necessário verificar se a variável faz referência a um objeto ou não.
Exemplos:
Conta cc = null;
if (cc != null){
Os modificadores usados com mais frequência nos sistemas são aqueles que
controlam o acesso a métodos, atributos e construtores. Os modificadores irão
determinar quais variáveis, métodos e construtores serão visíveis a outras classes.
Dessa forma, os atributos são visíveis somente a classes que estiverem dentro
do mesmo pacote da classe Conta. Os construtores e métodos são visíveis em
qualquer outra classe, independentemente do pacote em que esteja.
O problema é que a classe Teste não tem mais acesso aos atributos, pois estes
têm o nível de acesso default e as classes estão em pacotes diferentes. Por enquanto,
marque os atributos da classe Conta com public, para corrigir o problema.
3.7 Comentários
• Para comentar uma linha, utilizam-se duas barras (//), tudo desde as barras até o
final da linha será considerado comentário, sendo desconsiderado pelo compilador
Java:
//comentário
• Caso seja necessário comentar mais de uma linha, pode-se iniciar o comentário
com /* e terminá-lo com */, tudo que estiver entre essas marcações será
considerado comentário:
/* Comentário
de várias
linhas */
Exemplos:
3.8 Javadoc
/** Descrição
*/
Além do texto que descreve o elemento, podemos utilizar algumas tags para
dar um significado próprio a trechos do comentário. Como por exemplo, determinar o
autor ou a versão do programa.
/**
* Classe que abstrai uma Conta Bancária
* @author thiagoyama
* @version 1.0
*/
public class Conta {
/**
* Número da Conta
*/
public int numero;
/**
* Número da Agencia
*/
public int agencia;
/**
* Saldo da Conta
*/
public double saldo;
public Conta(){}
/**
* Deposita um valor ao saldo da conta
* @param valor Valor a ser depositado
*/
public void depositar(double valor){
saldo = saldo + valor;
}
/**
* Retira um valor do saldo da conta
* @param valor Valor a ser retirado
*/
public void retirar(double valor){
saldo = saldo - valor;
}
/**
* Verifica o saldo da conta
* @return Valor do saldo da conta
*/
public double verificarSaldo(){
return saldo;
}
}
Figura 23 – Classe Conta com comentários de documentação
Fonte: FIAP (2015)
Vamos utilizar o eclipse para gerar a documentação. Para isso, acesse o menu
Project -> Generate javadoc, conforme a imagem abaixo (Figura 26):
Após essa operação, uma janela será aberta. Nela, primeiro configure a
ferramenta javadoc, navegue até a pasta em que está a ferramenta e escolha o
programa javadoc.exe.
O resultado pode ser visualizado na pasta que foi escolhida como destino dos
arquivos de documentação. Abra o arquivo index.html e navegue à vontade!
Uma classe bean pode conter construtores com argumentos, porém ela deve
ter também um construtor sem argumentos.
Vamos falar sobre interfaces ainda, agora só vamos deixar registrado que é
uma boa prática a implementação da interface Serializable, que permite a serialização
de objetos.
• Esconder a implementação de uma classe: para utilizar uma classe que envia e-
mail, precisamos saber somente os valores que a classe precisa receber para
realizar o envio, não precisamos saber como ela o faz.
• Proteger os dados que estão dentro dos objetos, evitando-se que eles sejam
alterados erroneamente.
/**
* Classe que abstrai uma Conta Bancária
* @author thiagoyama
* @version 1.0
*/
public class Conta {
/**
* Número da Conta
*/
private int numero;
/**
* Número da Agencia
*/
private int agencia;
/**
* Saldo da Conta
*/
private double saldo;
public Conta(){}
/**
* Deposita um valor ao saldo da conta
* @param valor Valor a ser depositado
*/
public void depositar(double valor){
saldo = saldo + valor;
}
/**
* Retira um valor do saldo da conta
* @param valor Valor a ser retirado
*/
public void retirar(double valor){
saldo = saldo - valor;
}
Observe que o método setSaldo não foi implementado, pois não podemos
deixar a alteração do valor do saldo seja feito de qualquer maneira. Para isso, existem
os métodos depositar e retirar.
Outro detalhe foi a remoção do método verificarSaldo, que foi substituído pelo
método getSaldo, já que os dois tinham o mesmo comportamento.
Função super()
Modifique também a classe de teste (Figura 33), para corrigir os erros que
surgiram.
cc.depositar(100);
System.out.println(cc.getSaldo());
poupanca.retirar(50);
System.out.println(poupanca.getSaldo());
}
}
Figura 31 – Classe de Teste
Fonte: FIAP (2015)
REFERÊNCIAS
DEITEL, Paul; DEITEL, Harvey. Java Como Programar. 8. ed. São Paulo. Pearson,
2010.
HORSTMANN, Cay; CORNELL, Gary. Core Java: Volume I. Fundamentos. 8. ed. São
Paulo: Pearson 2009.
SIERRA, Kathy; BATES, Bert. Use a cabeça! Java. Rio de Janeiro: Alta Books, 2010.
LISTA DE FIGURAS
SUMÁRIO
2.1 Introdução
• Eclipse
• NetBeans
• JDeveloper
Para a sua utilização é necessário instalar a JDK do Java. (Link para download:
http://www.oracle.com/technetwork/java/javase/downloads/index.html).
O eclipse possui várias versões. Vamos utilizar o “Eclipse IDE for Java EE
Developers”, pois ela dá suporte ao Java Enterprise Edition, ou seja, além de toda a
parte básica do Java, podemos utilizar a parte Enterprise, incluindo projetos Java
Web.
Como a pasta estava vazia, o eclipse exibe uma página de boas-vindas, com opções
para visualizar tutoriais, exemplos e até um overview da ferramenta.
O Eclipse é formado por várias janelas. Toda a composição da tela pode ser alterada
pelo usuário, assim as janelas podem ser fechadas ou abertas, posicionadas
conforme as preferências do desenvolvedor.
A pasta src é onde devemos criar os arquivos Java. Abaixo dela, estão
localizadas as bibliotecas de classes básicas do Java. (JRE System Library).
Por exemplo, para a faculdade FIAP, que possui o domínio fiap.com.br e está
desenvolvendo um projeto para e-commerce, o pacote será definido como
br.com.fiap.ecommerce.
Para isso, clique com o botão direito do mouse no diretório src e escolha new
– package.
Agora vamos ver a estrutura que foi criada no disco rígido. Para isso, navegue
até a pasta do workspace no Windows Explorer.
Agora, vamos criar a nossa primeira classe Java. Para isso, clique com o
botão direito do mouse no pacote e escolha New => Class.
O padrão para atribuir nomes a classes é utilizar substantivos que iniciam com
uma letra maiúscula. Se o nome tiver mais de uma palavra, cada palavra deve iniciar
com letra maiúscula, por exemplo: PrimeiroExemplo, OlaMundo. Essa notação de
letras maiúsculas no meio de uma palavra é chamada de “notação camelo” ou
“CamelCase”.
Vamos executar o programa. Para isso, utilize o atalho F11 ou o botão “play”
localizado na barra de ferramentas:
Existe mais uma opção para executar a classe Java. Basta clicar com o botão
direito do mouse em cima da classe e escolher as opções: Run As => Java
Application.
int idade;
double preco;
Dessa forma, sabemos que o Java é uma linguagem fortemente tipada, pois
cada variável precisa ter um tipo declarado. Existem oito tipos primitivos para
armazenamento de informações. Tipos primitivos não são objetos, eles são partes
internas da linguagem Java, o que os tornam mais eficientes. Uma variável também
pode armazenar um objeto, veremos isso mais adiante.
Na linguagem Java existem palavras que não podemos utilizar para nomear
as variáveis, classes ou métodos. São as palavras reservadas, que possuem
significados dentro da programação. A lista completa é apresentada abaixo:
O tipo double é duas vezes mais preciso que o tipo float. Na maioria dos
casos é utilizado o tipo double.
O último tipo é o boolean, que possui somente dois valores, verdadeiro (true)
ou falso (false). No Java não é possível converter números inteiros em valores
booleanos.
Exemplos:
Vamos praticar! Crie uma nova classe com o método main, adicione algumas
variáveis, atribua valores e imprima o seu conteúdo. Utilize como guia o exemplo
abaixo:
double x = 10;
int y = (int) x;
Exemplo:
O exemplo acima converte um tipo double em tipo int, mas neste caso, a
variável x recebe somente a parte inteira do número, perdendo assim informações.
2.3 Operadores
(x + y) * z;
int x = 10;
x = x + 15;
Qual valor final de x? Primeiro a variável x foi inicializada com o valor 10.
Depois a expressão x + 15 é processada primeiro, retornando o valor 25. Após isso,
é realizada a atribuição desse valor na própria variável x.
int x = 10;
x +=15;
Agora é a sua vez! Crie uma nova classe e realize testes com os operadores
aritméticos e de atribuição, conforme o exemplo anterior.
Exemplo:
O operador lógico AND (e) é representeado pelo símbolo &&. Quando duas
expressões booleanas utilizam o operador &&, o resultado final é verdadeiro (true)
somente quando as duas expressões forem verdadeiras. Exemplo:
Ela reverte o valor da expressão booleana. Por exemplo, idade > 18 retorna
um valor verdadeiro se a idade for maior que 18. A expressão !(idade > 18) retornará
um valor false, caso a idade seja maior que 18:
Se a idade for 20, a expressão retorna true: !(true) -> invertendo o valor (!) ->
o resultado é false.
if (condição) instrução.
if (condição) {
instrução 1;
instrução 2;
Exemplo:
Podemos utilizar também o comando else (que é opcional) junto do if. Assim,
se a condição do if for false, o bloco de código do else será executado.
if (condição) {
Instrução;
}else{
Instrução;
Exemplo:
if (x > 10){
} else {
} else {
Agora, para ler uma informação inserida pelo usuário, precisamos da ajuda da
classe Scanner.
Assim, foi declarada uma variável do tipo Scanner com o nome sc (veremos
com detalhes o operador new e construtores nos próximos capítulos).
Sempre que precisamos utilizar uma classe que estão em pacotes diferentes
e não são do pacote básico (java.lang) é necessário utilizar a instrução import.
Resultado da execução:
Vamos praticar! Crie um programa Java que calcule o IMC e exiba se ele está
no peso ideal ou não.
Caso o imc esteja entre 18.5 e 25, informe que o peso é ideal, caso contrário,
informe que está fora do peso normal.
REFERÊNCIAS
DEITEL, Paul; DEITEL, Harvey. Java Como Programar. 8.ed. São Paulo. Pearson,
2010.
HORSTMANN, Cay; CORNELL, Gary. Core Java. Volume I Fundamentos. 8.ed. São
Paulo: Pearson, 2009.
SIERRA, Kathy; BATES,Bert. Use a cabeça! Java. Rio de Janeiro: Alta Books, 2010.
SUMÁRIO
1 INTRODUÇÃO ................................................................................................ 4
1.1 Linguagem de Programação ........................................................................ 4
1.2 Introdução Java ............................................................................................ 5
1.3 Portabilidade ................................................................................................ 7
1.4 Orientação a objetos .................................................................................... 9
1.5 Princípios de Orientação a Objetos ............................................................ 12
REFERÊNCIAS ................................................................................................ 17
LISTA DE FIGURAS
1 INTRODUÇÃO
1.3 Portabilidade
A imagem abaixo ilustra um código Java sendo compilado, que pode ser
executado em diferentes plataformas em suas respectivas JVMs.
Prática:
REFERÊNCIAS
COLHO, Alex. Java com Orientação a Objetos. Rio de Janeiro: Ciência Moderna,
2012.
SIERRA, Kathy; BATES, Bert. Use a cabeça! Java. Rio de Janeiro: Alta Books,
2010.