Link para o material da apresentação

Transcrição

Link para o material da apresentação
Aula 1
Introdução à Programação
Orientada a Objetos e Java
Rafael Santos
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
1 / 88
Apresentação
●
Curso
–
–
–
●
Instrutor
–
●
Rafael Santos: [email protected]
Material
–
●
Parte 1: Orientação a Objetos e Java
Parte 2: IO, Sockets e rede, Threads, Texto, Estruturas de
Dados.
Parte 3: Interfaces gráficas, componentes, aplicações desktop
completas.
www.lac.inpe.br/~rafael.santos/ → Ensino
Metodologia
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
2 / 88
Metodologia
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
3 / 88
A Linguagem Java
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
4 / 88
Por quê Java?
●
●
●
●
●
●
●
Simples.
Portátil (entre sistemas operacionais).
Diferentes aplicações (desktop, web, com algumas
restrições).
Padrão ”aberto”.
Flexível (Várias APIs - Application Programming Interfaces).
Conhecida e consolidada.
Decisão de linguagem em projetos ou empresas envolve
muitas variáveis!
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
5 / 88
Linguagem x Tecnologia
Java technology opens up a wealth of exciting possibilities for consumers. It enables just about any application ­­ including games, tools, and information programs and services ­­ to run on just about any computer or device. From desktop PCs to mobile handheld devices and cell phones, Java technology today is just about everywhere.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
6 / 88
Tecnologia Java
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
7 / 88
http://java.sun.com/new2java/javamap/intro.html
Tecnologia Java
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
8 / 88
Tecnologia Java
●
Máquinas Virtuais
–
–
–
–
●
Navegadores: applets.
Desktop: download, Java Web Start, instaladores.
Servidores: JSP/Servlets, frameworks.
Dispositivos móveis.
Mesma base de código.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
9 / 88
Showcase
●
Aerith (https://aerith.dev.java.net/): Mashup para criação de slideshows
georeferenciados.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
10 / 88
Showcase
●
Projeto Looking Glass
(http://www.sun.com/software/looking_glass/index.jsp): Desktops em 3D.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
11 / 88
Showcase
●
A interface do Maple (http://www.maplesoft.com/) é em Java.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
12 / 88
Showcase
●
Oculus (http://www.oculusinfo.com): visualização científica (API).
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
13 / 88
Showcase
●
NIRView (http://www.nirview.com): visualização e exploração em 2D/3D de
campos de força de estações de telecomunicações.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
14 / 88
Showcase
●
Radio Explorer (http://www.radioexplorer.com.ru/en): exibe/visualiza
horários de transmissão internacionais de rádio.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
15 / 88
Showcase
●
NASA World Wind (http://worldwind.arc.nasa.gov/java e
http://worldwindcentral.com/wiki/Java): SDK para desenvolvimento de
aplicações de visualização da Terra.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
16 / 88
Showcase
●
OS MasterMap Viewer
(http://www.snowflakesoftware.co.uk/products/viewer/index.htm):
exibe/visualiza alguns tipos de arquivos de topologia/GML.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
17 / 88
Showcase
●
yEd (http://www.yworks.com/en/products_yed_about.htm): visualização de
vários tipos de dados com estrutura de grafos.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
18 / 88
Showcase
●
JUNG - The Java Universal Network/Graph Framework
(http://jung.sourceforge.net/): visualização de grafos.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
19 / 88
Showcase
●
JGraph (http://www.jgraph.com) / SQL Developer (http://www.solyp.de/):
administração de bancos de dados.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
20 / 88
Showcase
●
JGraph (http://www.jgraph.com) / CAOS (Comodity AudiO System,
http://www.ife.ee.ethz.ch/): gerenciamento de clusters para processamento
de áudio.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
21 / 88
Showcase
●
JGraph (http://www.jgraph.com) / ImageApp
(http://imageapp.sourceforge.net/v3.0/main.php): programação visual para
processamento de imagens.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
22 / 88
Showcase
●
Force Field Explorer (http://dasher.wustl.edu/ffe): visualização e
exploração para química/biologia/nanotecnologia (GUI em Java3D, pacote
Tinker em Fortran)
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
23 / 88
Showcase
●
PathwayExplorer (http://www.genostar.org): análise funcional genômica.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
24 / 88
Showcase
●
Sketsa SVG Editor (http://www.kiyut.com/products/sketsa/index.html):
Edição de arquivos SVG.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
25 / 88
Showcase
●
●
Mozilla Rhino (http://www.mozilla.org/rhino): Implementação de JavaScript
em Java.
The Flying Saucer Project (https://xhtmlrenderer.dev.java.net/):
Renderização de XML/HTML/CSS 2.1.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
26 / 88
Showcase
●
BD-J (http://www.blueboard.com/bluray/pdf/javaone2006_ts1685_v2.pdf):
Interatividade em discos Blu-Ray usando Java.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
27 / 88
Showcase
●
Insider for Oracle (http://www.fourthelephant.com/insider.html):
monitoramento e gerenciamento de bancos de dados Oracle em tempo
real.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
28 / 88
Showcase
●
ThinkFree Office (http://product.thinkfree.com/): Office em Java.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
29 / 88
Showcase
●
Sferyx JSyndrome HTMLEditor Applet Edition
(http://www.sferyx.com/index.htm): edição de HTML.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
30 / 88
Showcase
●
jxProject (http://www.jxproject.com/index.shtml): gerenciamento de
projetos e tarefas.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
31 / 88
Showcase
●
Project Sun SPOT (http://www.sunspotworld.com/): hardware programável
em Java.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
32 / 88
Showcase
●
Perrone Robotics (http://www.perronerobotics.com/) e Team Jefferson
(http://teamjefferson.com/): robôs autônomos.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
33 / 88
Showcase
●
Maestro (http://mars.telascience.org/home): Interface para análise/controle
dos robôs em Marte.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
34 / 88
Showcase
●
Ultra Mixer (http://www.ultramixer.com): Software para DJ profissionais.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
35 / 88
Showcase
●
JPC (http://www-jpc.physics.ox.ac.uk/home_home.html): Emulador x86 em
Java.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
36 / 88
Showcase
●
Wurm Online (http://www.wurmonline.com): Massively Multiplayer Online
Role Playing Game.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
37 / 88
Showcase
●
Puzzle Pirates (http://www.puzzlepirates.com): Massively Multiplayer
Online Role Playing Game.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
38 / 88
Orientação a Objetos e Java
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
39 / 88
Orientação a Objetos
●
●
●
Orientação a Classes?
Classes são descritas em Java para representar modelos ou
conceitos.
Objetos ou Instâncias são criados ou instanciados a partir
das classes.
–
–
●
Uma classe pode ser usada para criar muitos objetos.
–
●
Criação pela palavra-chave new.
Referências são usadas para acesso aos objetos.
Os atributos de cada objeto serão independentes.
Exemplos puramente abstratos e discussão.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
40 / 88
Orientação a Objetos: Encapsulamento
●
●
●
Classes contém campos ou atributos e métodos.
Atributos são usados para armazenar estado (valores)
relacionados com as instâncias das classes.
Métodos são operações que podem ser realizadas com
estes atributos.
–
●
Construtores são métodos declarados de forma especial,
serão os primeiros* a ser executados quando instâncias
forem criadas.
Em princípio, ocultamos os atributos mas permitimos a
operação via métodos.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
41 / 88
Orientação a Objetos: Encapsulamento
●
Atributos e funções relevantes a um domínio ou problema
são encapsulados em uma classe de forma que:
–
–
Somente atributos e funções relevantes sejam representados;
Uma interface seja criada para que usuários/desenvolvedores
tenham acesso somente a funções e atributos que podem
ser acessados diretamente.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
42 / 88
Orientação a Objetos: Encapsulamento
●
Exemplo simples: Conta Bancária.
–
–
Queremos armazenar os dados da conta.
Queremos ser capazes de efetuar operações com os dados da
conta (alguns podem ser modificados, outros não, alguns
ainda somente sob certas condições)...
●
Não é científico, mas exemplifica as idéias.
●
Notas:
–
–
–
O dilema do ensino de programação.
Aprendizado incremental – erros e decisões incorretas!
Sintaxe de Java.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
43 / 88
Orientação a Objetos: Encapsulamento
class ContaBancaria1
{
String nomeCorrentista;
double saldo;
ContaBancaria1(String n, double s)
{
nomeCorrentista = n;
saldo = s;
}
double getSaldo()
{
return saldo;
}
String getNome()
{
return nomeCorrentista;
}
void deposita(double quantia)
{
saldo = saldo + quantia;
}
void retira(double quantia)
{
if (quantia < saldo) saldo = saldo - quantia;
}
}
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
44 / 88
Orientação a Objetos: Encapsulamento
class ContaBancaria1
{
String nomeCorrentista;
double saldo;
ContaBancaria1(String n, double s)
{
nomeCorrentista = n;
saldo = s;
}
double getSaldo()
{
return saldo;
}
String getNome()
{
return nomeCorrentista;
}
void deposita(double quantia)
{
saldo = saldo + quantia;
}
void retira(double quantia)
{
if (quantia <= saldo) saldo = saldo - quantia;
}
}
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
45 / 88
Orientação a Objetos: Encapsulamento
●
Uma aplicação que usa a classe:
class UsaContaBancaria1
{
public static void main(String[] args)
{
ContaBancaria1 fred = new ContaBancaria1("Fred",1000);
ContaBancaria1 richard = new ContaBancaria1("Richard",2000);
richard.retira(500);
fred.deposita(500);
}
}
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
46 / 88
Orientação a Objetos: Encapsulamento
●
Algumas restrições e erros:
class UsaContaBancaria1ComErros
{
public static void main(String[] args)
{
ContaBancaria1 fred = new ContaBancaria1("Fred"); // Falta parâmetro!
ContaBancaria1 richard =
new ContaBancaria1(2000,"Richard"); // Ordem incorreta!
richard.retira(); // Quanto?
fred.desfalca(500); // O quê??
richard.saldo = 1000000; // oops - isto não é um erro!
}
}
●
E o encapsulamento?
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
47 / 88
Orientação a Objetos: Encapsulamento
public class ContaBancaria2
{
private String nomeCorrentista;
private double saldo;
public ContaBancaria2(String n, double s)
{
nomeCorrentista = n;
saldo = s;
}
public double getSaldo()
{ return saldo; }
public String getNome()
{ return nomeCorrentista; }
public void deposita(double quantia)
{
saldo = saldo + quantia;
}
public void retira(double quantia)
{
if (quantia <= saldo) saldo = saldo - quantia;
}
}
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
48 / 88
Orientação a Objetos: Encapsulamento
class UsaContaBancaria2
{
public static void main(String[] args)
{
ContaBancaria2 fred = new ContaBancaria2("Fred",1000);
ContaBancaria2 richard = new ContaBancaria2("Richard",2000);
richard.retira(500);
fred.deposita(500); // ok
richard.saldo = 1000000; // Erro de compilação!
}
}
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
49 / 88
Orientação a Objetos: Encapsulamento
●
Melhorias incrementais
public class ContaBancaria3
{
private String nomeCorrentista;
private double saldo;
public ContaBancaria3(String n, double s)
{
nomeCorrentista = n;
saldo = s;
}
public double getSaldo()
{ return saldo; }
public String getNome()
{ return nomeCorrentista; }
public void deposita(double quantia)
{
saldo = saldo + quantia;
}
public void retira(double quantia)
{
if (quantia <= saldo) saldo = saldo - quantia;
}
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
50 / 88
Orientação a Objetos: Encapsulamento
public void transfereDe(ContaBancaria3 de,double quanto)
{
deposita(quanto);
Má idéia. Por quê?
de.retira(quanto);
}
public String toString()
{
return "Conta de "+nomeCorrentista+" tem saldo "+saldo;
}
}
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
51 / 88
Orientação a Objetos: Encapsulamento
class UsaContaBancaria3
{
public static void main(String[] args)
{
ContaBancaria3 fred = new ContaBancaria3("Fred",1000);
ContaBancaria3 richard = new ContaBancaria3("Richard",2000);
System.out.println(fred);
System.out.println(richard);
fred.transfereDe(richard,400);
System.out.println(fred);
System.out.println(richard);
}
}
Conta
Conta
Conta
Conta
Janeiro/Fevereiro 2010
de
de
de
de
Fred tem saldo 1000.0
Richard tem saldo 2000.0
Fred tem saldo 1400.0
Richard tem saldo 1600.0
http://www.lac.inpe.br/~rafael.santos
52 / 88
Orientação a Objetos: Sobrecarga de Métodos
public class ContaBancaria4
{
private String nomeCorrentista;
private double saldo;
public ContaBancaria4(String n, double s)
{
nomeCorrentista = n;
saldo = s;
}
public ContaBancaria4(String n)
{
this(n,0);
}
public double getSaldo()
{ return saldo; }
public String getNome()
{ return nomeCorrentista; }
public void deposita(double quantia)
{
saldo = saldo + quantia;
}
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
53 / 88
Orientação a Objetos: Sobrecarga de Métodos
public void retira(double quantia)
{
if (quantia <= saldo) saldo = saldo - quantia;
}
public void transfereDe(ContaBancaria4 de,double quanto)
{
deposita(quanto);
de.retira(quanto);
}
public void transfereDe(ContaBancaria4 de)
{
double quanto = de.getSaldo();
deposita(quanto);
de.retira(quanto);
}
public String toString()
{
return "Conta de "+nomeCorrentista+" tem saldo "+saldo;
}
}
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
54 / 88
Orientação a Objetos: Sobrecarga de Métodos
class UsaContaBancaria4
{
public static void main(String[] args)
{
ContaBancaria4 fred = new ContaBancaria4("Fred");
ContaBancaria4 richard = new ContaBancaria4("Richard",2000);
System.out.println(fred);
System.out.println(richard);
fred.transfereDe(richard,400);
System.out.println(fred);
System.out.println(richard);
fred.transfereDe(richard);
System.out.println(fred);
System.out.println(richard);
}
}
Conta
Conta
Conta
Conta
Conta
Conta
Janeiro/Fevereiro 2010
de
de
de
de
de
de
Fred tem saldo 0.0
Richard tem saldo 2000.0
Fred tem saldo 400.0
Richard tem saldo 1600.0
Fred tem saldo 2000.0
Richard tem saldo 0.0
http://www.lac.inpe.br/~rafael.santos
55 / 88
Comentários
●
●
●
Vantagens e desvantagens do encapsulamento.
Tendência a escrever mais do que o necessário.
Conheça a linguagem!
–
–
–
–
–
meuMétodo(int a)
meuMétodo(int a,int b)
meuMétodo(int a,int b,int c)
meuMétodo(float a)
...
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
56 / 88
Métodos e Atributos Estáticos
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
57 / 88
Métodos e Atributos Estáticos
●
Atributos compartilhados entre instâncias.
public class ContaBancariaEstatica
{
private String nomeCorrentista;
private static int contadorGeral = 1;
private int número;
private double saldo;
public ContaBancariaEstatica(String n, double s)
{
nomeCorrentista = n;
saldo = s;
número = contadorGeral++;
}
public double getSaldo()
{ return saldo; }
public String getNome()
{ return nomeCorrentista; }
public String toString()
{
return "Conta "+número+" de "+nomeCorrentista+" tem saldo "+saldo;
}
}
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
58 / 88
Métodos e Atributos Estáticos
class UsaContaBancariaEstatica
{
public static void main(String[] args)
{
ContaBancariaEstatica fred = new ContaBancariaEstatica("Fred",1000);
ContaBancariaEstatica richard =
new ContaBancariaEstatica("Richard",2000);
System.out.println(fred);
System.out.println(richard);
}
}
Conta 1 de Fred tem saldo 1000.0
Conta 2 de Richard tem saldo 2000.0
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
59 / 88
Métodos e Atributos Estáticos
●
Explicação sobre o método main:
class UsaContaBancaria3
{
public static void main(String[] args)
{
ContaBancaria3 fred = new ContaBancaria3("Fred",1000);
ContaBancaria3 richard = new ContaBancaria3("Richard",2000);
System.out.println(fred);
System.out.println(richard);
fred.transfereDe(richard,400);
System.out.println(fred);
System.out.println(richard);
}
}
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
60 / 88
Métodos e Atributos Estáticos
●
●
Métodos estáticos: uso em coleções de funções genéricas.
Exemplo: classe Math.
public final class Math // editada para simplificar
{
/**
* Don't let anyone instantiate this class.
*/
private Math() {}
public static final double E = 2.7182818284590452354;
public static final double PI = 3.14159265358979323846;
public static double toRadians(double angdeg) {
return angdeg / 180.0 * PI;
}
public static double toDegrees(double angrad) {
return angrad * 180.0 / PI;
}
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
61 / 88
Herança e Interfaces
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
62 / 88
Composição
●
Conceito Básico: reuso de classes.
import java.util.Date;
public class Pessoa
{
private String nome;
private int identidade;
private Date nascimento;
public Pessoa(String n,int i,Date d)
{
nome = n; identidade = i; nascimento = d;
}
public String toString()
{
return "Nome: "+nome+"\nIdentidade: "+identidade+" "+
"\nData de Nascimento: "+nascimento;
}
}
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
63 / 88
Herança
●
Novas classes a partir de existentes:
import java.util.Date;
public class Funcionario extends Pessoa
{
private Date admissão;
private float salário;
public Funcionario(String nome,int id,Date nasc,Date adm,float sal)
{
super(nome,id,nasc);
admissão = adm;
salário = sal;
}
public String toString()
{
String resultado;
resultado = super.toString()+"\n"; // chama o método toString da classe Pessoa
resultado = resultado + "Data de admissão: "+admissão+"\n";
resultado = resultado + "Salário: "+salário;
return resultado;
}
public float qualSalário() { return salário; }
}
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
64 / 88
Herança
import java.util.Date;
public class UsaPessoa
{
public static void main(String[] args)
{
Pessoa p =
new Pessoa("Matthew",1212612,new Date(70,9,5)); // 5 de Outubro! de 1970
System.out.println(p);
Funcionario f =
new Funcionario("Matthew",1212612,new Date(70,9,5),
new Date(90,11,3),2000f);
System.out.println(f);
}
}
Nome: Matthew
Identidade: 1212612
Data de Nascimento: Mon Oct 05 00:00:00 BRT 1970
Nome: Matthew
Identidade: 1212612
Data de Nascimento: Mon Oct 05 00:00:00 BRT 1970
Data de admissão: Mon Dec 03 00:00:00 BRST 1990
Salário: 2000.0
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
65 / 88
Herança
import java.util.Date;
public class ChefeDeDepartamento extends Funcionario
{
private String departamento;
private Date promoçãoAChefe;
public ChefeDeDepartamento(String nome,int id,Date nasc,
Date adm,float sal,
String dep,Date prom)
{
super(nome,id,nasc,adm,sal);
departamento = dep;
promoçãoAChefe = prom;
}
public String toString()
{
String resultado;
resultado = super.toString()+"\n";
resultado = resultado + "Departamento:"+departamento+"\n";
resultado = resultado + "Data de promoção ao cargo:"+promoçãoAChefe;
return resultado;
}
}
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
66 / 88
Herança
import java.util.Date;
public class UsaPessoa2
{
public static void main(String[] args)
{
Pessoa p =
new Pessoa("Matthew",1212612,new Date(70,9,5)); // 5 de Outubro! de 1970
System.out.println(p);
Funcionario f =
new Funcionario("Matthew",1212612,new Date(70,9,5),new Date(90,11,3),2000f);
System.out.println(f);
ChefeDeDepartamento c =
new ChefeDeDepartamento("Matthew",1212612,new Date(70,9,5),
new Date(90,11,3),2000f,
"Contabilidade",new Date(100,0,1));
System.out.println(c);
Nome: Matthew
}
Identidade: 1212612
}
Data de Nascimento: Mon Oct 05 00:00:00 BRT 1970
Nome: Matthew
Identidade: 1212612
Data de Nascimento: Mon Oct 05 00:00:00 BRT 1970
Data de admissão: Mon Dec 03 00:00:00 BRST 1990
Salário: 2000.0
Nome: Matthew
Identidade: 1212612
Data de Nascimento: Mon Oct 05 00:00:00 BRT 1970
Data de admissão: Mon Dec 03 00:00:00 BRST 1990
Salário: 2000.0
Departamento:Contabilidade
Data de promoção ao cargo:Sat Jan 01 00:00:00 BRST 2000
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
67 / 88
Herança Múltipla
●
●
●
Não podemos escrever X extends A, B.
Existem várias possibilidades de confusão.
Herança múltipla pode ser (parcialmente) simulada com
interfaces.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
68 / 88
Interfaces
●
Contratos para classes:
–
Herdeiras devem implementar os métodos ou ser declaradas
abstratas.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
69 / 88
Interfaces
public class Ponto2D
{
private double x,y;
public Ponto2D(double _x,double _y)
{
x = _x;
y = _y;
}
public boolean éIgual(Ponto2D outroPonto2D)
{
if ((x == outroPonto2D.x) && (y == outroPonto2D.y)) return true;
else return false;
}
public static Ponto2D origem()
{
return new Ponto2D(0,0);
}
public double getX() { return x; }
public double getY() { return y; }
public String toString()
{
return "("+x+","+y+")";
}
}
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
70 / 88
Interfaces
public interface ObjetoGeometrico
{
public Ponto2D centro();
public double calculaÁrea();
public double calculaPerímetro();
}
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
71 / 88
Interfaces
public class Circulo implements ObjetoGeometrico
{
private Ponto2D centro;
private double raio;
public Circulo(Ponto2D centro,double raio)
{
this.centro = centro;
this.raio = raio;
}
public Ponto2D centro() { return centro; }
public double calculaÁrea() { return Math.PI*raio*raio; }
public double calculaPerímetro() { return 2.0*Math.PI*raio; }
public String toString()
{
return "Círculo com centro em "+centro+" e raio "+raio;
}
}
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
72 / 88
Interfaces
public class Retangulo implements ObjetoGeometrico
{
private Ponto2D primeiroCanto,segundoCanto;
public Retangulo(Ponto2D pc,Ponto2D sc)
{
primeiroCanto = pc;
segundoCanto = sc;
}
public Ponto2D centro()
{
double coordX = (primeiroCanto.getX()+segundoCanto.getX())/2.;
double coordY = (primeiroCanto.getY()+segundoCanto.getY())/2.;
return new Ponto2D(coordX,coordY);
}
public double calculaÁrea()
{
double ladoX = Math.abs(primeiroCanto.getX()-segundoCanto.getX());
double ladoY = Math.abs(primeiroCanto.getY()-segundoCanto.getY());
return ladoX*ladoY;
}
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
73 / 88
Interfaces
public double calculaPerímetro()
{
double ladoX = Math.abs(primeiroCanto.getX()-segundoCanto.getX());
double ladoY = Math.abs(primeiroCanto.getY()-segundoCanto.getY());
return 2*ladoX+2*ladoY;
}
public String toString()
{
return "Retângulo com cantos "+primeiroCanto+" e "+segundoCanto;
}
}
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
74 / 88
Interfaces
public class UsaObjetosGeometricos
{
public static void main(String[] argumentos)
{
Circulo c1 = new Circulo(new Ponto2D(0,0),100); // centrado na origem, raio 100
Circulo c2 = new Circulo(new Ponto2D(-1,-1),1); // centrado em (-1,-1), raio 1
Retangulo r1 = new Retangulo(new Ponto2D(-2,-2), // um canto está em (-2,-2)
new Ponto2D(2,2)); // e o outro em (2,2)
Retangulo r2 = new Retangulo(new Ponto2D(-100,-1), // um canto está em (-100,1)
new Ponto2D(100,1)); // e o outro em (100,1)
System.out.println(c1);
System.out.println(c2);
System.out.println(r1);
System.out.println(r2);
}
}
Círculo com centro em (0.0,0.0) e raio 100.0
Círculo com centro em (-1.0,-1.0) e raio 1.0
Retângulo com cantos (-2.0,-2.0) e (2.0,2.0)
Retângulo com cantos (-100.0,-1.0) e (100.0,1.0)
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
75 / 88
Interfaces
public interface ObjetoEscalavel
{
public void amplia(double escala);
public void espelha();
}
public class CirculoEscalavel implements ObjetoGeometrico,ObjetoEscalavel
{
private Ponto2D centro;
private double raio;
public CirculoEscalavel(Ponto2D centro,double raio)
{
this.centro = centro;
this.raio = raio;
}
public Ponto2D centro()
{
return centro;
}
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
76 / 88
Interfaces
public double calculaÁrea()
{ return Math.PI*raio*raio; }
public double calculaPerímetro()
{ return 2.0*Math.PI*raio;
}
public void amplia(double escala)
{
raio *= escala;
}
public void espelha()
{
centro = new Ponto2D(-centro.getX(),centro.getY());
}
public String toString()
{
return "Círculo com centro em "+centro+" e raio "+raio;
}
}
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
77 / 88
Comentários
●
●
●
Vantagens e desvantagens do uso de heranças.
Novamente tendência a escrever mais do que o necessário e
a fragmentar funcionalidade em múltiplas classes com
herança.
Mais uso de classes prontas do que desenvolvimento de
ancestrais.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
78 / 88
Polimorfismo
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
79 / 88
Polimorfismo
●
Polimorfismo (“muitas formas”): classes que herdam de uma
ancestral são-um-tipo-de ancestral.
class UsaCirculoEscalavel
{
public static void main(String[] argumentos)
{
CirculoEscalavel ce = new CirculoEscalavel(new Ponto2D(10,10),30);
System.out.println(ce);
ce.amplia(3);
System.out.println(ce);
ce.espelha();
System.out.println(ce);
// É uma instância da classe CirculoEscalavel ?
System.out.println(ce instanceof CirculoEscalavel); // true
// É uma instância da interface ObjetoGeometrico ?
System.out.println(ce instanceof ObjetoGeometrico); // true
// É uma instância da interface Escalavel ?
System.out.println(ce instanceof ObjetoEscalavel); // true
}
}
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
80 / 88
Comentários
●
●
●
Implicações de Polimorfismo.
Todas as classes herdam de Object.
Vantagens e desvantagens.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
81 / 88
Pacotes e Visibilidade
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
82 / 88
Pacotes e Visibilidade
●
Pacotes são formas de organizar classes em grupos
similares.
–
●
●
Mapeamento para diretórios.
Até agora tudo simples: todas as classes estão em um
mesmo pacote anônimo.
Todas as classes em um mesmo pacote são acessíveis pelas
outras.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
83 / 88
Pacotes e Visibilidade
●
Pacote geometria.
package geometria;
public class Circulo implements ObjetoGeometrico
{
protected Ponto2D centro;
protected double raio;
public Circulo(Ponto2D centro,double raio)
{
this.centro = centro;
this.raio = raio;
}
public Ponto2D centro()
{ return centro;
public double calculaÁrea()
}
{ return Math.PI*raio*raio; }
public double calculaPerímetro() { return 2.0*Math.PI*raio; }
public String toString()
{
return "Círculo com centro em "+centro+" e raio "+raio;
}
}
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
84 / 88
Pacotes e Visibilidade
package minhaApp;
import geometria.Circulo;
import geometria.Ponto2D;
public class MeuCirculo extends Circulo
{
private int id;
public MeuCirculo(Ponto2D centro, double raio,int id)
{
super(centro, raio);
Deve chamar o construtor!
this.id = id;
}
public String toString()
{
return "Círculo com ID "+id+", centro em "+centro+" e raio "+raio;
}
}
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
85 / 88
Pacotes e Visibilidade
●
Algumas regras são mais complicadas, ex. envolvendo
superposição (herdeiras não podem ser mais restritas).
package minhaApp;
import geometria.Circulo;
import geometria.Ponto2D;
public class CirculoAproximado extends Circulo
{
// O construtor paramétrico deve existir.
public CirculoAproximado(Ponto2D centro, double raio)
{
super(centro, raio);
}
public double calculaÁrea()
{
return 3.14*raio*raio;
}
protected double calculaPerímetro() // Erro de compilação!
{
return 3.14*Math.PI*raio;
}
}
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
86 / 88
Pacotes e Visibilidade
●
Modificadores de acesso para uso:
private
protected
default
public
Métodos na mesma classe
Sim
Sim
Sim
Sim
Métodos em classes herdeiras
Não
Sim
Sim
Sim
Métodos em outras classes do mesmo pacote
Não
Não
Sim
Sim
Métodos em outras classes em outro pacote
Não
Não
Não
Sim
Deve ser evitado
●
Regra mais simples: usar somente public e private.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
87 / 88
Pacotes e Visibilidade
●
●
●
Dicas e truques para organização em pacotes.
Considerar necessidade de protected – métodos get e
set podem ser usados.
Vantagens e desvantagens.
Janeiro/Fevereiro 2010
http://www.lac.inpe.br/~rafael.santos
88 / 88

Documentos relacionados