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