SlideShare uma empresa Scribd logo
1 de 101
Baixar para ler offline
Aula 19 – Heran¸ca
Norton Trevisan Roman
12 de maio de 2020
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 1 / 33
Heran¸ca
Quebramos AreaCasa
em Casa, CasaQuad e
CasaRet
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 2 / 33
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Heran¸ca
Polimorfismo
“O que possui v´arias formas”
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 12 / 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
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 12 / 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
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
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
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
Heran¸ca
Polimorfismo
Sobrecarga (Overloading):
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 14 / 33
Heran¸ca
Polimorfismo
Sobrecarga (Overloading):
M´etodos com o mesmo nome, por´em assinaturas diferentes
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 14 / 33
Heran¸ca
Polimorfismo
Sobrecarga (Overloading):
M´etodos com o mesmo nome, por´em assinaturas diferentes
Sobrescrita (Overriding):
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 14 / 33
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
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
Heran¸ca
Em suma:
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 15 / 33
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Super
E como ficam CasaQuad e CasaRet?
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 20 / 33
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
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
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
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
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
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
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
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
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
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
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
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
Heran¸ca
E como resolvemos esse
problema?
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 24 / 33
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
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
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
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
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
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
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
Heran¸ca
Ent˜ao...
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 27 / 33
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Videoaula
N˜ao h´a.
Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 33 / 33

Mais conteúdo relacionado

Mais de Norton Trevisan Roman

(ACH2044) Inteligência Artificial - Aula 24
(ACH2044) Inteligência Artificial - Aula 24(ACH2044) Inteligência Artificial - Aula 24
(ACH2044) Inteligência Artificial - Aula 24Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 23
(ACH2044) Inteligência Artificial - Aula 23(ACH2044) Inteligência Artificial - Aula 23
(ACH2044) Inteligência Artificial - Aula 23Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 22
(ACH2044) Inteligência Artificial - Aula 22(ACH2044) Inteligência Artificial - Aula 22
(ACH2044) Inteligência Artificial - Aula 22Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 21
(ACH2044) Inteligência Artificial - Aula 21(ACH2044) Inteligência Artificial - Aula 21
(ACH2044) Inteligência Artificial - Aula 21Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 20
(ACH2044) Inteligência Artificial - Aula 20(ACH2044) Inteligência Artificial - Aula 20
(ACH2044) Inteligência Artificial - Aula 20Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 19
(ACH2044) Inteligência Artificial - Aula 19(ACH2044) Inteligência Artificial - Aula 19
(ACH2044) Inteligência Artificial - Aula 19Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 18
(ACH2044) Inteligência Artificial - Aula 18(ACH2044) Inteligência Artificial - Aula 18
(ACH2044) Inteligência Artificial - Aula 18Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 17
(ACH2044) Inteligência Artificial - Aula 17(ACH2044) Inteligência Artificial - Aula 17
(ACH2044) Inteligência Artificial - Aula 17Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 16
(ACH2044) Inteligência Artificial - Aula 16(ACH2044) Inteligência Artificial - Aula 16
(ACH2044) Inteligência Artificial - Aula 16Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 15
(ACH2044) Inteligência Artificial - Aula 15(ACH2044) Inteligência Artificial - Aula 15
(ACH2044) Inteligência Artificial - Aula 15Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 14
(ACH2044) Inteligência Artificial - Aula 14(ACH2044) Inteligência Artificial - Aula 14
(ACH2044) Inteligência Artificial - Aula 14Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 13
(ACH2044) Inteligência Artificial - Aula 13(ACH2044) Inteligência Artificial - Aula 13
(ACH2044) Inteligência Artificial - Aula 13Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 12
(ACH2044) Inteligência Artificial - Aula 12(ACH2044) Inteligência Artificial - Aula 12
(ACH2044) Inteligência Artificial - Aula 12Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 11
(ACH2044) Inteligência Artificial - Aula 11(ACH2044) Inteligência Artificial - Aula 11
(ACH2044) Inteligência Artificial - Aula 11Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 10
(ACH2044) Inteligência Artificial - Aula 10(ACH2044) Inteligência Artificial - Aula 10
(ACH2044) Inteligência Artificial - Aula 10Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 09
(ACH2044) Inteligência Artificial - Aula 09(ACH2044) Inteligência Artificial - Aula 09
(ACH2044) Inteligência Artificial - Aula 09Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 08
(ACH2044) Inteligência Artificial - Aula 08(ACH2044) Inteligência Artificial - Aula 08
(ACH2044) Inteligência Artificial - Aula 08Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 07
(ACH2044) Inteligência Artificial - Aula 07(ACH2044) Inteligência Artificial - Aula 07
(ACH2044) Inteligência Artificial - Aula 07Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 06
(ACH2044) Inteligência Artificial - Aula 06(ACH2044) Inteligência Artificial - Aula 06
(ACH2044) Inteligência Artificial - Aula 06Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 05
(ACH2044) Inteligência Artificial - Aula 05(ACH2044) Inteligência Artificial - Aula 05
(ACH2044) Inteligência Artificial - Aula 05Norton Trevisan Roman
 

