JAVA - Apostila
532 pág.

JAVA - Apostila


DisciplinaProgramação Orientada A Objetos3.926 materiais57.478 seguidores
Pré-visualização28 páginas
é uma referência à superclasse
Por exemplo:
usamos this() para invocar construtores da própria classe,
agora usamos super() para invocar construtores da
superclasse
usamos this. para acessar atributos e invocar métodos da
própria classe, agora usamos super. para acessar atributos
e invocar métodos da superclasse
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 249 / 527
POO \u2013 Herança
Sessão \u201cVale a pena ver de novo\u201d: Sobreposição
Você sobrepõe uma operação quando deseja que uma
operação herdada seja realizada diferentemente pela
subclasse
Por exemplo, uma cobra se alimenta de ratos, mas um tipo
específico de cobra (subclasse) se alimenta diferentemente
Assim, é necessário sobrepor o método alimentar:
Classe Cobra
void alimentar (Rato comida) { /* mata e come */ }
Classe Cascavel
@Override
void alimentar (Rato comida) { /* come mesmo vivo */ }
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 250 / 527
POO \u2013 Herança
Sessão \u201cVale a pena ver de novo\u201d: Sobrecarga
Você sobrecarrega uma operação quando deseja que a
mesma operação também seja realizada por entradas
diferentes
Por exemplo, uma cobra se alimenta de ratos, mas um tipo
específico de cobra (subclasse) se alimenta também de
ratazanas
Assim, é necessário sobrecarregar o método alimentar:
Classe Cobra
void alimentar (Rato comida) { /* mata e come */ }
Classe Cascavel
@Override
void alimentar (Rato comida) { /* come mesmo vivo */ }
void alimentar (Ratazana comida) { /* come também */ }
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 251 / 527
POO \u2013 Herança
Exemplo Completo
Nada como uma aplicação mais prática para
entendermos melhor...
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 252 / 527
POO \u2013 Herança
Classe Conta
public class Conta {
protected final Correntista correntista;
protected double saldo;
public Conta(Correntista correntista, double saldo) {
this.correntista = correntista;
this.saldo = saldo;
}
public Conta(Correntista correntista) {
this( correntista, 0.0 );
}
public Correntista getCorrentista() {
return correntista;
}
public double getSaldo() {
return saldo;
}
/* continua */
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 253 / 527
POO \u2013 Herança
Classe Conta
public void depositar( double valor ) {
this.saldo += valor;
}
public boolean retirar( double valor ) {
if ( valor <= this.saldo ) {
this.saldo -= valor;
return true;
}
return false;
}
@Override
public String toString() {
return this.correntista.getNome() + &quot;tem R$&quot; + this.saldo;
}
}
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 254 / 527
POO \u2013 Herança
Importante sobre a classe Conta
Observe a visibilidade dos atributos
Observe a chamada entre construtores utilizando this
Observe a sobreposição do método toString
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 255 / 527
POO \u2013 Herança
Classe ContaCorrente
public class ContaCorrente extends Conta {
private double limite;
public ContaCorrente(Correntista correntista, double saldo, double limite) {
super( correntista, saldo );
this.limite = limite;
}
@Override
public boolean retirar( double valor ) {
if ( valor <= this.saldo + this.limite ) {
this.saldo -= valor;
return true;
}
return false;
}
public void depositar( Cheque cheque ) {
this.saldo += cheque.getValor();
}
@Override
public String toString() {
return super.toString() + &quot;mais limite de R$&quot; + this.limite;
}
}
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 256 / 527
POO \u2013 Herança
Importante sobre a classe ContaCorrente
Observe que estende a classe Conta
Logo, deve chamar algum construtor de Conta
E chama: super( correntista, saldo );
Mas, poderia ser também: super( correntista );
E se não chamasse nenhum? O que aconteceria?
Observe a sobreposição dos métodos retirar e toString
Observe a sobrecarga do método depositar
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 257 / 527
POO \u2013 Herança
Exemplo Completo
public static void main( String[] args ) {
2 Conta c = new Conta( new Correntista( 111, &quot;Fred&quot; ), 25.0 );
ContaCorrente cc = new ContaCorrente( new Correntista( 222, &quot;Luciano&quot; ), 100.00, 1000.00 );
4
System.out.println( c ); /* Fred tem R$25.00 */
6 System.out.println( cc ); /* Luciano tem R$100.00 mais limite de R$1000.00 */
8 System.out.println( c.getSaldo() ); /* 25.00 */
System.out.println( &quot;Retirada de R$26.0:&quot; + c.retirar( 26.0 ) ); /* false */
10 System.out.println( c.getSaldo() ); /* 25.00 */
12 System.out.println( cc.getSaldo() ); /* 100.00 */
System.out.println( &quot;Retirada de R$ 200,00:&quot; + cc.retirar( 200.00 ) ); /* true */
14 System.out.println( cc.getSaldo() ); /* -100.00 */
16 cc.depositar( 50 );
System.out.println( cc.getSaldo() ); /* -100.00 */
18
cc.depositar( new Cheque( 60.00 ) );
20 System.out.println( cc.getSaldo() ); /* 10.00 */
22 Object v[] = new Object[] { c, cc };
for ( Object x : v ) {
24 System.out.println( x ); /* Mesmo que x.toString() */
}
26 }
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 258 / 527
Poderia ser x.getSaldo()?
POO \u2013 Herança
Por que não poderia ser x.getSaldo?
Não funciona, porque x está sendo enxergado como
Object
Assim, somente se vê as operações que existem em Object,
pois não se pode garantir que o arranjo só tenha objetos do
tipo Conta (mesmo tendo, nesse caso específico)
Além disso, é importante mencionar que um objeto não se
comporta diferentemente pelo modo como é visto
Referindo-me ao caso do toString
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 259 / 527
POO \u2013 Herança
Resumo
Herança
Visão geral
Funcionamento dos construtores
Sobreposição de métodos
Sobrecarga de métodos
Capacidade polimórfica (polimorfismo)
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 260 / 527
POO
Modificadores
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 261 / 527
POO \u2013 Modificadores
Modificador final
Até agora, vimos o uso do modificador final somente em
atributos. No entanto, o modificador final pode ser também
atribuído a métodos e classes
Uso do modificador final
Em atributos: atributo fica imutável
Inicializado uma única vez no construtor
Em métodos: método não pode ser sobrescrito
Terá o mesmo comportamento em todas as subclasses
Em classes: classe não pode ter subclasses
Na árvore de heranças, tal classe será uma folha
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 262 / 527
POO \u2013 Modificadores
Sessão \u201cVale a pena ver de novo\u201d: Modificador final em
atributos
public class Pessoa {
2 private final String nome;
4 public Pessoa(String nome){
this.nome = nome;
6 }
8 public String getNome() {
return nome;
10 }
}
Pergunta-se:
Onde está o setNome?
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 263 / 527
POO \u2013 Modificadores
Modificador final em classes. Pode?
1 public class A {
3 }
1 public class B extends A {
3 }
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 264 / 527
POO \u2013 Modificadores
Modificador final em classes. E agora?
1 public final class A {
3 }
1 public class B extends A {
3 }
Pergunta-se:
Por que não pode?
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 265 / 527
POO \u2013 Modificadores
Modificador final em método. Pode?
1 public class A {
public void f(){
3 System.out.println(&quot;Opa!&quot;);
}
5 }
1 public class B extends A {
@Override
3 public void f() {
System.out.println(&quot;Epa!&quot;);
5 }
}
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 266 / 527
POO \u2013 Modificadores
Modificador final em método. E agora?
public class A {
2 public final void f(){