Professional Documents
Culture Documents
Guião POO - HERANÇAS
Guião POO - HERANÇAS
Objetivos da sessão
Heranças
● Definição de Herança
● Classes Abstratas e Interfaces
Software
● Java Development Kit: http://www.oracle.com/
● Eclipse: https://eclipse.org/.../eclipse-ide-java-ee-developers/lunasr2
Documentos
● (Este guião)
● Manual do Eclipse, Manual de Java
Bibliografia Suplementar
https://docs.oracle.com/javase/tutorial/
http://www.di.ubi.pt/~pprata/poo.htm
1 de 35
Programação em Java
Herança
Conceito de herança
Uma classe que pode herdar operações de uma superclasse e as suas operações podem ser
herdadas por subclasses.
O mecanismo de herança permite definir uma nova classe em termos de classe existente, com
modificações e/ou extensões de comportamento.
As subclasses herdam os atributos e métodos das superclasses. Os métodos herdados
podem ser alterados. Novos atributos e métodos podem ser adicionados às subclasses.
Na Herança Simples, cada subclasse tem apenas uma superclasse. Na herança múltipla
uma subclasse pode ter mais do que uma superclasse.
2 de 35
Programação em Java
ACTIVIDADE 1 - EXEMPLO!
public class Pessoa {
public int peso;
public float altura;
}
public class Teste {
Manel.estado();
}
}
Que tal o resultado? Reparem que não escrevemos uma linha de instrução na class Aluno.
E se criarmos o mesmo método estado(), na class Aluno? O que acontece? O estado é
atualizado? Claro que sim !!
3 de 35
Programação em Java
Esquema de herança
Empregado
Administrativo Diretor
Presidente
4 de 35
Programação em Java
Mas como é que sabemos que estamos a criar de forma correta a Herança?
O Desenho da Herança segue a regra:
“É UM….”
Questionamos se a subclasse pode ser uma superclasse, isto é, com base no nosso exemplo,
perguntamos, “A carrinha é um veículo?” Sim é. Neste caso em particular, a nossa herança
está corretamente criada. Vejamos os seguintes exemplos de heranças.
Veículo
Carro
Carrinha
5 de 35
Programação em Java
ACTIVIDADE 2 - EXEMPLO
1. Com base na classe EMPREGADO apresentada abaixo, vamos ver como vai
funcionar o nosso programa e se serve para criar subclasses.
Conseguimos criar Chefes?
● E se os chefes além do ordenado, receberem bónus?
● Será que serve a classe Empregado para criar Chefes?
2. Vamos fazer então as perguntas para saber qual vai ser a
superclasse e a subclasse:
● Um Chefe é sempre Empregado?
● Um Empregado é sempre um Chefe?
3. Depois de responder à pergunta. Vamos criar um método que
permita atribuir um bónus aos Chefes.
4. Crie uma classe de Empresa, criando os respectivos objetos.
Instancie cada um deles com dados ao seu critério.
5. Aplique um aumento aos empregados de 7% de produtividade.
6. Aplique um bónus aos chefes de 250€, por serem bons líderes.
7. Apresente na consola os valores de um empregado e de um chefe.
O output ficará ao seu critério.
Empregado
Superclasse
Chefe Subclasse
6 de 35
Programação em Java
7 de 35
Programação em Java
8 de 35
Programação em Java
//Criar um empregado
Empregado emp = new Empregado("Carlos",500,1);
//Criar um chefe
Chefe patrao = new Chefe("Jose", 5000,0);
//Após o aumento
emp.aumentarSalario(0.07);
patrao.aumentarSalario(0.07);
System.out.println("Após Aumento de 7%");
System.out.println(emp.getSalario());
System.out.println(patrao.getSalario());
9 de 35
Programação em Java
//Atributos da classe
private String nome;
private double salario;
private int codEmp;
//Getters e setters
public String getNome() {
return nome;
}
10 de 35
Programação em Java
11 de 35
Programação em Java
//Criar um empregado
Empregado emp = new Empregado("Carlos",500,1);
//Criar um chefe
Chefe patrao = new Chefe("Jose", 5000,0);
12 de 35
Programação em Java
//Após o aumento´
//Aumento do salário de 7%
emp.aumentarSalario(0.07);
patrao.aumentarSalario(0.07);
Output é:
13 de 35
Programação em Java
EXEMPLO 1
Carro
Superclasse
Renault Subclasse
14 de 35
Programação em Java
1. Assim sendo vamos criar a classe “Carro” como Abstracta, utilizando a palavra reservada
abstract : public abstract class Carro
Uma classe abstracta não contem atributos, construtores com atributos, mas pode conter:
métodos concretos (assinatura do método + corpo) e
métodos abstractos (apenas a assinatura do método).
A existência de métodos abstractos garante que estes serão, obrigatoriamente,
implementados nas subclasses da classe abstracta.
Existe, contudo, uma exceção ao que anteriormente foi referido. Se a classe que estende a
classe abstracta for abstracta, não é obrigada a implementar os métodos abstractos da
classe estendeu.
15 de 35
Programação em Java
EXEMPLO 1
package Exemplo1;
//O construtor, não está instanciar atributos mas sim apresentar uma
//mensagem
public Carro(){
System.out.println("Apresenta Carro");
}
//Método devolve o consumo por litros por kilometros
public double consumo(double km, double litros){
return (litros/km)*100;
}
package Exemplo1;
16 de 35
Programação em Java
O output é na consola:
17 de 35
Programação em Java
package Exemplo1;
public abstract class Carro {
//O construtor, não está instanciar atributos mas sim apresentar uma
//mensagem
public Carro(){
System.out.println("Apresenta Carro");
}
//Método devolve o consumo por litros por kilometros
public double consumo(double km, double litros){
return (litros/km)*100;
}
//Método abstrato tem que ser utilizado nas subclasses
//Assinatura do método abstrato
public abstract void DadosCarro(int ano, String modelo);
}
package Exemplo1;
public Renault() {
double consumo = consumo(1000,50);
System.out.println(consumo);
}
@Override
public void DadosCarro(int ano, String modelo) {
18 de 35
Programação em Java
}
}
O output na consola é:
19 de 35
Programação em Java
ACTIVIDADE 3
CLASSES ABSTRATAS
1. Considere uma superclasse abstrata FIGURA, que representa todas as figuras
geométricas, servindo de modelo para todos os objetos de figuras geométricas que
iremos criar. Esta classe irá ter como métodos abstratos, ÁREA() e PERIMETRO(), não
instanciados. Ambos retornam valores do tipo double.
a. Crie uma classe CIRCULO, que deverá ser subclasse de FIGURA. Esta classe terá
como atributo o RAIO. Crie os gets e sets do atributo. Nos métodos abstratos, retorne o
cálculo da área e o perímetro da classe.
b. Crie uma classe QUADRADO, que deverá ser subclasse de FIGURA. Esta classe terá
como atributo o LADO. Crie os gets e sets do atributo. Nos métodos abstratos, retorne o
cálculo da área e o perímetro da classe.
c. Crie um MENÚ numa classe principal do tipo main, que permita ao utilizador escolher
qual a figura geométrica da qual pretende calcular os dados. Conforme a escolha, assim
deverá surgir o pedido de introdução dos dados do atributo da figura geométrica
respetiva.
d. (desafio)Proceda à atualização necessária do seu programa, de modo a que possa
acrescentar uma nova figura geométrica, por exemplo, o Triângulo (Perímetro:
L1+L2+L3), (Área: (Base * Altura) /2).
20 de 35
Programação em Java
1. Criar uma superclasse abstrata FIGURA, que representa todas as figuras geométricas,
servindo de modelo para todos os objetos de figuras geométricas que iremos criar. Esta
classe irá ter como métodos abstratos, ÁREA() e PERIMETRO(), não instanciados ou não
mplementados. Ambos retornam valores do tipo double.
a. Crie uma classe CIRCULO, que deverá ser subclasse de FIGURA. Esta classe terá como
atributo o RAIO. Crie os gets e sets do atributo. Nos métodos abstratos, retorne o cálculo da
área e o perímetro da classe.
}
//NÃO É NECESSÁRIO CRIAR
//O Construtor de inicialização do raio
public Circulo(double raio) {
super();
this.raio = raio;
}
//Getters e Setters
public double getRaio() {
return raio;
}
21 de 35
Programação em Java
b. Crie uma classe QUADRADO, que deverá ser subclasse de FIGURA. Esta classe terá
como atributo o LADO. Crie os gets e sets do atributo. Nos métodos abstratos, retorne o
cálculo da área e o perímetro da classe.
//Atributos
public double lado;
//Getters e Setters
public double getLado() {
return lado;
}
22 de 35
Programação em Java
@Override
public double perimetro() {
return 4*getLado();
}
}
c. Crie um MENÚ numa classe principal do tipo main, que permita ao utilizador escolher qual
a figura geométrica da qual pretende calcular os dados. Conforme a escolha, assim deverá
surgir o pedido de introdução dos dados do atributo da figura geométrica respetiva.
int escolha = 0;
Scanner entrada = new Scanner(System.in);
do{
System.out.println("****Menu Figuras Geométricas******");
System.out.println(" 1 - Circulo");
System.out.println(" 2 - Quadrado");
System.out.println(" 0 - Saír");
System.out.println("**********************************");
System.out.println("Escolha a Figura");
escolha = entrada.nextInt();
if(escolha ==1)
{
Circulo c = new Circulo();
System.out.println("Insira o Raio:");
c.setRaio(entrada.nextDouble());
System.out.printf("Area do Círculo:%.2f\n",c.area());
System.out.printf("Perímetro:%.2f\n\n", c.perimetro());
}
else if (escolha ==2) {
Quadrado q = new Quadrado();
System.out.println("Insira o Lado:");
q.setLado(entrada.nextDouble());
23 de 35
Programação em Java
O output é:
24 de 35
Programação em Java
INTERFACES
Por exemplo, suponhamos que temos, numa loja, um programa que faz o inventário da
loja. Para fazer o inventário, precisa de recolher determinada informação de cada objeto,
número, tipo e preço. Deste modo, para esse programa poder recolher essa informação,
precisa ter uma interface com esse objeto. Assim, seria implementado em cada objeto da loja,
uma mesma interface que permitisse ao programa interagir com os objetos de modo a recolher
a informação necessária.
Interfaces são classes que não definem a implementação dos métodos, mas apenas as
suas assinaturas (nomes e argumentos). Interfaces não podem ter atributos e todos os seus
métodos são implicitamente abstratos e públicos.
Uma classe pode estender apenas uma única superclasse (para evitar conflitos entre os
comportamentos herdados), mas pode implementar várias interfaces (mesmo que elas definam
métodos com a mesma assinatura).
As interfaces permitem definir funcionalidades baseadas em conceitos que se aplicam a várias
classes distintas (em hierarquias de especialização diferentes):
● Uma classe estende uma outra classe
● Uma classe implementa uma ou várias interfaces
● Uma interface estende uma ou várias interfaces
● Uma classe pode, ao mesmo tempo, estender outra classe e implementar uma ou várias
interfaces
Assim, o JAVA não suporta herança múltipla, ou seja, apenas pode “estender” uma classe. No
entanto, pode implementar (implements) várias Interfaces. Uma interface serve para “obrigar”
uma classe a ter uma determinada estrutura, um determinado conjunto de métodos e/ou
variáveis.
Nesta apenas estão definidas as assinaturas dos métodos.
25 de 35
Programação em Java
EXEMPLO 2
Toyota Opel
Subclasses
package Exemplo2;
String modelo();
package Exemplo2;
26 de 35
Programação em Java
package Exemplo2;
package Exemplo2;
Outra versão
27 de 35
Programação em Java
@Override
public double consumo(double km, double litros) {
double consumo = (litros/km)*100;
return consumo;
}
}
public class Opel implements Viatura {
@Override
public String modelo() {
String modelo = "Corsa";
return modelo;
@Override
public double consumo(double km, double litros) {
double consumo = (litros/km)*100;
return consumo;
}
public class Stand {
System.out.println(t.modelo());
System.out.printf("Consumo:%.2f\n", t.consumo(100,5));
}
}
28 de 35
Programação em Java
INTERFACES
1.
a. Crie uma INTERFACE CONTA, que seja padrão de todos os objetos criados. Deverá
ter dois métodos do tipo VOID, Deposita(double valor) e Levanta(double valor).
b. Crie uma classe ContaCorrente, implementada da interface CONTA, que tenha
como atributo o SALDO. Crie os gets e sets do atributo e implemente os métodos
Deposita e Levanta, que permite aumentar e diminuir o saldo da Conta Corrente.
c. Crie uma classe ContaPoupanca, implementada da interface CONTA, que tenha
como atributo o SALDO. Crie os gets e sets do atributo e implemente os métodos
Deposita e Levanta, que permite aumentar e diminuir o saldo da Conta Poupança.
d. Crie uma classe principal BANCO, que permita gerir as diferentes contas. Crie um
MENÚ,
que permita ao utilizador, selecionar que tipo de Conta Pretende Gerir. Em ambas as
escolhas, o utilizador deverá definir um SALDO INICIAL (setSaldo). Em seguida,
deverá surgir um menu personalizado para cada conta, sendo que as opções
deverão ser:
29 de 35
Programação em Java
//ASSINATURAS DE 2 MÉTODOS
//método com 1 parametro - assinatura do método Deposita
void Deposita(double valor);
void mostramenu();
30 de 35
Programação em Java
//Médodo reescrito
@Override
public void Deposita(double valor) {
this.saldocontaC = this.saldocontaC+= valor;
System.out.println("Depositou: " + valor);
System.out.println("Saldo Atual: " + getSaldocontaC()+
"\n");
}
@Override
public void Levanta(double valor){
System.out.println("Saldo Atual: " + getSaldocontaC());
if (this.saldocontaC>=valor){
this.saldocontaC -= valor;
System.out.println("Levantou: " + valor);
System.out.println("Novo Saldo: " +
getSaldocontaC() + "\n");
}
else
{
System.out.println("O Saldo da Conta Corrente <
VALOR DE levantamento\n");
}
}
31 de 35
Programação em Java
//Métodos implementados
@Override
public void Deposita(double valor) {
saldocontaP += valor;
System.out.println("Depositou: " + valor);
System.out.println("Novo saldo: " + saldocontaP + "\n");
}
@Override
public void Levanta(double valor) {
if ((valor >=300)&&(this.saldocontaP>=valor))
{
this.saldocontaP -= valor;
System.out.println("Levantou: " + valor);
System.out.println("Novo Saldo: " + getSaldocontaP() +
"\n");
}
else
32 de 35
Programação em Java
}
public void mostrasubmenu(){
System.out.println("Selecione a sua opção");
System.out.println("1 – Deposita Dinheiro");
System.out.println("2 – Levanta Dinheiro");
System.out.println("3 – Verifica Saldo");
System.out.println("4 - Sair\n");
}
import java.util.Scanner;
do{
cc.mostramenu();
escolha = dados.nextInt();
switch(escolha){
case 1:
{
System.out.println("Menu Conta Corrente");
System.out.println("Insira o saldo inicial CONTA
CORRENTE");
saldoinicial = dados.nextInt();
cc.setSaldocontaC(saldoinicial);
do{
cc.mostrasubmenu();
escolha1 = dados.nextInt();
33 de 35
Programação em Java
if(escolha1==1)
{
}
break;
case 2:
{
System.out.println("Menu Conta Poupança");
System.out.println("Insira o saldo inicial CONTA
Poupança");
saldoinicial1 = dados.nextInt();
cp.setSaldocontaP(saldoinicial1);
do{
cp.mostrasubmenu();
escolha1 = dados.nextInt();
if(escolha1==1)
{
System.out.println("Quanto deseja depositar?");
valor2 = dados.nextDouble();
System.out.println("Saldo inicial = " +
cp.getSaldocontaP());
cp.Deposita(valor2);
}
else if (escolha1==2)
{
System.out.println("Quanto deseja levantar?");
34 de 35
Programação em Java
valor2 = dados.nextDouble();
cp.Levanta(valor2);
}
else if (escolha1==3)
{
cp.verficasaldoP();
}
else
System.out.println("Saíu do menu");
}
}
while(escolha!=0);
System.out.println("Fim do programa!!!!! ");
dados.close();
}
35 de 35