atributos e métodos estáticos restrições de acesso encapsulamento operações de abstração...

Post on 07-Apr-2016

221 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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

top related