Logo Passei Direto
Buscar

Cap4 - Especializacao de Classes

User badge image

Enviado por Rodrigo Marques em

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.

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?