Programação I Aula 8 (Herança, Associação, Classes Abstratas e Membros Estáticos) Prof. Gilberto Irajá Müller Última atualização 28/4/2009 Herança • Exercícios 8.1. Identifique pares a seguir: • • • • ClienteEspecial, Cliente Veículo, Caminhão Motorista, Funcionário Quadrilátero, Quadrado a superclasse e a subclasse nos Herança • Exercícios 8.2. Quais dos grupos de classes abaixo apresentam relação de herança? Desenhe diagramas de classes para cada grupo, mostrando as relações de herança existentes. • • • • • • Empregado, Cliente Monitor, UnidadeDeEntradaESaída Leite, Produto, ProdutoPerecível Música, ObraDeArte, Pintura, Samba Automóvel, Peça, Eixo, Veículo Caminhão, Balão, Veículo, Proprietário, Avião, VeículoTerrestre, Pessoa, Ônibus, VeículoAéreo Herança • Exercícios 8.3. Escreva um comentário ao lado de cada instrução indicando qual o método que será chamado. Herança • Exercícios 8.4. Escreva um comentário ao lado de cada instrução indicando qual o método que será chamado. Herança • Exercícios 8.5. Escreva os construtores para a classe Filho. Associação • Sempre que um atributo de uma classe não é de tipo primitivo, temos uma associação desta classe com alguma outra • Uma associação (binária) é um relacionamento estrutural entre duas classes, especificando que os objetos de uma classe estão conectados a objetos de outra Associação public class Cliente{ private int codigo; private Data dtNascimento; public Cliente(int codigo, int dia, int mes, int ano) { this.codigo = codigo; this.dtNascimento = new Data(dia, mes, ano); } } O blueJ trata a associação como uma dependência (----) Em UML temos: Classes Abstratas • Uma classe abstrata é aquela que não pode ser instanciada. É uma classe que existe para ser herdada obrigatoriamente. Constitui-se em um "molde" a partir do qual subclasses serão construídas. Em Java, indica-se com o modificador abstract antes da palavra class. public abstract class Empregado{ private String nome; ... Em UML temos o nome } <<abstract>> que é chamado de “estereótipo”. O nome da classe está em negrito e itálico. Os métodos abstratos ficarão em itálico. Classes Abstratas • Ex.. Uma empresa contrata empregados através de uma das duas modalidades de pagamento: mensalistas ou horistas. O empregado mensalista recebe um salário básico mensal fixo mais as horas extras que ele faz no mês. O valor de uma hora-extra corresponde a 1/160 do salário básico mensal. O empregado horista simplesmente recebe pelas horas trabalhadas no mês, não existindo o recurso de hora extra. Classes Abstratas • Nenhum empregado jamais será instanciado na superclasse, uma vez que ele deve ser obrigatoriamente enquadrado numa das duas categorias: mensalista ou horista. A classe empregado, neste caso, é dita uma classe abstrata. • Uma classe que realmente instancia objetos é dita uma classe concreta. É o caso das nossas classes Horista e Mensalista • Uma superclasse abstrata é extremamente genérica, especificando apenas características comuns a qualquer subclasse possível. Em nosso exemplo, todo empregado tem um nome • Uma classe abstrata possui, em geral, um ou mais métodos abstratos Classes Abstratas • Um método abstrato é um método composto apenas de assinatura e sem implementação (sem bloco de código). A implementação deverá ser feita obrigatoriamente pelas subclasses concretas. Indica-se método pelo modificador abstract antes do tipo de retorno public abstract double calculaLiquidoMes(int horas); • Este método abstrato na classe Empregado obriga sua sobrescrita em subclasses concretas. Assim, cada categoria específica de empregado irá implementar de forma diferente o cálculo do valor líquido que o empregado irá receber ao final do mês Classes Abstratas • Ex.: Classes Abstratas • Ex.: Implementação da classe concreta Mensalista Classes Abstratas • Ex.: Implementação da classe concreta Horista Classes Abstratas • Ex.: Classe Teste Classes Abstratas • Considerações sobre classes abstratas: • Construtores não podem ser abstratos • Uma classe que contém um ou mais métodos abstratos deve ser declarada como abstrata, mesmo que tenha métodos não abstratos • Cada subclasse concreta de uma superclasse abstrata deve implementar os métodos abstratos da superclasse • Se uma classe estende outra que tem método abstrato e não o implementa, então ela também é abstrata e deve ser declarada como tal Classes Abstratas • Exercício 8.6. Crie a classe abstrata Figura sem nenhum atributo e com os métodos abstratos calculaArea e calculaPerimetro, que retornam, respectivamente, a área e o perímetro da figura. A seguir, crie: • a subclasse concreta Retangulo com dois atributos base e altura. • a subclasse concreta Circulo com o atributo raio. Retângulo: Área: Base * Altura Perímetro: Base * 2 + Altura * 2 Círculo: Área: PI * R2 Perímetro: 2 * PI * R Membros Estáticos • A palavra-chave static indica que o escopo do membro (atributo ou método) é a classe e não a instância. • Até o momento, estávamos instanciando uma classe obtendo uma cópia da classe. • Um atributo static permite que todas as instâncias compartilhem uma única cópia da variável, isto é, um atributo static se refere à classe toda e não a cada instância da classe em particular. Por isso são chamados atributos de classe. Se um objeto da classe mudar o valor do atributo static, todos os objetos da classe terão acesso ao novo valor. Membros Estáticos (atributo) • Ex.: public class AcessoCatraca { private static int acessosTotal; // atributo da classe private String nome; public AcessoCatraca(String nome) { this.nome = nome; this.acessosTotal++; } public int getAcessoTotal() { return acessosTotal; } } Membros Estáticos (atributo) • Ex.: public class TesteCatraca { public static void main(String[] args) { AcessoCatraca a = new AcessoCatraca("Gilberto"); System.out.println(a.getAcessoTotal()); AcessoCatraca b = new AcessoCatraca("João"); System.out.println(b.getAcessoTotal()); } } Qual é a saída? Membros Estáticos (método) • Todo método de nossas classes programadas até agora (exceção feita ao main) operam sobre alguma instância particular da classe (um objeto daquela classe), a qual é o seu parâmetro implícito. • Um método static (ou método de classe) é aquele declarado com a palavra-chave static e não tem um parâmetro implícito, isto é — ele não opera sobre um objeto em particular Membros Estáticos (método) • Ex.: public class AcessoCatraca { private static int acessosTotal; // atributo da classe private String nome; public AcessoCatraca(String nome) { this.nome = nome; this.acessosTotal++; } public static int getAcessoTotal() { return acessosTotal; } } Membros Estáticos (método) • Ex.: public class TesteCatraca { public static void main(String[] args) { AcessoCatraca a = new AcessoCatraca("Gilberto"); System.out.println(AcessoCatraca.getAcessoTotal()); AcessoCatraca b = new AcessoCatraca("João"); System.out.println(AcessoCatraca.getAcessoTotal()); } } Qual é a saída? Membros Estáticos • A grande vantagem do método static é ser chamado sem necessidade de instanciar um objeto • Um método static não pode acessar membros não- static. Ex.: public static int getAcessoTotal() { nome = "Teste"; // Atributo nome não é estático! return acessosTotal; } • O Java utiliza o recurso de static, como por exemplo a classe Math. Membros Estáticos • Exercício 8.7. Crie uma classe Calculadora que realiza as quatro operações básicas (somente para números inteiros). Utilize “static”. Hot Topic • Evite erros e notação errada para associação, dependência e generalização/especialização • É UM identifica a presença de generalização/especialização. Todo objeto da classe B é um objeto também da classe A. . • TEM UM ATRIBUTO DE identifica uma associação. A classe A tem um atributo do tipo B. • USA serve para denotar a presença de uma dependência. A classe A usa funcionalidades da classe B. Hot Topic • Pode-se aplicar o modificador final a métodos e a classes: • Um método declarado final não pode ser redefinido numa • • • • subclasse Métodos static e métodos private são implicitamente final Métodos final podem melhorar o desempenho Uma classe declarada final não pode ser superclasse Toda classe final tem seus métodos implicitamente final Métodos • Referências bibliográficas • http://inf.unisinos.br/~anibal