Mais de Norton Trevisan Roman (20)

(ACH2044) Inteligência Artificial - Aula 24
(ACH2044) Inteligência Artificial - Aula 24(ACH2044) Inteligência Artificial - Aula 24
(ACH2044) Inteligência Artificial - Aula 24
 
(ACH2044) Inteligência Artificial - Aula 23
(ACH2044) Inteligência Artificial - Aula 23(ACH2044) Inteligência Artificial - Aula 23
(ACH2044) Inteligência Artificial - Aula 23
 
(ACH2044) Inteligência Artificial - Aula 22
(ACH2044) Inteligência Artificial - Aula 22(ACH2044) Inteligência Artificial - Aula 22
(ACH2044) Inteligência Artificial - Aula 22
 
(ACH2044) Inteligência Artificial - Aula 21
(ACH2044) Inteligência Artificial - Aula 21(ACH2044) Inteligência Artificial - Aula 21
(ACH2044) Inteligência Artificial - Aula 21
 
(ACH2044) Inteligência Artificial - Aula 20
(ACH2044) Inteligência Artificial - Aula 20(ACH2044) Inteligência Artificial - Aula 20
(ACH2044) Inteligência Artificial - Aula 20
 
(ACH2044) Inteligência Artificial - Aula 19
(ACH2044) Inteligência Artificial - Aula 19(ACH2044) Inteligência Artificial - Aula 19
(ACH2044) Inteligência Artificial - Aula 19
 
(ACH2044) Inteligência Artificial - Aula 18
(ACH2044) Inteligência Artificial - Aula 18(ACH2044) Inteligência Artificial - Aula 18
(ACH2044) Inteligência Artificial - Aula 18
 
(ACH2044) Inteligência Artificial - Aula 17
(ACH2044) Inteligência Artificial - Aula 17(ACH2044) Inteligência Artificial - Aula 17
(ACH2044) Inteligência Artificial - Aula 17
 
(ACH2044) Inteligência Artificial - Aula 16
(ACH2044) Inteligência Artificial - Aula 16(ACH2044) Inteligência Artificial - Aula 16
(ACH2044) Inteligência Artificial - Aula 16
 
(ACH2044) Inteligência Artificial - Aula 15
(ACH2044) Inteligência Artificial - Aula 15(ACH2044) Inteligência Artificial - Aula 15
(ACH2044) Inteligência Artificial - Aula 15
 
(ACH2044) Inteligência Artificial - Aula 14
(ACH2044) Inteligência Artificial - Aula 14(ACH2044) Inteligência Artificial - Aula 14
(ACH2044) Inteligência Artificial - Aula 14
 
