Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
Isaias Camilo Boratti 4. Especialização de Classes VeiculoAutomotor Automovel Onibus Caminhao Carroceria Cacamba Isaias Camilo Boratti Exercício Considere que em determinada empresa os funcionários recebem um salário base e gratificação de produtividade. Considere que sobre o salário bruto incide desconto para o IRF conforme a seguir: Salário bruto Alíquota Parcela a deduzir até R$1000,00 isento - acima de R$1000,00 e até R$1800.00 10% R$100.00 acima de R$1800.00 25% R$370.00 Na empresa existem aqueles funcionários que exercem cargo de chefia e que adicionalmente recebem uma gratificação de chefia. Existem também aqueles funcionários que exercem função de apoio e que recebem auxilio educação. O auxílio educação é de R$60.00 por dependente limitado a um máximo de 5 dependentes. Sobre o auxílio educação não incide imposto de renda. Escreva uma aplicação que determine e mostre os dados salariais de um grupo de funcionários desta empresa. Apoio fornecaSalarioBruto( ) fornecaDesconto( ) fornecaAuxilioEducacao( ) Pessoa nome idade sexo Funcionario salarioBase grat nDependentes fornecaDesconto( ) fornecaSalarioBruto( ) fornecaSalarioLiquido() Demais métodos Chefe gratChefia fornecaSalarioBruto( ) Demais métodos Herança Definida através da palavra extends. public class Funcionario extends Pessoa { ................. } Pelo mecanismo da herança, todos os atributos e todos os métodos (não declarados como private) são herdados pela subclasse. Métodos construtores não são herdados. Na subclasse pode-se adicionar novos atributos e novos métodos. SOBREPOSIÇÃO --> MESMA ASSINATURA SOBRECARGA --> ASSINATURAS DIFERENTES Isaias Camilo Boratti Atributo de classe (desde que não private) é compartilhado (mesma locação física) pela classe e pelas classes descendentes. Métodos de classe (desde que não private) são herdados pela subclasse. Se, ao declararmos uma classe, não for definida sua superclasse, Java assume automaticamente a superclasse como sendo Object. Se em um método não estático de uma subclasse, quisermos a execução de um método da superclasse o qual foi sobreposto na subclasse, basta ativá- lo através especificação super. Exemplo: public class Tecnico extends Funcionario { public double fornecaSalarioBruto() { super.fornecaSalarioBruto(); ........................... } } A um identificador de objeto de uma superclasse pode-se atribuir uma instância da subclasse. public class Funcionario extends Pessoa { ........................... } Funcionario umF = new Funcionario(); Pessoa umaP = new Pessoa(); umaP = umF; // ok .................. umaP = new Pessoa(); umF = umaP; // ERRO ..................... umF = (Funcionario)umaP; // ok - coerção Isaias Camilo Boratti - Todo construtor de uma subclasse DEVE inicialmente chamar o construtor da superclasse. - Isto é feito através do comando super(argumentos). - Caso no construtor da subclasse não seja especificado nenhuma chamada ao construtor da superclasse, Java coloca automaticamente uma chamada ao construtor padrão da superclasse. - Caso na superclasse não exista o construtor padrão, ocorrerá um erro de sintaxe. - A chamada ao construtor da superclasse deve ser o primeiro comando do construtor da subclasse. Isaias Camilo Boratti - Para determinar se uma instância é ou não de uma determinada classe, pode- se usar o operador instanceof if (umF instanceof Chefe) { ............... } Veja que toda instância de uma subclasse é também considerada uma instância da superclasse. Assim, se Chefe é subclasse de Funcionario e umF instanceof Chefe --> true então umF instanceof Funcionario --> true Isaias Camilo Boratti public final class MinhaClasse { protected final int umAtributo; public final int facaAlgo() { final int x; x=10; // ok x=12; // erro ............................. } } - Se uma classe for declarada com o qualificador final então esta classe não poderá ser superclasse; - Um atributo declarado com o qualificador final é herdado pela subclasse (caso não seja private), entretanto só poderá ser inicializado uma única vez e isto já é feito pelo construtor. - Um método declarado com o qualificador final é herdado por uma subclasse (caso não seja private) entretanto não poderá ser sobreposto. Pode ser sobrecarregado. Isaias Camilo Boratti Modificadores public --> visibilidade na classe, pacote e fora do pacote. É herdado pela subclasse. protected --> visibilidade na classe e pacote. É herdado pela subclasse. private --> visibilidade restrita a classe. Não é herdado pela subclasse. Exercício: A receita federal classifica seus contribuintes em pessoas físicas (PF) e pessoas jurídicas (PJ). Considere que o imposto de renda das pessoas físicas seja calculado conforme a seguir: Renda líquida anual alíquota ( %) parcela a deduzir até R$10000,00 isento - > R$10000,00e até R$20000,00 10 R$1000,00 acima de R$20000,00 25 R$4000,00 A renda líquida é calculada subtraindo-se os gastos com saúde (até um limite de R$5000,00) e dependentes (R$1500,00 por dependente, limitado a 4 dependentes). Para pessoas jurídicas, considere que o imposto é calculado pela tabela a seguir: Renda líquida anual alíquota ( %) parcela a deduzir até R$100000,00 5 - > R$100000,00e até R$200000,00 10 R$5000,00 acima de R$200000,00 25 R$45000,00 Para cálculo da renda líquida de PJ é permitido abater os gastos com pagamento de pessoal. Isaias Camilo Boratti Juridico gastosPessoal fornecaRendaLiquida( ) fornecaImposto( ) Demais métodos Contribuinte nome rendaBruta FornecaRendaLiquida( ) // abstrato FornecaImposto( ) // abstrato Demais métodos Fisico nd gastosSaude fornecaRendaLiquida( ) fornecaImposto( ) Demais métodos Classe abstrata Classe Abstrata - Tem por objetivo organizar características comuns; - Não pode ser instanciada; - Se uma classe tiver pelo menos um método abstrato então ela é abstrata e DEVE ser declarada como abstrata; public abstract class MinhaClasse { ............................ public abstract void facaAlgo(); ............................ } Isaias Camilo Boratti - Se uma subclasse de uma classe abstrata NÃO SOBREPOR os métodos abstratos herdados, então a subclasse também é abstrata e DEVE ser declarada como abstrata. - Um método abstrato não apresenta corpo. - Para uma classe abstrata é possível declarar referências desta classe, mas não é permitido instanciar. Polimorfismo Poli + morfismo = Polimorfismo --> várias formas umAviao.voe(); umPassaro.voe(); FiguraPlana figura; ............................. double perimetro = figura.fornecaPerimetro(); /* figura pode conter uma instância da classe Circulo ou PoligonoRegular. Em função da classe da instância referida por figura, será selecionada automaticamente a forma (o método) correta. /* FiguraPlana cor FornecaPerimetro() //abstrato Circulo raio fornecaPerimetro( ) PoligonoRegular lado numerolados fornecaPerimetro( ) Isaias Camilo Boratti Polimorfismo --> mesmo tarefa --> formas diferentes em cada classe --> métodos diferentes, mas com o mesmo nome. Cada método implementa uma forma. Vinculação dinâmica ou vinculação tardia : A definição de qual método deve ser executado, depende da classe da instância referida pelo identificador de objeto. Assim, esta definição é deixada para quando da execução (no caso de java: interpretação) do programa. Veja que pelo Polimorfismo, pode-se fazer com que, entre as diferentes formas de implementação de uma tarefa, seja selecionada a forma correta, de acordo com a classe da instância executora. Isaias Camilo Boratti O conceito de interface Java não apresenta herança múltipla. Em vez disso, apresenta o conceito de interface. Uma interface consiste em uma classe sem atributos de instância e com todos os seus métodos abstratos (inclusive os de classe). Uma interface também aceita dados public static final (constantes). public interface FiguraPlana { public static final VALORPI = 3.1415; public abstract float fornecaArea(); public abstract float fornecaPerimetro(); } public interface CompDeslocavel { public abstract void deslocarH( float deslocamento); public abstract void deslocarV( float deslocamento); } public class Circulo extends Object implements FiguraPlana, CompDeslocavel { protected float x; protected float y; protected float raio; public Circulo() { x = 0.0f; y=0.0f; raio=0.0f; } public Circulo ( float vx, float vy, float vr) { x = vx; y = vy; raio = vr; if (raio < 0 ) raio = 0; } public float informeX() { return x;} public float informeY() { return y; } Isaias Camilo Boratti public void informeRaio() { return raio; } public void recebaValorX(float vx) { x = vx; } public void recebaValorY ( float vy ) { y = vy; } public void recebaValorRaio ( float vRaio) { raio = vRaio; if (raio < 0) raio=0; } public float fornecaArea() { // implementação do método abstrato herdado de FiguraPlana return VALORPI * Math.pow(raio,2); } Isaias Camilo Boratti public float fornecaPerimetro() { // implementação do método da interface FiguraPlana return 2*VALORPI*raio; } public void deslocarH( float v) { // implementação de método da interface CompDeslocavel x += v; } public void deslocarV ( float v) { // implementação de outro método da interface CompDeslocavel y = y + v; } } Isaias Camilo Boratti Em uma interface, também pode-se ter apenas declaração de constantes, como por exemplo: public interface Constantes { public static final float SM = 240.00d; public static final float VHT = 5.4d; } Isaias Camilo Boratti Classes Internas Java permite a declaração de uma (ou mais) classe internamente a outra classe. public class X { private int a; public X() { } .................. .................. public class Y { // classe interna // aqui o atributo a está visível ..................... ..................... } } public class SomadorPositivos { protected int cont; protected double soma; public SomadorPositivos() // construtor { cont = 0; soma = 0; } public int fornecaContagem() { return cont; } public double fornecaSoma() { return soma; } public void some ( double valor) { if (valor > 0) { cont ++; soma = soma + valor; } } public double fornecaMedia() { Calculador c = new Calculador(); return c.resultado(); } // declaração de classe interna private class Calculador { /* na classe interna tem-se acesso a variáveis de instância e métodos da classe externa */ public double resultado() { if ( cont > 0) return soma/cont; else return -1; } } // fim da declaração da classe interna } Isaias Camilo Boratti - Um objeto de uma classe interna tem acesso a todas as variáveis de instância (atributos) do objeto que o cria. Pode também executar qualquer método definido pela classe externa. - Uma classe interna só é visível dentro da classe externa, mesmo que seja declarada com o qualificador public.