Prévia do material em texto
Gabarito comentado
1) Considerando a hierarquia abaixo:
Arquivo
- t:int
- loc:String
- d:Data
+Arquivo (x:int)
+mA( ):int
+mB( ):void
ArquivoBinario ArquivoTexto
-x :int
+ArquivoBinario (a:int )
+mB( ):void
+mC( ):char
+ArquivoTexto (a:int, b:int )
+mA( ):int
+mB( ):void
+mC( ):void
a) Quantos atributos têm os objetos da classe ArquivoBinario? e da
classe ArquivoTexto?
b) O método mA pode ser chamado para os objetos da classe
ArquivoBinario?
c) O método mB é o mesmo para as três classes?
Os objetos da classe ArquivoBinario tem 3 atributos (todos herdados)
Os objetos da classe ArquivoTexto tem 4 atributos (3 herdados e 1 exclusivo)
Sim, pois é um método herdado.
Não. Há 3 métodos mB:
- o da superclasse
- o da classe ArquivoBinario (sobrescrita)
- o da classe ArquivoTexto (sobrescrita)
d) O método mC da classe ArquivoTexto é uma sobrescrita? é uma
sobrecarga? Justifique sua resposta.
e) Considere a sequência de instruções abaixo e explique o que faz
cada instrução ou se está errada:
(i). Arquivo a, aT, aB , aa;
(ii). aT = new ArquivoTexto(7, 12);
Não é sobrescrita pois não há um método com a mesma assinatura, na
superclasse.
Não é sobrecarga pois não há outro método mC com assinatura diferente na
mesma classe, nem na super.
Memória
a aT aB aa
/// __ __
= = __
Declara 4 variáveis objeto do tipo Arquivo. Estas variáveis
podem referenciar objetos do tipo Arquivo e objetos das
subclasses de Arquivo. Ao serem declaradas não apontam
para nenhum objeto.
Memória
a aT aB aa
/// __
__
Instancia um objeto do tipo ArquivoTexto. Atribui
a referência deste objeto à variável aT. Observe,
na memória, que a variável aT passa a apontar
para este objeto.
ArquivoTexto
t
loc
d
x
7
null
null
12
(iii). a = new Arquivo (3);
(iv). aB = new ArquivoBinario( 2);
Instancia um objeto do tipo ArquivoBinario. Atribui a
referência deste objeto à variável aB. Observe, na
memória, que a variável aB passa a apontar para este
objeto
Instancia um objeto do tipo Arquivo. Atribui a referência
deste objeto à variável a. Observe, na memória, que a
variável a passa a apontar para este objeto
Memória
a aT aB aa
__
__
Arquivo
t
loc
d
ArquivoTexto
t
loc
d
x
3
null
null
7
null
null
12
Memória
a aT aB aa ///
Arquivo
t
loc
d
ArquivoTexto
t
loc
d
x
ArquivoBinario
t
loc
d
3
null
null
7
null
null
12
2
null
null
(v). aT.mA( );
(vi). a.mA( );
(vii). a.mC( );
(viii). aB.mC( );
(ix). aT.mB( );
(x). Arquivo aux;
(xi). aux.mA( );
chama o método mA da classe ArquivoTexto
chama o método mA da classe Arquivo
Erro! não existe o método mC na classe Arquivo
ArquivoTexto
Erro! o método mC é exclusivo da classe ArquivoBinario e a
variável é da superclasse. A chamada correta seria:
( (ArquivoBinario) aB).mC( ) //downcasting
chama o método mB da classe ArquivoTexto
Declara uma variável objeto do tipo Arquivo
Erro! a variável aux não referencia nenhum objeto
Memória
aux
////
(xii). aux = aB;
(xiii). aa = aux;
a variável aux recebe a referência que está na variável aB e então
passa a apontar para o mesmo objeto que aB está apontando.
Memória
a aT aB aa ///
aux
Arquivo
t
loc
d
ArquivoTexto
t
loc
d
x
ArquivoBinario
t
loc
d
3
null
null
7
null
null
12
2
null
null
O conteúdo da variável aux é atribuído para a
variável aa. Então a variável aa também passa a
apontar para o mesmo objeto que aux está
apontando.
Memória
a aT aB aa
aux
Arquivo
t
loc
d
ArquivoTexto
t
loc
d
x
ArquivoBinario
t
loc
d
3
null
null
7
null
null
12
2
null
null
(xiv). aa.mC( );
(xv). aB.mA( );
f) faça o diagrama UML de um possível objeto da classe ArquivoTexto,
com valores fictícios:
g) Escreva um possível construtor para a classe ArquivoTexto.
ArquivoTexto
t
loc
d
x
Erro! o método mC é exclusivo da classe ArquivoBinario e a
variável é da superclasse. A chamada correta seria:
( (ArquivoBinario) aa).mC( ) //downcasting
chama o método mA da classe Arquivo. Este método é herdado
pela classe ArquivoBinario.
Data
dia
mes
ano
7
“Documentos”
12
25
11
2012
public ArquivoTexto (int a, int b) {
super (a);this.x = b;
}
2) Indique se está certo ou errado cada um dos construtores da subclasse
CachorroQuente e justifique sua resposta.
public class Lanche {
double preco;
public Lanche (double umPreco)
{ preco = umPreco;
}
}
public class CachorroQuente extends Lanche {
String tipo;
public CachorroQuente (double p, String tipo) //constructor
1
{ this.tipo = tipo;
super(p);
}
public CachorroQuente (double p) //constructor 2
{ super(p);
tipo = “tradicional”;
}
public CachorroQuente (double p, String tipo)//constructor 3
{ super(p);
this.tipo = tipo;
}
public CachorroQuente (double p, String tipo)//constructor 4
{ super.Lanche(p);
this.tipo = tipo;
}
}
Errado. A chamada ao construtor da superclasse deve ser
o primeiro comando do construtor da subclasse
Correto
Correto
Errado. Sintaxe da chamada do construtor da
superclasse incorreta.