O documento discute herança em classes. Foi quebrada a classe AreaCasa em subclasses Casa, CasaQuad e CasaRet. A classe Residência foi modificada para receber uma instância de Casa (superclasse) em vez de AreaCasa, permitindo o uso de CasaQuad e CasaRet. Isso é demonstrado em um exemplo de código.
3. Heran¸ca
Quebramos AreaCasa
em Casa, CasaQuad e
CasaRet
Resta agora
modificarmos
Resid^encia
class Residencia {
AreaCasa casa;
AreaPiscina piscina;
Residencia(AreaCasa casa, AreaPiscina
piscina) {
this.casa = casa;
this.piscina = piscina;
}
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 2 / 33
4. Heran¸ca
Quebramos AreaCasa
em Casa, CasaQuad e
CasaRet
Resta agora
modificarmos
Resid^encia
class Residencia {
AreaCasa casa;
AreaPiscina piscina;
Residencia(AreaCasa casa, AreaPiscina
piscina) {
this.casa = casa;
this.piscina = piscina;
}
}
Como, se queremos
poder usar tanto
CasaQuad quanto
CasaRet?
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 2 / 33
5. Heran¸ca
Quebramos AreaCasa
em Casa, CasaQuad e
CasaRet
Resta agora
modificarmos
Resid^encia
class Residencia {
AreaCasa casa;
AreaPiscina piscina;
Residencia(AreaCasa casa, AreaPiscina
piscina) {
this.casa = casa;
this.piscina = piscina;
}
}
Como, se queremos
poder usar tanto
CasaQuad quanto
CasaRet?
Usando a superclasse!
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 2 / 33
6. Heran¸ca
Quebramos AreaCasa
em Casa, CasaQuad e
CasaRet
Resta agora
modificarmos
Resid^encia
class Residencia {
AreaCasa casa;
AreaPiscina piscina;
Residencia(AreaCasa casa, AreaPiscina
piscina) {
this.casa = casa;
this.piscina = piscina;
}
}
Como, se queremos
poder usar tanto
CasaQuad quanto
CasaRet?
Usando a superclasse!
class Residencia {
Casa casa;
AreaPiscina piscina;
Residencia(Casa casa, AreaPiscina
piscina) {
this.casa = casa;
this.piscina = piscina;
}
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 2 / 33
7. Heran¸ca
Podemos agora
fornecer tanto um
objeto CasaQuad
quanto CasaRet a
Resid^encia, que
funcionar´a
class Residencia {
AreaCasa casa;
AreaPiscina piscina;
Residencia(AreaCasa casa, AreaPiscina
piscina) {
this.casa = casa;
this.piscina = piscina;
}
}
class Residencia {
Casa casa;
AreaPiscina piscina;
Residencia(Casa casa, AreaPiscina
piscina) {
this.casa = casa;
this.piscina = piscina;
}
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 3 / 33
8. Heran¸ca
Podemos agora
fornecer tanto um
objeto CasaQuad
quanto CasaRet a
Resid^encia, que
funcionar´a
class Residencia {
AreaCasa casa;
AreaPiscina piscina;
Residencia(AreaCasa casa, AreaPiscina
piscina) {
this.casa = casa;
this.piscina = piscina;
}
}
Subclasses podem ser
usadas no lugar da
defini¸c˜ao da classe. O
contr´ario n˜ao, por ser
mais espec´ıfica a
subclasse
class Residencia {
Casa casa;
AreaPiscina piscina;
Residencia(Casa casa, AreaPiscina
piscina) {
this.casa = casa;
this.piscina = piscina;
}
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 3 / 33
9. Heran¸ca
Vejamos isso
funcionando
public static void main(String[] args) {
CasaRet cr = new CasaRet(10,5,1320);
CasaQuad cq = new CasaQuad(10,1523);
Residencia r1 = new Residencia(cr,
null);
Residencia r2 = new Residencia(cq,
null);
System.out.println("m2 (r1): "+
r1.casa.valorM2);
System.out.println("m2 (r2): "+
r2.casa.valorM2);
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 4 / 33
10. Heran¸ca
Vejamos isso
funcionando
Sa´ıda
$ java Projeto
m2 (r1): 1320.0
m2 (r2): 1523.0
public static void main(String[] args) {
CasaRet cr = new CasaRet(10,5,1320);
CasaQuad cq = new CasaQuad(10,1523);
Residencia r1 = new Residencia(cr,
null);
Residencia r2 = new Residencia(cq,
null);
System.out.println("m2 (r1): "+
r1.casa.valorM2);
System.out.println("m2 (r2): "+
r2.casa.valorM2);
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 4 / 33
11. Heran¸ca
Vejamos isso
funcionando
Sa´ıda
$ java Projeto
m2 (r1): 1320.0
m2 (r2): 1523.0
Por que null?
public static void main(String[] args) {
CasaRet cr = new CasaRet(10,5,1320);
CasaQuad cq = new CasaQuad(10,1523);
Residencia r1 = new Residencia(cr,
null);
Residencia r2 = new Residencia(cq,
null);
System.out.println("m2 (r1): "+
r1.casa.valorM2);
System.out.println("m2 (r2): "+
r2.casa.valorM2);
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 4 / 33
12. Heran¸ca
Vejamos isso
funcionando
Sa´ıda
$ java Projeto
m2 (r1): 1320.0
m2 (r2): 1523.0
Por que null?
Representa uma casa sem
piscina.
public static void main(String[] args) {
CasaRet cr = new CasaRet(10,5,1320);
CasaQuad cq = new CasaQuad(10,1523);
Residencia r1 = new Residencia(cr,
null);
Residencia r2 = new Residencia(cq,
null);
System.out.println("m2 (r1): "+
r1.casa.valorM2);
System.out.println("m2 (r2): "+
r2.casa.valorM2);
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 4 / 33
13. Heran¸ca
E se fizermos: public static void main(String[] args) {
CasaRet cr = new CasaRet(10,5,1320);
CasaQuad cq = new CasaQuad(10,1523);
Residencia r1 = new Residencia(cr,
null);
Residencia r2 = new Residencia(cq,
null);
System.out.println("m2 (r1): "+
r1.casa.valorM2);
System.out.println("m2 (r2): "+
r2.casa.valorM2);
System.out.println("´Area (r1): "+
r1.casa.area());
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 5 / 33
14. Heran¸ca
E se fizermos:
Compila¸c˜ao
$ javac Projeto.java
Projeto.java:41: cannot find symbol
symbol : method area()
location: class Casa
System.out.println("´Area (r1): "
+r1.casa.area());
^
1 error
public static void main(String[] args) {
CasaRet cr = new CasaRet(10,5,1320);
CasaQuad cq = new CasaQuad(10,1523);
Residencia r1 = new Residencia(cr,
null);
Residencia r2 = new Residencia(cq,
null);
System.out.println("m2 (r1): "+
r1.casa.valorM2);
System.out.println("m2 (r2): "+
r2.casa.valorM2);
System.out.println("´Area (r1): "+
r1.casa.area());
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 5 / 33
15. Heran¸ca
E se fizermos:
Compila¸c˜ao
$ javac Projeto.java
Projeto.java:41: cannot find symbol
symbol : method area()
location: class Casa
System.out.println("´Area (r1): "
+r1.casa.area());
^
1 error
Por que isso?
public static void main(String[] args) {
CasaRet cr = new CasaRet(10,5,1320);
CasaQuad cq = new CasaQuad(10,1523);
Residencia r1 = new Residencia(cr,
null);
Residencia r2 = new Residencia(cq,
null);
System.out.println("m2 (r1): "+
r1.casa.valorM2);
System.out.println("m2 (r2): "+
r2.casa.valorM2);
System.out.println("´Area (r1): "+
r1.casa.area());
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 5 / 33
16. Heran¸ca
Porque o compilador
pressupˆos que o objeto
´e Casa
public static void main(String[] args) {
CasaRet cr = new CasaRet(10,5,1320);
CasaQuad cq = new CasaQuad(10,1523);
Residencia r1 = new Residencia(cr,
null);
Residencia r2 = new Residencia(cq,
null);
System.out.println("m2 (r1): "+
r1.casa.valorM2);
System.out.println("m2 (r2): "+
r2.casa.valorM2);
System.out.println("´Area (r1): "+
r1.casa.area());
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 6 / 33
17. Heran¸ca
Porque o compilador
pressupˆos que o objeto
´e Casa
E Casa n˜ao possui um
m´etodo area
public static void main(String[] args) {
CasaRet cr = new CasaRet(10,5,1320);
CasaQuad cq = new CasaQuad(10,1523);
Residencia r1 = new Residencia(cr,
null);
Residencia r2 = new Residencia(cq,
null);
System.out.println("m2 (r1): "+
r1.casa.valorM2);
System.out.println("m2 (r2): "+
r2.casa.valorM2);
System.out.println("´Area (r1): "+
r1.casa.area());
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 6 / 33
18. Heran¸ca
Porque o compilador
pressupˆos que o objeto
´e Casa
E Casa n˜ao possui um
m´etodo area
Muito embora ele
esteja na mem´oria do
objeto
public static void main(String[] args) {
CasaRet cr = new CasaRet(10,5,1320);
CasaQuad cq = new CasaQuad(10,1523);
Residencia r1 = new Residencia(cr,
null);
Residencia r2 = new Residencia(cq,
null);
System.out.println("m2 (r1): "+
r1.casa.valorM2);
System.out.println("m2 (r2): "+
r2.casa.valorM2);
System.out.println("´Area (r1): "+
r1.casa.area());
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 6 / 33
19. Heran¸ca
Quando criamos o
objeto, todos os
atributos e m´etodos de
sua classe e da
superclasse estar˜ao na
mem´oria desse objeto
public static void main(String[] args) {
CasaRet cr = new CasaRet(10,5,1320);
CasaQuad cq = new CasaQuad(10,1523);
Residencia r1 = new Residencia(cr,
null);
Residencia r2 = new Residencia(cq,
null);
System.out.println("m2 (r1): "+
r1.casa.valorM2);
System.out.println("m2 (r2): "+
r2.casa.valorM2);
System.out.println("´Area (r1): "+
r1.casa.area());
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 7 / 33
20. Heran¸ca
Contudo, s´o teremos
acesso `aqueles definidos
na declara¸c˜ao da classe
invocada
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 8 / 33
21. Heran¸ca
Contudo, s´o teremos
acesso `aqueles definidos
na declara¸c˜ao da classe
invocada
No caso, em Residencia
class Residencia {
Casa casa;
AreaPiscina piscina;
Residencia(Casa casa,
AreaPiscina piscina) {
this.casa = casa;
this.piscina = piscina;
}
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 8 / 33
22. Heran¸ca
Contudo, s´o teremos
acesso `aqueles definidos
na declara¸c˜ao da classe
invocada
No caso, em Residencia
O compilador enxerga
somente as defini¸c˜oes nas
classes e superclasses, n˜ao
nas subclasses
class Residencia {
Casa casa;
AreaPiscina piscina;
Residencia(Casa casa,
AreaPiscina piscina) {
this.casa = casa;
this.piscina = piscina;
}
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 8 / 33
23. Heran¸ca
Contudo, s´o teremos
acesso `aqueles definidos
na declara¸c˜ao da classe
invocada
No caso, em Residencia
O compilador enxerga
somente as defini¸c˜oes nas
classes e superclasses, n˜ao
nas subclasses
Que fazer ent˜ao?
class Residencia {
Casa casa;
AreaPiscina piscina;
Residencia(Casa casa,
AreaPiscina piscina) {
this.casa = casa;
this.piscina = piscina;
}
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 8 / 33
24. Heran¸ca
Definir um m´etodo
area em Casa
class Casa {
double valorM2 = 1500;
double valor(double area) {
if (area >= 0)
return(this.valorM2*area);
return(-1);
}
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 9 / 33
25. Heran¸ca
Definir um m´etodo
area em Casa
class Casa {
double valorM2 = 1500;
double valor(double area) {
if (area >= 0)
return(this.valorM2*area);
return(-1);
}
double area() {
return(-1);
}
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 9 / 33
26. Heran¸ca
Definir um m´etodo
area em Casa
Que ser´a sobrescrito
pelos area existentes
nas subclasses
class Casa {
double valorM2 = 1500;
double valor(double area) {
if (area >= 0)
return(this.valorM2*area);
return(-1);
}
double area() {
return(-1);
}
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 9 / 33
27. Heran¸ca
E agora? Ir´a o c´odigo
funcionar?
public static void main(String[] args) {
CasaRet cr = new CasaRet(10,5,1320);
CasaQuad cq = new CasaQuad(10,1523);
Residencia r1 = new Residencia(cr,
null);
Residencia r2 = new Residencia(cq,
null);
System.out.println("m2 (r1): "+
r1.casa.valorM2);
System.out.println("m2 (r2): "+
r2.casa.valorM2);
System.out.println("´Area (r1): "+
r1.casa.area());
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 10 / 33
28. Heran¸ca
E agora? Ir´a o c´odigo
funcionar?
Sa´ıda
$ java Projeto
m2 (r1): 1320.0
m2 (r2): 1523.0
´Area (r1): 150.0
public static void main(String[] args) {
CasaRet cr = new CasaRet(10,5,1320);
CasaQuad cq = new CasaQuad(10,1523);
Residencia r1 = new Residencia(cr,
null);
Residencia r2 = new Residencia(cq,
null);
System.out.println("m2 (r1): "+
r1.casa.valorM2);
System.out.println("m2 (r2): "+
r2.casa.valorM2);
System.out.println("´Area (r1): "+
r1.casa.area());
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 10 / 33
29. Heran¸ca
Embora enxergue a
defini¸c˜ao apenas nas
classes e superclasses,
na hora de rodar, vale o
c´odigo do objeto na
mem´oria
public static void main(String[] args) {
CasaRet cr = new CasaRet(10,5,1320);
CasaQuad cq = new CasaQuad(10,1523);
Residencia r1 = new Residencia(cr,
null);
Residencia r2 = new Residencia(cq,
null);
System.out.println("m2 (r1): "+
r1.casa.valorM2);
System.out.println("m2 (r2): "+
r2.casa.valorM2);
System.out.println("´Area (r1): "+
r1.casa.area());
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 11 / 33
30. Heran¸ca
Embora enxergue a
defini¸c˜ao apenas nas
classes e superclasses,
na hora de rodar, vale o
c´odigo do objeto na
mem´oria
Mesmo que este seja
subclasse da defini¸c˜ao
public static void main(String[] args) {
CasaRet cr = new CasaRet(10,5,1320);
CasaQuad cq = new CasaQuad(10,1523);
Residencia r1 = new Residencia(cr,
null);
Residencia r2 = new Residencia(cq,
null);
System.out.println("m2 (r1): "+
r1.casa.valorM2);
System.out.println("m2 (r2): "+
r2.casa.valorM2);
System.out.println("´Area (r1): "+
r1.casa.area());
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 11 / 33
32. Heran¸ca
Polimorfismo
“O que possui v´arias formas”
Capacidade de se usar o mesmo nome para m´etodos
diferentes, implementados em diferentes n´ıveis de
uma hierarquia de classes
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 12 / 33
33. Heran¸ca
Polimorfismo
“O que possui v´arias formas”
Capacidade de se usar o mesmo nome para m´etodos
diferentes, implementados em diferentes n´ıveis de
uma hierarquia de classes
Para cada classe, tem-se um comportamento espec´ıfico para
o m´etodo
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 12 / 33
34. Heran¸ca
Polimorfismo
Ser´a rodado o c´odigo da classe para a qual se tem o
objeto
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 13 / 33
35. Heran¸ca
Polimorfismo
Ser´a rodado o c´odigo da classe para a qual se tem o
objeto
N˜ao importa se foi declarada uma superclasse dela
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 13 / 33
36. Heran¸ca
Polimorfismo
Ser´a rodado o c´odigo da classe para a qual se tem o
objeto
N˜ao importa se foi declarada uma superclasse dela
Caso em que a superclasse ´e usada apenas para verificar a
assinatura do m´etodo, quando da compila¸c˜ao
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 13 / 33
40. Heran¸ca
Polimorfismo
Sobrecarga (Overloading):
M´etodos com o mesmo nome, por´em assinaturas diferentes
Sobrescrita (Overriding):
Redefini¸c˜ao de um m´etodo em classes diferentes, dentro de
uma estrutura de heran¸ca
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 14 / 33
41. Heran¸ca
Polimorfismo
Sobrecarga (Overloading):
M´etodos com o mesmo nome, por´em assinaturas diferentes
Sobrescrita (Overriding):
Redefini¸c˜ao de um m´etodo em classes diferentes, dentro de
uma estrutura de heran¸ca
Necessitam ter a mesma assinatura
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 14 / 33
43. Heran¸ca
Em suma:
As subclasses podem acrescentar novos m´etodos:
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 15 / 33
44. Heran¸ca
Em suma:
As subclasses podem acrescentar novos m´etodos:
Ex: m´etodos de acesso aos atributos espec´ıficos da subclasse
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 15 / 33
45. Heran¸ca
Em suma:
As subclasses podem acrescentar novos m´etodos:
Ex: m´etodos de acesso aos atributos espec´ıficos da subclasse
Ex: novas funcionalidades t´ıpicas daquela subclasse
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 15 / 33
46. Heran¸ca
Em suma:
As subclasses podem acrescentar novos m´etodos:
Ex: m´etodos de acesso aos atributos espec´ıficos da subclasse
Ex: novas funcionalidades t´ıpicas daquela subclasse
Ex: sobrecarregar m´etodos da superclasse (mesmo nome, nova
assinatura)
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 15 / 33
47. Heran¸ca
Em suma:
As subclasses podem acrescentar novos m´etodos:
Ex: m´etodos de acesso aos atributos espec´ıficos da subclasse
Ex: novas funcionalidades t´ıpicas daquela subclasse
Ex: sobrecarregar m´etodos da superclasse (mesmo nome, nova
assinatura)
Podem tamb´em redefinir m´etodos da superclasse com a
mesma assinatura
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 15 / 33
48. Heran¸ca
Em suma:
As subclasses podem acrescentar novos m´etodos:
Ex: m´etodos de acesso aos atributos espec´ıficos da subclasse
Ex: novas funcionalidades t´ıpicas daquela subclasse
Ex: sobrecarregar m´etodos da superclasse (mesmo nome, nova
assinatura)
Podem tamb´em redefinir m´etodos da superclasse com a
mesma assinatura
Boa pr´atica:
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 15 / 33
49. Heran¸ca
Em suma:
As subclasses podem acrescentar novos m´etodos:
Ex: m´etodos de acesso aos atributos espec´ıficos da subclasse
Ex: novas funcionalidades t´ıpicas daquela subclasse
Ex: sobrecarregar m´etodos da superclasse (mesmo nome, nova
assinatura)
Podem tamb´em redefinir m´etodos da superclasse com a
mesma assinatura
Boa pr´atica:
Primeiro, construir classes para lidar com o caso mais geral
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 15 / 33
50. Heran¸ca
Em suma:
As subclasses podem acrescentar novos m´etodos:
Ex: m´etodos de acesso aos atributos espec´ıficos da subclasse
Ex: novas funcionalidades t´ıpicas daquela subclasse
Ex: sobrecarregar m´etodos da superclasse (mesmo nome, nova
assinatura)
Podem tamb´em redefinir m´etodos da superclasse com a
mesma assinatura
Boa pr´atica:
Primeiro, construir classes para lidar com o caso mais geral
Em seguida, a fim de tratar os casos especiais, definir classes
especializadas – herdadas da primeira classe
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 15 / 33
51. Heran¸ca
Considere as classes CasaQuad e CasaRet:
class CasaQuad extends Casa {
double lateral = 10;
CasaQuad() {}
CasaQuad(double valorM2) {
this.valorM2 = valorM2;
}
CasaQuad(double lateral, double
valorM2) {
this(valorM2);
this.lateral = lateral;
}
double area() ...
}
class CasaRet extends Casa {
double cquarto = 10;
double lateral = 10;
CasaRet() {}
CasaRet(double valorM2) {
this.valorM2 = valorM2;
}
CasaRet(double lateral, double cquarto)
{
this.lateral = lateral;
this.cquarto = cquarto;
}
...
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 16 / 33
52. Heran¸ca
Considere as classes CasaQuad e CasaRet:
class CasaQuad extends Casa {
double lateral = 10;
CasaQuad() {}
CasaQuad(double valorM2) {
this.valorM2 = valorM2;
}
CasaQuad(double lateral, double
valorM2) {
this(valorM2);
this.lateral = lateral;
}
double area() ...
}
class CasaRet extends Casa {
double cquarto = 10;
double lateral = 10;
CasaRet() {}
CasaRet(double valorM2) {
this.valorM2 = valorM2;
}
CasaRet(double lateral, double cquarto)
{
this.lateral = lateral;
this.cquarto = cquarto;
}
...
}
Onde est˜ao definidos estes atributos?
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 16 / 33
53. Heran¸ca
Considere as classes CasaQuad e CasaRet:
class CasaQuad extends Casa {
double lateral = 10;
CasaQuad() {}
CasaQuad(double valorM2) {
this.valorM2 = valorM2;
}
CasaQuad(double lateral, double
valorM2) {
this(valorM2);
this.lateral = lateral;
}
double area() ...
}
class CasaRet extends Casa {
double cquarto = 10;
double lateral = 10;
CasaRet() {}
CasaRet(double valorM2) {
this.valorM2 = valorM2;
}
CasaRet(double lateral, double cquarto)
{
this.lateral = lateral;
this.cquarto = cquarto;
}
...
}
Onde est˜ao definidos estes atributos?
Na superclasse Casa
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 16 / 33
54. Heran¸ca
class CasaQuad extends Casa {
double lateral = 10;
CasaQuad() {}
CasaQuad(double valorM2) {
this.valorM = valorM2;
}
CasaQuad(double lateral, double
valorM2) {
this(valorM2);
this.lateral = lateral;
}
double area() ...
}
class CasaRet extends Casa {
double cquarto = 10;
double lateral = 10;
CasaRet() {}
CasaRet(double valorM2) {
this.valorM2 = valorM2;
}
CasaRet(double lateral, double cquarto)
{
this.lateral = lateral;
this.cquarto = cquarto;
}
...
}
Embora correto, fica estranho termos que olhar o
atributo em outra classe (arquivo) para sabermos o
que fazer
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 17 / 33
55. Heran¸ca
class CasaQuad extends Casa {
double lateral = 10;
CasaQuad() {}
CasaQuad(double valorM2) {
this.valorM = valorM2;
}
CasaQuad(double lateral, double
valorM2) {
this(valorM2);
this.lateral = lateral;
}
double area() ...
}
class CasaRet extends Casa {
double cquarto = 10;
double lateral = 10;
CasaRet() {}
CasaRet(double valorM2) {
this.valorM2 = valorM2;
}
CasaRet(double lateral, double cquarto)
{
this.lateral = lateral;
this.cquarto = cquarto;
}
...
}
Dever´ıamos poder passar essa informa¸c˜ao `a
superclasse
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 18 / 33
56. Heran¸ca
class CasaQuad extends Casa {
double lateral = 10;
CasaQuad() {}
CasaQuad(double valorM2) {
this.valorM = valorM2;
}
CasaQuad(double lateral, double
valorM2) {
this(valorM2);
this.lateral = lateral;
}
double area() ...
}
class CasaRet extends Casa {
double cquarto = 10;
double lateral = 10;
CasaRet() {}
CasaRet(double valorM2) {
this.valorM2 = valorM2;
}
CasaRet(double lateral, double cquarto)
{
this.lateral = lateral;
this.cquarto = cquarto;
}
...
}
Dever´ıamos poder passar essa informa¸c˜ao `a
superclasse
Como?
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 18 / 33
57. Heran¸ca
class CasaQuad extends Casa {
double lateral = 10;
CasaQuad() {}
CasaQuad(double valorM2) {
this.valorM = valorM2;
}
CasaQuad(double lateral, double
valorM2) {
this(valorM2);
this.lateral = lateral;
}
double area() ...
}
class CasaRet extends Casa {
double cquarto = 10;
double lateral = 10;
CasaRet() {}
CasaRet(double valorM2) {
this.valorM2 = valorM2;
}
CasaRet(double lateral, double cquarto)
{
this.lateral = lateral;
this.cquarto = cquarto;
}
...
}
Dever´ıamos poder passar essa informa¸c˜ao `a
superclasse
Como? Com super...
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 18 / 33
58. Super
Voltemos ent˜ao `a
classe Casa
class Casa {
double valorM2 = 1500;
double valor(double area) {
if (area >= 0) return(this.valorM2*
area);
return(-1);
}
double area() {
return(-1);
}
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 19 / 33
59. Super
Voltemos ent˜ao `a
classe Casa
A ela faltam construtores,
algo que passe valor a
seus parˆametros
class Casa {
double valorM2 = 1500;
double valor(double area) {
if (area >= 0) return(this.valorM2*
area);
return(-1);
}
double area() {
return(-1);
}
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 19 / 33
60. Super
Voltemos ent˜ao `a
classe Casa
A ela faltam construtores,
algo que passe valor a
seus parˆametros
class Casa {
double valorM2 = 1500;
Casa(double valorM2) {
this.valorM2 = valorM2;
}
double valor(double area) {
if (area >= 0) return(this.valorM2*
area);
return(-1);
}
double area() {
return(-1);
}
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 19 / 33
61. Super
E como ficam CasaQuad e CasaRet?
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 20 / 33
62. Super
E como ficam CasaQuad e CasaRet?
class CasaQuad extends Casa {
double lateral = 10;
CasaQuad() {}
CasaQuad(double valorM2) {
super(valorM2);
}
CasaQuad(double lateral, double
valorM2) {
this(valorM2);
this.lateral = lateral;
}
...
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 20 / 33
63. Super
E como ficam CasaQuad e CasaRet?
class CasaQuad extends Casa {
double lateral = 10;
CasaQuad() {}
CasaQuad(double valorM2) {
super(valorM2);
}
CasaQuad(double lateral, double
valorM2) {
this(valorM2);
this.lateral = lateral;
}
...
}
class CasaRet extends Casa {
double cquarto = 10;
double lateral = 10;
CasaRet() {}
CasaRet(double valorM2) {
super(valorM2);
}
CasaRet(double lateral, double cquarto)
this.lateral = lateral;
this.cquarto = cquarto;
}
...
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 20 / 33
64. Super
E como ficam CasaQuad e CasaRet?
class CasaQuad extends Casa {
double lateral = 10;
CasaQuad() {}
CasaQuad(double valorM2) {
super(valorM2);
}
CasaQuad(double lateral, double
valorM2) {
this(valorM2);
this.lateral = lateral;
}
...
}
class CasaRet extends Casa {
double cquarto = 10;
double lateral = 10;
CasaRet() {}
CasaRet(double valorM2) {
super(valorM2);
}
CasaRet(double lateral, double cquarto)
this.lateral = lateral;
this.cquarto = cquarto;
}
...
}
Vai funcionar?
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 20 / 33
65. Super
class CasaQuad extends Casa {
double lateral = 10;
CasaQuad() {}
CasaQuad(double valorM2) {
super(valorM2);
}
CasaQuad(double lateral, double valorM2) {
this(valorM2);
this.lateral = lateral;
}
...
}
class CasaRet extends Casa {
double cquarto = 10;
double lateral = 10;
CasaRet() {}
CasaRet(double valorM2) {
super(valorM2);
}
CasaRet(double lateral, double cquarto) {
this.lateral = lateral;
this.cquarto = cquarto;
}
...
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 21 / 33
66. Super
class CasaQuad extends Casa {
double lateral = 10;
CasaQuad() {}
CasaQuad(double valorM2) {
super(valorM2);
}
CasaQuad(double lateral, double valorM2) {
this(valorM2);
this.lateral = lateral;
}
...
}
class CasaRet extends Casa {
double cquarto = 10;
double lateral = 10;
CasaRet() {}
CasaRet(double valorM2) {
super(valorM2);
}
CasaRet(double lateral, double cquarto) {
this.lateral = lateral;
this.cquarto = cquarto;
}
...
}
Linha de Comando
$ javac CasaQuad.java
CasaQuad.java:9: cannot find symbol
symbol : constructor Casa()
location: class Casa
CasaQuad() {}
^
1 error
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 21 / 33
67. Super
class CasaQuad extends Casa {
double lateral = 10;
CasaQuad() {}
CasaQuad(double valorM2) {
super(valorM2);
}
CasaQuad(double lateral, double valorM2) {
this(valorM2);
this.lateral = lateral;
}
...
}
class CasaRet extends Casa {
double cquarto = 10;
double lateral = 10;
CasaRet() {}
CasaRet(double valorM2) {
super(valorM2);
}
CasaRet(double lateral, double cquarto) {
this.lateral = lateral;
this.cquarto = cquarto;
}
...
}
Linha de Comando
$ javac CasaQuad.java
CasaQuad.java:9: cannot find symbol
symbol : constructor Casa()
location: class Casa
CasaQuad() {}
^
1 error
Linha de Comando
$ javac CasaRet.java
CasaRet.java:13: cannot find symbol
symbol : constructor Casa()
location: class Casa
CasaRet() {}
^
CasaRet.java:25: cannot find symbol
symbol : constructor Casa()
location: class Casa
CasaRet(double lateral, double cquarto) {
^
2 errors
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 21 / 33
68. Heran¸ca
O que houve?
class CasaQuad extends Casa {
double lateral = 10;
CasaQuad() {}
CasaQuad(double valorM2) {
super(valorM2);
}
CasaQuad(double lateral, double valorM2) {
super(valorM2);
this.lateral = lateral;
}
...
}
class CasaRet extends Casa {
double cquarto = 10;
double lateral = 10;
CasaRet() {}
CasaRet(double valorM2) {
super(valorM2);
}
CasaRet(double lateral, double cquarto) {
this.lateral = lateral;
this.cquarto = cquarto;
}
...
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 22 / 33
69. Heran¸ca
O que houve?
Ao definirmos
construtores para a
superclasse, matamos seu
construtor padr˜ao
class CasaQuad extends Casa {
double lateral = 10;
CasaQuad() {}
CasaQuad(double valorM2) {
super(valorM2);
}
CasaQuad(double lateral, double valorM2) {
super(valorM2);
this.lateral = lateral;
}
...
}
class CasaRet extends Casa {
double cquarto = 10;
double lateral = 10;
CasaRet() {}
CasaRet(double valorM2) {
super(valorM2);
}
CasaRet(double lateral, double cquarto) {
this.lateral = lateral;
this.cquarto = cquarto;
}
...
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 22 / 33
70. Heran¸ca
O que houve?
Ao definirmos
construtores para a
superclasse, matamos seu
construtor padr˜ao
E quando fizemos a
chamada ao construtor
padr˜ao da superclasse?
class CasaQuad extends Casa {
double lateral = 10;
CasaQuad() {}
CasaQuad(double valorM2) {
super(valorM2);
}
CasaQuad(double lateral, double valorM2) {
super(valorM2);
this.lateral = lateral;
}
...
}
class CasaRet extends Casa {
double cquarto = 10;
double lateral = 10;
CasaRet() {}
CasaRet(double valorM2) {
super(valorM2);
}
CasaRet(double lateral, double cquarto) {
this.lateral = lateral;
this.cquarto = cquarto;
}
...
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 22 / 33
71. Heran¸ca
Quando n˜ao chamamos
super explicitamente
nos construtores das
subclasses
class CasaQuad extends Casa {
double lateral = 10;
CasaQuad() {}
CasaQuad(double valorM2) {
super(valorM2);
}
CasaQuad(double lateral, double valorM2) {
super(valorM2);
this.lateral = lateral;
}
...
}
class CasaRet extends Casa {
double cquarto = 10;
double lateral = 10;
CasaRet() {}
CasaRet(double valorM2) {
super(valorM2);
}
CasaRet(double lateral, double cquarto) {
this.lateral = lateral;
this.cquarto = cquarto;
}
...
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 23 / 33
72. Heran¸ca
Quando n˜ao chamamos
super explicitamente
nos construtores das
subclasses
Nesse caso, o
compilador ir´a inserir
uma chamada a
super()
class CasaQuad extends Casa {
double lateral = 10;
CasaQuad() {}
CasaQuad(double valorM2) {
super(valorM2);
}
CasaQuad(double lateral, double valorM2) {
super(valorM2);
this.lateral = lateral;
}
...
}
class CasaRet extends Casa {
double cquarto = 10;
double lateral = 10;
CasaRet() {}
CasaRet(double valorM2) {
super(valorM2);
}
CasaRet(double lateral, double cquarto) {
this.lateral = lateral;
this.cquarto = cquarto;
}
...
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 23 / 33
73. Heran¸ca
Quando n˜ao chamamos
super explicitamente
nos construtores das
subclasses
Nesse caso, o
compilador ir´a inserir
uma chamada a
super()
E Casa() n˜ao existe
class CasaQuad extends Casa {
double lateral = 10;
CasaQuad() {}
CasaQuad(double valorM2) {
super(valorM2);
}
CasaQuad(double lateral, double valorM2) {
super(valorM2);
this.lateral = lateral;
}
...
}
class CasaRet extends Casa {
double cquarto = 10;
double lateral = 10;
CasaRet() {}
CasaRet(double valorM2) {
super(valorM2);
}
CasaRet(double lateral, double cquarto) {
this.lateral = lateral;
this.cquarto = cquarto;
}
...
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 23 / 33
74. Heran¸ca
E como resolvemos esse
problema?
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 24 / 33
75. Heran¸ca
E como resolvemos esse
problema?
inserindo em Casa o
construtor padr˜ao
class Casa {
double valorM2 = 1500;
Casa(){}
Casa(double valorM2) {
this.valorM2 = valorM2;
}
double valor(double area) {
if (area >= 0) return(this.valorM2*
area);
return(-1);
}
double area() {
return(-1);
}
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 24 / 33
76. Heran¸ca
Assim como this se refere a esta classe, super ´e
referˆencia para a superclasse
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 25 / 33
77. Heran¸ca
Assim como this se refere a esta classe, super ´e
referˆencia para a superclasse
Assim como com this(), qualquer chamada ao
construtor super() deve ser feita na primeira linha
do construtor em que se faz a chamada
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 25 / 33
78. Heran¸ca
O que acontece se
fizermos:
class CasaQuad extends Casa {
...
double area() {
return(super.area());
}
public static void main(String[] args) {
CasaQuad c = new CasaQuad();
System.out.println(c.area());
}
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 26 / 33
79. Heran¸ca
O que acontece se
fizermos:
Linha de Comando
$ java CasaQuad
-1.0
class CasaQuad extends Casa {
...
double area() {
return(super.area());
}
public static void main(String[] args) {
CasaQuad c = new CasaQuad();
System.out.println(c.area());
}
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 26 / 33
80. Heran¸ca
O que acontece se
fizermos:
Linha de Comando
$ java CasaQuad
-1.0
class CasaQuad extends Casa {
...
double area() {
return(super.area());
}
public static void main(String[] args) {
CasaQuad c = new CasaQuad();
System.out.println(c.area());
}
}
Dentro de uma classe, super ser´a uma referˆencia `a
superclasse
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 26 / 33
81. Heran¸ca
O que acontece se
fizermos:
Linha de Comando
$ java CasaQuad
-1.0
class CasaQuad extends Casa {
...
double area() {
return(super.area());
}
public static void main(String[] args) {
CasaQuad c = new CasaQuad();
System.out.println(c.area());
}
}
Dentro de uma classe, super ser´a uma referˆencia `a
superclasse
Assim, mesmo que AreaQuad sobrescreva area(), ir´a rodar
area() da superclasse
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 26 / 33
83. Heran¸ca
Ent˜ao...
Sempre haver´a uma chamada ao construtor da
superclasse, quer explicitemos isso ou n˜ao
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 27 / 33
84. Heran¸ca
Ent˜ao...
Sempre haver´a uma chamada ao construtor da
superclasse, quer explicitemos isso ou n˜ao
O construtor da superclasse ir´a, por sua vez, chamar
o construtor da superclasse dela. E assim por diante
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 27 / 33
85. Heran¸ca
Ent˜ao...
Sempre haver´a uma chamada ao construtor da
superclasse, quer explicitemos isso ou n˜ao
O construtor da superclasse ir´a, por sua vez, chamar
o construtor da superclasse dela. E assim por diante
Mas Casa tem superclasse?
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 27 / 33
86. Heran¸ca
Ent˜ao...
Sempre haver´a uma chamada ao construtor da
superclasse, quer explicitemos isso ou n˜ao
O construtor da superclasse ir´a, por sua vez, chamar
o construtor da superclasse dela. E assim por diante
Mas Casa tem superclasse?
Sim, se n˜ao definirmos explicitamente ela ser´a subclasse de
Object
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 27 / 33
87. Heran¸ca
Ent˜ao...
Toda classe em java, que n˜ao tenha superclasse,
ser´a subclasse de Object
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 28 / 33
88. Heran¸ca
Ent˜ao...
Toda classe em java, que n˜ao tenha superclasse,
ser´a subclasse de Object
Temos assim um encadeamento de construtores
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 28 / 33
89. Heran¸ca
Ent˜ao...
Toda classe em java, que n˜ao tenha superclasse,
ser´a subclasse de Object
Temos assim um encadeamento de construtores
Ao chamarmos um construtor, todos os das classes acima na
hierarquia ser˜ao chamados, at´e se chegar a Object()
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 28 / 33
90. Heran¸ca
O que faz o c´odigo em
main?
class CasaQuad extends Casa {
double lateral = 10;
CasaQuad() {}
double area() {
...
}
public static void main(String[] args) {
CasaQuad c = new CasaQuad();
System.out.println(c.valor(c.area()));
c.valorM2 = 500;
System.out.println(c.valor(c.area()));
}
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 29 / 33
91. Heran¸ca
O que faz o c´odigo em
main?
Linha de Comando
$ java CasaQuad
150000.0
50000.0
class CasaQuad extends Casa {
double lateral = 10;
CasaQuad() {}
double area() {
...
}
public static void main(String[] args) {
CasaQuad c = new CasaQuad();
System.out.println(c.valor(c.area()));
c.valorM2 = 500;
System.out.println(c.valor(c.area()));
}
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 29 / 33
92. Heran¸ca
O que faz o c´odigo em
main?
Linha de Comando
$ java CasaQuad
150000.0
50000.0
Problema de
seguran¸ca!
class CasaQuad extends Casa {
double lateral = 10;
CasaQuad() {}
double area() {
...
}
public static void main(String[] args) {
CasaQuad c = new CasaQuad();
System.out.println(c.valor(c.area()));
c.valorM2 = 500;
System.out.println(c.valor(c.area()));
}
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 29 / 33
93. Heran¸ca
N˜ao podemos deixar o
valor do m2
ser
mudado a toda hora
class CasaQuad extends Casa {
double lateral = 10;
CasaQuad() {}
double area() {
...
}
public static void main(String[] args) {
CasaQuad c = new CasaQuad();
System.out.println(c.valor(c.area()));
c.valorM2 = 500;
System.out.println(c.valor(c.area()));
}
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 30 / 33
94. Heran¸ca
N˜ao podemos deixar o
valor do m2
ser
mudado a toda hora
Se criamos uma casa,
deve ser com aquele
valor passado quando
da cria¸c˜ao do objeto!
class CasaQuad extends Casa {
double lateral = 10;
CasaQuad() {}
double area() {
...
}
public static void main(String[] args) {
CasaQuad c = new CasaQuad();
System.out.println(c.valor(c.area()));
c.valorM2 = 500;
System.out.println(c.valor(c.area()));
}
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 30 / 33
95. Heran¸ca
N˜ao podemos deixar o
valor do m2
ser
mudado a toda hora
Se criamos uma casa,
deve ser com aquele
valor passado quando
da cria¸c˜ao do objeto!
Como?
class CasaQuad extends Casa {
double lateral = 10;
CasaQuad() {}
double area() {
...
}
public static void main(String[] args) {
CasaQuad c = new CasaQuad();
System.out.println(c.valor(c.area()));
c.valorM2 = 500;
System.out.println(c.valor(c.area()));
}
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 30 / 33
96. Private
Declarando o atributo
como privado em
Casa:
class Casa {
private double valorM2 = 1500;
Casa(double valorM2) {
this.valorM2 = valorM2;
}
double valor(double area) {
if (area >= 0) return(this.valorM2*
area);
return(-1);
}
...
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 31 / 33
97. Private
Declarando o atributo
como privado em
Casa:
Somente m´etodos
declarados dentro da
pr´opria classe poder˜ao
enxergar esse atributo
class Casa {
private double valorM2 = 1500;
Casa(double valorM2) {
this.valorM2 = valorM2;
}
double valor(double area) {
if (area >= 0) return(this.valorM2*
area);
return(-1);
}
...
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 31 / 33
98. Private
E os de fora?
class CasaQuad extends Casa {
...
public static void main(String[] args) {
CasaQuad c = new CasaQuad();
System.out.println(c.valor(c.area()));
c.valorM2 = 500;
System.out.println(c.valor(c.area()));
}
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 32 / 33
99. Private
E os de fora?
Linha de Comando
$ javac CasaQuad.java
CasaQuad.java:46: valorM2 has
private access in Casa
c.valorM2 = 500;
^
1 error
class CasaQuad extends Casa {
...
public static void main(String[] args) {
CasaQuad c = new CasaQuad();
System.out.println(c.valor(c.area()));
c.valorM2 = 500;
System.out.println(c.valor(c.area()));
}
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 32 / 33
100. Private
E os de fora?
Linha de Comando
$ javac CasaQuad.java
CasaQuad.java:46: valorM2 has
private access in Casa
c.valorM2 = 500;
^
1 error
Erro de compila¸c˜ao!
(por mais que todos
estejam na mem´oria do
objeto da subclasse)
class CasaQuad extends Casa {
...
public static void main(String[] args) {
CasaQuad c = new CasaQuad();
System.out.println(c.valor(c.area()));
c.valorM2 = 500;
System.out.println(c.valor(c.area()));
}
}
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 32 / 33