atributos e métodos estáticos restrições de acesso encapsulamento operações de abstração...
TRANSCRIPT
Atributos e Métodos EstáticosRestrições de Acesso
Encapsulamento
Operações de Abstração
Herança e PolimorfismoClasses Abstratas
Atributos e Métodos EstáticosRestrições de Acesso
Encapsulamento
3
Variáveis – Classe, Instância e Método
• Tipos de variáveis estudadas– Variável local de método– Variável de instância
• 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
diferença?
4
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;
5
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);}
}
Exemplo
6
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);}
}
Variável de classe
Variáveis de
instância
Variável local de método
Exemplo
7
• 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 classepublic 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 ++; }}
Variáveis de Classe x Variáveis de Instância
8
Variáveis de Classe
• Devemos acessá-la através da classe:System.out.println (“Número de circulos = ” +Circulo.numcirc);
• Constantespublic 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)
9
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);}
}
10
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
11
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
12
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
13
VisibilidadePacotes (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 SIMsubclasse 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
14
Encapsulamento
• Objetivo: “ocultar” os detalhes de implementação do mundo externo ao objeto e restringir o acesso a atributos e métodos
15
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
Operações de Abstração
17
Operações de Abstração – Conceitos As operações de abstração mostram como o ser As operações de abstração mostram como o ser
humano mentaliza, organiza e modela o humano mentaliza, organiza e modela o mundo ao seu redormundo 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
18
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
19
Estudante
GENERALIZAÇÃO
Classes
Classe
Estudante de graduação Estudante de pós-graduação
Generalização
20
Especialização
ESPECIALIZAÇÃO
Classe
Classe
Mamífero
Baleia
21
Generalização/Especialização
Classe GeralPessoa
Classes Especializadas
Relação de pertinência: É UM TIPO DE
Estudante Professor Funcionário Diretor
22
Generalização/Especialização
Classe mais geral
Classe mais específica
NotaçãoUML
23
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
24
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
Herança e PolimorfismoClasses Abstratas
26
Herança
Herança é um relacionamento do tipo generalização/especialização, onde uma classe – a subclassesubclasse – pode ser derivada de outra classe mais geral – a superclassesuperclasse – absorvendo todas as suas características fundamentais e podendo adicionar outras novas características, de tal modo a torná-la mais especializada
27
Herança
• Uma subclasse herdaherda de sua(s) superclasse(s) os atributos e os métodos definidos nessa(s) superclasse(s)
• No entanto, uma subclasse pode redefinir métodosredefinir métodos existentes nas superclasses assim como acrescentar acrescentar novos atributos e novos métodosnovos atributos e novos métodos
28
Exemplo de HerançaFuncionario
nomergsalario
aumentar (valor)pagar()
Chefe
gastos_extraadicional_chefia
pagar()
Superclasse
Subclasse
29
Exemplo de HerançaFuncionario
nomergsalario
aumenta (valor)pagar()
Chefe
gastos_extraadicional_chefia
pagar()
Atributos de um objeto da classe Funcionário:
nomergsalario
Atributos de um objeto da classe Chefe:
nomergsalariogastos_extraadicional_chefia
30
Exemplo de HerançaFuncionario
#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()
31
Exemplo de HerançaFuncionario
#nome#rg#salario
+aumenta (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:
aumenta (valor)pagar()
qual pagamento?
32
Implementação da SuperclasseSuperclasse 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;}
}
33
Implementação da SuperclasseSuperclasse 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 = this.salario + valor;}public double pagar ( ) {
return salario;}
}
Construtor da classe
Método da classeMétodos da classe
Atributos
34
Implementação da SubclasseSubclasse Chefepublic 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;
}}
35
Implementação da SubclasseSubclasse Chefepublic 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;
}}
Palavra reservada para designar que uma classe é sub-classe de uma outra classe; no caso, Chefe é
uma sub-classe derivada de Funcionário
36
Implementação da SubclasseSubclasse Chefepublic 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;}public double pagar ( ) { double recebe; recebe = salario + gastos_extra +adicional_chefia; return recebe;
}}
Invocação do método construtor da super-classe Funcionário
37
Implementação da SubclasseSubclasse Chefepublic 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;
}}
Atributos adicionais
Construtor da subclasse Chefe
Invocação do construtor da superclasse Funcionario
Redefinição do método pagamento
38
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( ));
}}
Criação de um objeto da
classe Chefe
Execução do método aumentar, definido na superclasse Funcionário para um objeto da
classe Chefe
Execução do método pagar, definido na subclasse Chefe
39
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:
40
Implementação da subclasse Chefe com superpublic 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;adicional_chefia = adic;
} public double pagar ( ) {
double recebe;recebe = super.pagar ( ); // Chamada de pagamento( ) da superclasserecebe = recebe + gastos_extra + adicional_chefia;return recebe;
}}
Execução do método pagamento definido na
superclasse
41
public class Ponto {...
}
public class Ponto3D extends Ponto {...
}
public class TestePonto { // classe de testepublic static void main (String [ ] args) {
... }}
42
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étodoint dx = x - p.x;int dy = y - p.y;return Math.sqrt (dx*dx + dy*dy);
}}
43
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);}
}
44
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));
}}
45
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
46
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
47
Outros Exemplos
48
abstract Forma
double xdouble y
public void mover ( )public abstract void mostrar ( )
Ponto
public Ponto (a, b)public void mostrar ( )
Retangulo
double cdouble d
public Retangulo (a,b,c,d)public void mostrar ( )
Método Abstrato não possui
implementação
Implementação definida nas sub-
classes
49
//Classe Formapublic abstract class Forma {
...} //Classe Pontopublic class Ponto extends Forma {
...} //Classe Retangulopublic class Retangulo extends Forma {
...} //Classe Principalpublic class Principal {
public static void main (String [ ] args) {...
}}
50
//Classe Formapublic 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
}
51
//Classe Pontopublic class Ponto extends Forma {
public Ponto (double ax, double ay) { // construtorx=ax; y=ay;
}// método mover não precisa ser redefinidopublic void mostrar ( ) {
System.out.println("("+this.x+","+this.y+")");}
}
52
//Classe Principalpublic class Principal {
public static void main (String args [ ]) {Ponto umponto = new Ponto
(13,14);umponto.mostra ( );umponto.move (2,2);umponto.mostra ( );
}}
53
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 Polimorfismo é a característica de herança que assegura que as instâncias de uma dada assegura que as instâncias de uma dada
subclasse tenham comportamentos corretos, subclasse tenham comportamentos corretos, mesmo que diferentes do comportamento mesmo que diferentes do comportamento
definido na sua superclasse definido na sua superclasse
54
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
55
Animal
Mamíferos
tipoAlimentacao()
Carnivoros
tipoAlimentacao()
Roedores Primatas
tipoAlimentacao()
Cachorros Gatos
tipoAlimentacao()
Exemplo de Polimorfismo
56
Funcionario
nomeRGsalario
aumentar (valor)pagar()
Gerente
gastos_extraadicional_chefia
pagar()
Presidente
participacao_lucros
pagar()
Exemplo de Polimorfismo