(ACH2044) Inteligência Artificial - Aula 13
(ACH2044) Inteligência Artificial - Aula 13(ACH2044) Inteligência Artificial - Aula 13
(ACH2044) Inteligência Artificial - Aula 13
 
(ACH2044) Inteligência Artificial - Aula 12
(ACH2044) Inteligência Artificial - Aula 12(ACH2044) Inteligência Artificial - Aula 12
(ACH2044) Inteligência Artificial - Aula 12
 
(ACH2044) Inteligência Artificial - Aula 11
(ACH2044) Inteligência Artificial - Aula 11(ACH2044) Inteligência Artificial - Aula 11
(ACH2044) Inteligência Artificial - Aula 11
 
(ACH2044) Inteligência Artificial - Aula 10
(ACH2044) Inteligência Artificial - Aula 10(ACH2044) Inteligência Artificial - Aula 10
(ACH2044) Inteligência Artificial - Aula 10
 
(ACH2044) Inteligência Artificial - Aula 09
(ACH2044) Inteligência Artificial - Aula 09(ACH2044) Inteligência Artificial - Aula 09
(ACH2044) Inteligência Artificial - Aula 09
 
(ACH2044) Inteligência Artificial - Aula 08
(ACH2044) Inteligência Artificial - Aula 08(ACH2044) Inteligência Artificial - Aula 08
(ACH2044) Inteligência Artificial - Aula 08
 
(ACH2044) Inteligência Artificial - Aula 07
(ACH2044) Inteligência Artificial - Aula 07(ACH2044) Inteligência Artificial - Aula 07
(ACH2044) Inteligência Artificial - Aula 07
 
(ACH2044) Inteligência Artificial - Aula 06
(ACH2044) Inteligência Artificial - Aula 06(ACH2044) Inteligência Artificial - Aula 06
(ACH2044) Inteligência Artificial - Aula 06
 
(ACH2044) Inteligência Artificial - Aula 05
(ACH2044) Inteligência Artificial - Aula 05(ACH2044) Inteligência Artificial - Aula 05
(ACH2044) Inteligência Artificial - Aula 05
 

Último

MESTRES DA CULTURA DE ASSARÉ Prof. Francisco Leite.pdf
MESTRES DA CULTURA DE ASSARÉ Prof. Francisco Leite.pdfMESTRES DA CULTURA DE ASSARÉ Prof. Francisco Leite.pdf
MESTRES DA CULTURA DE ASSARÉ Prof. Francisco Leite.pdfprofesfrancleite
 
Introdução às Funções 9º ano: Diagrama de flexas, Valor numérico de uma funçã...
Introdução às Funções 9º ano: Diagrama de flexas, Valor numérico de uma funçã...Introdução às Funções 9º ano: Diagrama de flexas, Valor numérico de uma funçã...
Introdução às Funções 9º ano: Diagrama de flexas, Valor numérico de uma funçã...marcelafinkler
 
A EDUCAÇÃO FÍSICA NO NOVO ENSINO MÉDIO: IMPLICAÇÕES E TENDÊNCIAS PROMOVIDAS P...
A EDUCAÇÃO FÍSICA NO NOVO ENSINO MÉDIO: IMPLICAÇÕES E TENDÊNCIAS PROMOVIDAS P...A EDUCAÇÃO FÍSICA NO NOVO ENSINO MÉDIO: IMPLICAÇÕES E TENDÊNCIAS PROMOVIDAS P...
A EDUCAÇÃO FÍSICA NO NOVO ENSINO MÉDIO: IMPLICAÇÕES E TENDÊNCIAS PROMOVIDAS P...PatriciaCaetano18
 
aprendizagem significatica, teórico David Ausubel
aprendizagem significatica, teórico David Ausubelaprendizagem significatica, teórico David Ausubel
aprendizagem significatica, teórico David Ausubeladrianaguedesbatista
 
