Atributos e Métodos Estáticos
Restrições de Acesso
Encapsulamento
Operações de Abstração
Herança e Polimorfismo
Classes Abstratas
Atributos e Métodos Estáticos
Restrições de Acesso
Encapsulamento
Variáveis – Classe, Instância e Método
• Tipos de variáveis estudadas
– Variável local de método
– Variável de instância
diferença
?
• Variáveis de Classe ou Atributos
Estáticos
– Declaradas com o modificador static
– São únicas para toda a classe,
independente do número de instâncias,
ou seja, independente do número de
objetos
3
Atributos Estáticos
• Um atributo usado com o modificador
static tem o seu valor compartilhado por
todos os objetos da classe, ou seja, só
haverá uma cópia dele para todos os
objetos da classe
• Também chamados de variáveis de
classe
• Por exemplo:
static double valordolar;
4
Exemplo
public class Circulo {
private static int numcirc = 0;
private double x, y, r;
public Circulo ( double a, double b, double c) {
x = a;
y = b;
r = c;
numcirc++;
}
public double area ( ) {
double calc = 3.1416 * r * r;
return calc;
}
public static void main (String[ ] args) {
Circulo umcirculo = new Circulo ( 0.0, 0.0, 2.0 );
System.out.println("Area do circulo = " + umcirculo.area ( ));
System.out.println("Numero de circulos = " + Circulo.numcirc);
}
}
5
Variável
de classe
Exemplo
public class Circulo {
private static int numcirc = 0;
Variáveis
private double x, y, r;
de
public Circulo ( double a, double b, double c) {
instância
x = a;
y = b;
r = c;
Variável
numcirc++;
local de
}
método
public double area ( ) {
double calc = 3.1416 * r * r;
return calc;
}
public static void main (String[ ] args) {
Circulo umcirculo = new Circulo ( 0.0, 0.0, 2.0 );
System.out.println("Area do circulo = " + umcirculo.area ( ));
System.out.println("Numero de circulos = " + Circulo.numcirc);
}
}
6
Variáveis de Classe x Variáveis de Instância
• Variáveis de Classe: existe apenas uma única
cópia da variável, associada à classe
• Variáveis de Instância: há uma cópia para
cada instância da classe
public class Circulo {
private static int numcirc = 0;
private double x, y, r;
Circulo (double x, double y, double r) {
this.x = x;
this.y = y;
this.r = r;
numcirc ++;
}
}
7
Variáveis de Classe
• Devemos acessá-la através da classe:
System.out.println (“Número de circulos = ” +Circulo.numcirc);
• Constantes
public class Circulo {
private static final double PI = 3.1415926535897;
...
}
– O modificador final significa que, uma vez
iniciado este atributo, ele não pode mais sofrer
alteração (~constante)
8
public class Circulo {
private static int numcirc = 0;
private static final double PI = 3.1415926535897;
private double x, y, r;
public Circulo ( double a, double b, double c) {
this.x = a;
this.y = b;
this.r = c;
numcirc ++;
}
public double calcularArea ( ) {
double calc = PI * this.r * this.r;
return calc;
}
public static void main (String[ ] args) {
Circulo umcirculo = new Circulo ( 0.0, 0.0, 2.0 );
System.out.println("Area do circulo = " + umcirculo. calcularArea ( ));
System.out.println("Numero de circulos = " + Circulo.numcirc);
}
}
9
Restrições de Acesso
• Já vimos que:
– uma classe define atributos, métodos e
construtores dessa classe
– objetos podem ser criados durante a execução de
um programa
– cada objeto contém variáveis de instância definidas
na classe e pode receber chamadas de métodos
declarados na sua classe
• Alguns modificadores de acesso podem ser
especificados em declarações de classes,
atributos e métodos, além do static, já
mencionado
10
Restrições de Acesso
• Java usa modificadores de controle de acesso
para especificar o nível de visibilidade de um
método ou uma variável para as outras classes
• Podem ser declarados quatro tipos de
modificadores de acesso:
–
–
–
–
public
private
protected
default (ou sem modificador)
• Modificadores de acesso podem ser aplicados
na definição de classes, nos atributos e nos
métodos
11
Restrições de Acesso
• public
– Pode ser acessado a partir de qualquer outra classe
– É a condição de menor restrição possível
• protected
– Pode ser acessado por métodos de classe que o contém,
assim como por qualquer classe que tenha sido derivada
dessa classe (sub-classes) mesmo que esteja em outro
package
• private
– É privativo da classe que o contém e seu uso não é permitido a
qualquer outra classe
• sem modificador
– Uso permitido dentro da classe que o contém, assim como
dentro de qualquer classe que tenha sido derivada dessa
classe, que esteja no mesmo package
– Este é o modificador default, isto é, aquele que é assumido se
nenhum modificador for explicitamente especificado
12
Visibilidade
Pacotes (package): unidades de compilação distintas,
usadas para divisão de programas em partes
organizadas hierarquicamente, que possibilita o
controle da visibilidade de nomes em programas
Acesso
permitido na
public
sem nenhum
modificador
protected
private
mesma classe
SIM
SIM
SIM
SIM
subclasse do
mesmo pacote
SIM
SIM
SIM
NÃO
classe do
mesmo pacote
SIM
SIM
SIM
NÃO
subclasse em
outro pacote
SIM
NÃO
SIM
NÃO
classe em
outro pacote
SIM
NÃO
NÃO
NÃO
13
Encapsulamento
• Objetivo: “ocultar” os detalhes de
implementação do mundo externo ao objeto e
restringir o acesso a atributos e métodos
14
Vantagens do Encapsulamento
• Segurança no acesso ao objeto
• Maior consistência no estado interno, pois
evita alteração incorreta dos atributos
• Maior facilidade de modularização
• A comunicação entre um objeto e o mundo
externo é feita através de troca de
mensagens
• Uma mensagem é tratada por um método
adequado da classe representante do
objeto
15
Operações de Abstração
Operações de Abstração – Conceitos
As operações de abstração mostram como o ser
humano mentaliza, organiza e modela o
mundo ao seu redor
• Algumas operações de abstração relevantes para
a Modelagem Conceitual são
Classificação / Instanciação
Generalização / Especialização
Agregação / Decomposição
Associação
17
Generalização
• Processo pelo qual os caracteres comuns a vários
objetos são identificados
• Pode resultar na formação de um novo conceito ou
idéia ou na extensão de um conceito já
determinado, que passa a cobrir uma nova classe
de exemplos
Especialização
• Processo de divisão do trabalho encarado do
ângulo individual
• Especializar é mencionar ou tratar à parte, de modo
especial; particularizar, singularizar, especificar
18
Generalização
Classe
Estudante
GENERALIZAÇÃO
Estudante de graduação
Estudante de pós-graduação
Classes
19
Especialização
Classe
Mamífero
ESPECIALIZAÇÃO
Baleia
Classe
20
Generalização/Especialização
Classe Geral
Pessoa
Estudante
Professor
Relação de
pertinência:
É UM TIPO DE
Funcionário
Diretor
Classes Especializadas
21
Generalização/Especialização
Notação
UML
Classe mais geral
Classe mais específica
22
Operações de Abstração
Relevantes para a Modelagem Conceitual
Generalização
Operação de análise de um conjunto de
classes que identifica características comuns
a todas elas, tendo como objetivo a definição
de uma classe mais genérica, a qual
especificará estas características comuns
Especialização
Operação em que, a partir de uma classe,
identifica-se uma ou mais sub-classes, cada
uma especificando características adicionais
em relação a classe mais geral
23
Operações de Abstração
Relevantes para a Modelagem Conceitual
Generalização / Especialização
Se, a partir de um conjunto de classes, pode-se
identificar características que são comuns a elas,
então uma nova classe, mais geral, pode ser
definida
– a partir de duas classes abstrai-se uma classe
mais genérica
– as sub-classes satisfazem todas as
propriedades das classes das quais elas
constituem especializações
– deve existir pelo menos uma propriedade que
distingue duas classes especializadas
24
Herança e Polimorfismo
Classes Abstratas
Herança
Herança é um relacionamento do tipo
generalização/especialização, onde uma
classe – a subclasse – pode ser
derivada de outra classe mais geral – a
superclasse – absorvendo todas as
suas características fundamentais e
podendo adicionar outras novas
características, de tal modo a torná-la
mais especializada
26
Herança
• Uma subclasse herda de sua(s)
superclasse(s) os atributos e os
métodos definidos nessa(s)
superclasse(s)
• No entanto, uma subclasse pode
redefinir métodos existentes nas
superclasses assim como acrescentar
novos atributos e novos métodos
27
Exemplo de Herança
Funcionario
nome
rg
salario
aumentar (valor)
pagar()
Superclasse
Chefe
gastos_extra
adicional_chefia
Subclasse
pagar()
28
Exemplo de Herança
Funcionario
nome
rg
salario
aumenta (valor)
pagar()
Atributos de um objeto da
classe Funcionário:
nome
rg
salario
Atributos de um objeto da
classe Chefe:
Chefe
gastos_extra
adicional_chefia
pagar()
nome
rg
salario
gastos_extra
adicional_chefia
29
Exemplo de Herança
Funcionario
#nome
#rg
#salario
+aumentar (valor)
+pagar
Chefe
-gastos_extra
-adicional_chefia
+pagar
Métodos que os objetos da
classe Funcionário podem
executar:
aumentar (valor)
pagar()
Métodos que os objetos da
classe Chefe podem executar:
aumentar (valor)
pagar()
30
Exemplo de Herança
Funcionario
#nome
#rg
#salario
+aumenta (valor)
+pagar
Chefe
-gastos_extra
-adicional_chefia
Métodos que os objetos da
classe Funcionário podem
executar:
aumentar (valor)
pagar()
qual pagamento?
Métodos que os objetos da
classe Chefe podem executar:
aumenta (valor)
+pagar
pagar()
31
Implementação da Superclasse Funcionario
public class Funcionario {
String nome;
String rg;
double salario;
public Funcionario (String nomef, String ident,
double sal) {
nome = nomef;
rg = ident;
salario = sal;
}
public void aumentar (double valor) {
salario = salario + valor;
}
public double pagar ( ) {
return salario;
}
}
32
Implementação da Superclasse Funcionario
public class Funcionario {
Atributos
String nome;
String rg;
double salario;
public Funcionario (String nomef, String ident,
double sal) {
nome = nomef;
rg = ident;
Construtor da classe
salario = sal;
}
public void aumentar (double valor) {
salario = this.salario + valor;
}
public double pagar ( ) {
return salario;
}
}
Métodos
Métododa
daclasse
classe
33
Implementação da Subclasse Chefe
public class Chefe extends Funcionario {
double gastos_extra;
double adicional_chefia;
public Chefe (String nomef, String rg, double sal,
double gastos, double adic) {
super (nomef, rg, sal);
gastos_extra = gastos;
adicional_chefia = adic;
}
public double pagar ( ) {
double recebe;
recebe = salario + gastos_extra + adicional_chefia;
return recebe;
}
}
34
Implementação da Subclasse Chefe
public class Chefe extends Funcionario {
double gastos_extra;
double adicional_chefia;
public Chefe (String nomef, String rg, double sal,
double gastos, double adic) {
super (nomef, rg, sal);
Palavra reservada para
gastos_extra = gastos;
designar que uma classe é
adicional_chefia = adic;
sub-classe de uma outra
}
no caso, Chefe é
public double pagarclasse;
(){
double recebe; uma sub-classe derivada de
Funcionário
recebe = salario + gastos_extra
+adicional_chefia;
return recebe;
}
}
35
Implementação da Subclasse Chefe
public class Chefe extends Funcionario {
double gastos_extra;
double adicional_chefia;
public Chefe (String nomef, String rg, double sal,
double gastos, double adic) {
super (nomef, rg, sal);
this.gastos_extra = gastos;
this.adicional_chefia = adic;
Invocação do método
}
public double pagar ( ) { construtor da superdouble recebe;
classe Funcionário
recebe = salario + gastos_extra +adicional_chefia;
return recebe;
}
}
36
Implementação da Subclasse Chefe
public class Chefe extends Funcionario
{
Atributos
adicionais
double gastos_extra;
double adicional_chefia;
public Chefe (String nomef, String rg, double sal,
double gastos, double adic) {
super (nomef, rg, sal);
Construtor da subclasse Chefe
gastos_extra = gastos;
adicional_chefia = adic;
Invocação do construtor da
}
superclasse Funcionario
public double pagar ( ) {
double recebe;
recebe = salario + gastos_extra +adicional_chefia;
return recebe;
}
Redefinição do método pagamento
}
37
Criação de um
objeto da
classe Chefe
Instanciação da subclasse
public class Teste {
public static void main (String [ ] args) {
Chefe joao = new Chefe ("Joao", "324569", 1158.21, 259.90, 500);
joao.aumentar (300);
System.out.println ("Joao ganha: R$ " + joao.pagar( ));
}
}
Execução do método pagar,
definido na subclasse Chefe
Execução do método aumentar, definido na
superclasse Funcionário para um objeto da
classe Chefe
38
Operador de referência super
• A palavra reservada super permite o uso de
nomes definidos na superclasse direta, que
foram redefinidos na subclasse
• Este operador deve ser usado com bastante
cuidado, principalmente na presença de
modificadores de acesso
• Exemplo:
39
Implementação da subclasse Chefe com super
public class Chefe extends Funcionario {
private double gastos_extra;
private double adicional_chefia;
public Chefe (String nomef, String rg, double sal, double gastos,
double adic) {
super (nomef, rg, sal); // Construtor da superclasse Funcionario
gastos_extra = gastos;
Execução do método
adicional_chefia = adic;
}
pagamento definido na
public double pagar ( ) {
superclasse
double recebe;
recebe = super.pagar ( ); // Chamada de pagamento( ) da superclasse
recebe = recebe + gastos_extra + adicional_chefia;
return recebe;
}
}
40
public class Ponto {
...
}
public class Ponto3D extends Ponto {
...
}
public class TestePonto { // classe de teste
public static void main (String [ ] args) {
...
}
}
41
public class Ponto {
private int x;
private int y;
public Ponto (int a, int b) { // Método Construtor
x = a;
y = b;
}
public double distancia (Ponto p) { // Método
int dx = x - p.x;
int dy = y - p.y;
return Math.sqrt (dx*dx + dy*dy);
}
}
42
public class Ponto3D extends Ponto {
private int z;
public Ponto3D (int a, int b, int c) {
super (a, b);
z = c;
}
public double distancia (Ponto3D p) {
int dx = x - p.x;
int dy = y - p.y;
int dz = z - p.z;
return Math.sqrt (dx*dx + dy*dy + dz*dz);
}
}
43
public class TestePonto {
public static void main (String [ ] args) {
Ponto p1 = new Ponto (0, 0);
Ponto p2 = new Ponto (10, 10);
System.out.println (p1.distancia(p2));
Ponto3D p3 = new Ponto3D (0, 0, 0);
Ponto3D p4 = new Ponto3D (10, 10, 10);
System.out.println (p3.distancia(p4));
}
}
44
Classes Abstratas
• Quando definimos uma classe supomos que
objetos desta classe serão criados e
instanciados
• Entretanto, há casos em que é útil definir
classes para as quais nunca serão
instanciados objetos
• Estas classes são utilizadas como
superclasses e são chamadas de superclasses
abstratas
• Nenhum objeto de superclasses abstratas pode
ser instanciado
45
Classes Abstratas
• O único propósito de uma classe abstrata é
fornecer uma determinada superclasse da qual
outras classes possam herdar a interface e/ou
a implementação
• As classes da qual objetos podem ser
instanciados chamam-se classes concretas
• Exemplo:
– classe Animal é uma classe geral, não há objetos
desta classe, e sim subclasses que são
especializadas, tais como Cavalo ou Cobra, que
podem possuir objetos instanciados
46
Outros Exemplos
47
Método Abstrato
não possui
implementação
abstract Forma
double x
double y
public void mover ( )
public abstract void mostrar ( )
Implementação
definida nas subclasses
Ponto
public Ponto (a, b)
public void mostrar ( )
Retangulo
double c
double d
public Retangulo (a,b,c,d)
public void mostrar ( )
48
//Classe Forma
public abstract class Forma {
...
}
//Classe Ponto
public class Ponto extends Forma {
...
}
//Classe Retangulo
public class Retangulo extends Forma {
...
}
//Classe Principal
public class Principal {
public static void main (String [ ] args) {
...
}
}
49
//Classe Forma
public abstract class Forma {
private double x;
private double y;
public void move (double dx, double dy) {
x+=dx;
y+=dy;
}
public abstract void mostra ( ); // método abstrato
}
50
//Classe Ponto
public class Ponto extends Forma {
public Ponto (double ax, double ay) { // construtor
x=ax;
y=ay;
}
// método mover não precisa ser redefinido
public void mostrar ( ) {
System.out.println("("+this.x+","+this.y+")");
}
}
51
//Classe Principal
public class Principal {
public static void main (String args [ ]) {
Ponto umponto = new Ponto (13,14);
umponto.mostra ( );
umponto.move (2,2);
umponto.mostra ( );
}
}
52
Polimorfismo
• Numa dada hierarquia de classes, diferentes
subclasses podem ser derivadas de uma
superclasse comum
• Neste caso, cada uma das subclasses pode
substituir ou estender as propriedades de sua
superclasse
Polimorfismo é a característica de herança que
assegura que as instâncias de uma dada
subclasse tenham comportamentos corretos,
mesmo que diferentes do comportamento
definido na sua superclasse
53
Polimorfismo
• Quando em uma subclasse se redefine um
método de sua superclasse (método default),
deve ser usado o mesmo nome do método
utilizado na superclasse
• Se o comportamento do método default da
superclasse é adequado para uma ou mais
subclasses, então ele não deve ser redefinido
• O método definido na subclasse pode
implementar um comportamento integralmente
diferente ou pode estender aquele definido na
superclasse, com características adicionais
54
Animal
Exemplo de
Polimorfismo
Mamíferos
tipoAlimentacao()
Roedores
Carnivoros
tipoAlimentacao()
Cachorros
Primatas
tipoAlimentacao()
Gatos
tipoAlimentacao()
55
Exemplo de
Polimorfismo
Gerente
gastos_extra
adicional_chefia
pagar()
Funcionario
nome
RG
salario
aumentar (valor)
pagar()
Presidente
participacao_lucros
pagar()
56
Download

pagar