Baixe o app para aproveitar ainda mais
Prévia do material em texto
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 interfaceJava 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.
Compartilhar