O estudo do controle motor nada mais é do que o estudo da natureza do movimen...
O estudo do controle motor nada mais é do que o estudo da natureza do movimen...O estudo do controle motor nada mais é do que o estudo da natureza do movimen...
O estudo do controle motor nada mais é do que o estudo da natureza do movimen...azulassessoria9
 
Slides 9º ano 2024.pptx- Geografia - exercicios
Slides 9º ano 2024.pptx- Geografia - exerciciosSlides 9º ano 2024.pptx- Geografia - exercicios
Slides 9º ano 2024.pptx- Geografia - exerciciosGentil Eronides
 
atividade-de-portugues-paronimos-e-homonimos-4º-e-5º-ano-respostas.pdf
atividade-de-portugues-paronimos-e-homonimos-4º-e-5º-ano-respostas.pdfatividade-de-portugues-paronimos-e-homonimos-4º-e-5º-ano-respostas.pdf
atividade-de-portugues-paronimos-e-homonimos-4º-e-5º-ano-respostas.pdfAutonoma
 
M0 Atendimento – Definição, Importância .pptx
M0 Atendimento – Definição, Importância .pptxM0 Atendimento – Definição, Importância .pptx
M0 Atendimento – Definição, Importância .pptxJustinoTeixeira1
 
Slide - SAEB. língua portuguesa e matemática
Slide - SAEB. língua portuguesa e matemáticaSlide - SAEB. língua portuguesa e matemática
Slide - SAEB. língua portuguesa e matemáticash5kpmr7w7
 
Caderno de exercícios Revisão para o ENEM (1).pdf
Caderno de exercícios Revisão para o ENEM (1).pdfCaderno de exercícios Revisão para o ENEM (1).pdf
Caderno de exercícios Revisão para o ENEM (1).pdfJuliana Barbosa
 
Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...
Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...
Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...azulassessoria9
 
E a chuva ... (Livro pedagógico para ser usado na educação infantil e trabal...
E a chuva ...  (Livro pedagógico para ser usado na educação infantil e trabal...E a chuva ...  (Livro pedagógico para ser usado na educação infantil e trabal...
E a chuva ... (Livro pedagógico para ser usado na educação infantil e trabal...andreiavys
 
Sopa de letras | Dia da Europa 2024 (nível 1)
Sopa de letras | Dia da Europa 2024 (nível 1)Sopa de letras | Dia da Europa 2024 (nível 1)
Sopa de letras | Dia da Europa 2024 (nível 1)Centro Jacques Delors
 
Sistema de Bibliotecas UCS - Cantos do fim do século
Sistema de Bibliotecas UCS  - Cantos do fim do séculoSistema de Bibliotecas UCS  - Cantos do fim do século
Sistema de Bibliotecas UCS - Cantos do fim do séculoBiblioteca UCS
 
6ano variação linguística ensino fundamental.pptx
6ano variação linguística ensino fundamental.pptx6ano variação linguística ensino fundamental.pptx
6ano variação linguística ensino fundamental.pptxJssicaCassiano2
 
apostila filosofia 1 ano 1s (1).pdf 1 ANO DO ENSINO MEDIO . CONCEITOSE CARAC...
apostila filosofia 1 ano  1s (1).pdf 1 ANO DO ENSINO MEDIO . CONCEITOSE CARAC...apostila filosofia 1 ano  1s (1).pdf 1 ANO DO ENSINO MEDIO . CONCEITOSE CARAC...
apostila filosofia 1 ano 1s (1).pdf 1 ANO DO ENSINO MEDIO . CONCEITOSE CARAC...SileideDaSilvaNascim
 
3 2 - termos-integrantes-da-oracao-.pptx
3 2 - termos-integrantes-da-oracao-.pptx3 2 - termos-integrantes-da-oracao-.pptx
3 2 - termos-integrantes-da-oracao-.pptxMarlene Cunhada
 
Apresentação | Dia da Europa 2024 - Celebremos a União Europeia!
Apresentação | Dia da Europa 2024 - Celebremos a União Europeia!Apresentação | Dia da Europa 2024 - Celebremos a União Europeia!
Apresentação | Dia da Europa 2024 - Celebremos a União Europeia!Centro Jacques Delors
 
Cartão de crédito e fatura do cartão.pptx
Cartão de crédito e fatura do cartão.pptxCartão de crédito e fatura do cartão.pptx
Cartão de crédito e fatura do cartão.pptxMarcosLemes28
 
Quiz | Dia da Europa 2024 (comemoração)
Quiz | Dia da Europa 2024  (comemoração)Quiz | Dia da Europa 2024  (comemoração)
Quiz | Dia da Europa 2024 (comemoração)Centro Jacques Delors
 

Último (20)

MESTRES DA CULTURA DE ASSARÉ Prof. Francisco Leite.pdf
MESTRES DA CULTURA DE ASSARÉ Prof. Francisco Leite.pdfMESTRES DA CULTURA DE ASSARÉ Prof. Francisco Leite.pdf
MESTRES DA CULTURA DE ASSARÉ Prof. Francisco Leite.pdf
 
Introdução às Funções 9º ano: Diagrama de flexas, Valor numérico de uma funçã...
Introdução às Funções 9º ano: Diagrama de flexas, Valor numérico de uma funçã...Introdução às Funções 9º ano: Diagrama de flexas, Valor numérico de uma funçã...
Introdução às Funções 9º ano: Diagrama de flexas, Valor numérico de uma funçã...
 
A EDUCAÇÃO FÍSICA NO NOVO ENSINO MÉDIO: IMPLICAÇÕES E TENDÊNCIAS PROMOVIDAS P...
A EDUCAÇÃO FÍSICA NO NOVO ENSINO MÉDIO: IMPLICAÇÕES E TENDÊNCIAS PROMOVIDAS P...A EDUCAÇÃO FÍSICA NO NOVO ENSINO MÉDIO: IMPLICAÇÕES E TENDÊNCIAS PROMOVIDAS P...
A EDUCAÇÃO FÍSICA NO NOVO ENSINO MÉDIO: IMPLICAÇÕES E TENDÊNCIAS PROMOVIDAS P...
 
aprendizagem significatica, teórico David Ausubel
aprendizagem significatica, teórico David Ausubelaprendizagem significatica, teórico David Ausubel
aprendizagem significatica, teórico David Ausubel
 
O estudo do controle motor nada mais é do que o estudo da natureza do movimen...
O estudo do controle motor nada mais é do que o estudo da natureza do movimen...O estudo do controle motor nada mais é do que o estudo da natureza do movimen...
O estudo do controle motor nada mais é do que o estudo da natureza do movimen...
 
Slides 9º ano 2024.pptx- Geografia - exercicios
Slides 9º ano 2024.pptx- Geografia - exerciciosSlides 9º ano 2024.pptx- Geografia - exercicios
Slides 9º ano 2024.pptx- Geografia - exercicios
 
atividade-de-portugues-paronimos-e-homonimos-4º-e-5º-ano-respostas.pdf
atividade-de-portugues-paronimos-e-homonimos-4º-e-5º-ano-respostas.pdfatividade-de-portugues-paronimos-e-homonimos-4º-e-5º-ano-respostas.pdf
atividade-de-portugues-paronimos-e-homonimos-4º-e-5º-ano-respostas.pdf
 
M0 Atendimento – Definição, Importância .pptx
M0 Atendimento – Definição, Importância .pptxM0 Atendimento – Definição, Importância .pptx
M0 Atendimento – Definição, Importância .pptx
 
Slide - SAEB. língua portuguesa e matemática
Slide - SAEB. língua portuguesa e matemáticaSlide - SAEB. língua portuguesa e matemática
Slide - SAEB. língua portuguesa e matemática
 
Caderno de exercícios Revisão para o ENEM (1).pdf
Caderno de exercícios Revisão para o ENEM (1).pdfCaderno de exercícios Revisão para o ENEM (1).pdf
Caderno de exercícios Revisão para o ENEM (1).pdf
 
Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...
Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...
Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...
 
E a chuva ... (Livro pedagógico para ser usado na educação infantil e trabal...
E a chuva ...  (Livro pedagógico para ser usado na educação infantil e trabal...E a chuva ...  (Livro pedagógico para ser usado na educação infantil e trabal...
E a chuva ... (Livro pedagógico para ser usado na educação infantil e trabal...
 
Sopa de letras | Dia da Europa 2024 (nível 1)
Sopa de letras | Dia da Europa 2024 (nível 1)Sopa de letras | Dia da Europa 2024 (nível 1)
Sopa de letras | Dia da Europa 2024 (nível 1)
 
Sistema de Bibliotecas UCS - Cantos do fim do século
Sistema de Bibliotecas UCS  - Cantos do fim do séculoSistema de Bibliotecas UCS  - Cantos do fim do século
Sistema de Bibliotecas UCS - Cantos do fim do século
 
6ano variação linguística ensino fundamental.pptx
6ano variação linguística ensino fundamental.pptx6ano variação linguística ensino fundamental.pptx
6ano variação linguística ensino fundamental.pptx
 
apostila filosofia 1 ano 1s (1).pdf 1 ANO DO ENSINO MEDIO . CONCEITOSE CARAC...
apostila filosofia 1 ano  1s (1).pdf 1 ANO DO ENSINO MEDIO . CONCEITOSE CARAC...apostila filosofia 1 ano  1s (1).pdf 1 ANO DO ENSINO MEDIO . CONCEITOSE CARAC...
apostila filosofia 1 ano 1s (1).pdf 1 ANO DO ENSINO MEDIO . CONCEITOSE CARAC...
 
3 2 - termos-integrantes-da-oracao-.pptx
3 2 - termos-integrantes-da-oracao-.pptx3 2 - termos-integrantes-da-oracao-.pptx
3 2 - termos-integrantes-da-oracao-.pptx
 
Apresentação | Dia da Europa 2024 - Celebremos a União Europeia!
Apresentação | Dia da Europa 2024 - Celebremos a União Europeia!Apresentação | Dia da Europa 2024 - Celebremos a União Europeia!
Apresentação | Dia da Europa 2024 - Celebremos a União Europeia!
 
Cartão de crédito e fatura do cartão.pptx
Cartão de crédito e fatura do cartão.pptxCartão de crédito e fatura do cartão.pptx
Cartão de crédito e fatura do cartão.pptx
 
Quiz | Dia da Europa 2024 (comemoração)
Quiz | Dia da Europa 2024  (comemoração)Quiz | Dia da Europa 2024  (comemoração)
Quiz | Dia da Europa 2024 (comemoração)
 

(ACH2001) Introdução à Programação - Aula 19

  • 1. Aula 19 – Heran¸ca Norton Trevisan Roman 12 de maio de 2020 Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 1 / 33
  • 2. Heran¸ca Quebramos AreaCasa em Casa, CasaQuad e CasaRet Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 2 / 33
  • 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
  • 31. Heran¸ca Polimorfismo “O que possui v´arias formas” Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 12 / 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
  • 37. Heran¸ca Polimorfismo Sobrecarga (Overloading): Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 14 / 33
  • 38. Heran¸ca Polimorfismo Sobrecarga (Overloading): M´etodos com o mesmo nome, por´em assinaturas diferentes Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 14 / 33
  • 39. Heran¸ca Polimorfismo Sobrecarga (Overloading): M´etodos com o mesmo nome, por´em assinaturas diferentes Sobrescrita (Overriding): Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 14 / 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
  • 42. Heran¸ca Em suma: Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 15 / 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
  • 82. Heran¸ca Ent˜ao... Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 27 / 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
  • 101. Videoaula N˜ao h´a. Norton Trevisan Roman Aula 19 – Heran¸ca 12 de maio de 2020 33 / 33