Buscar

PC2 Aula05

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 15 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 15 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 15 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

© ELFS 79 
•  Considere a seguinte classe Veiculo: 
•  A classe Veiculo representa um veículo qualquer. 
•  E se for necessário trabalhar com tipos específicos de veículos, como 
caminhão, carro de passeio ou motocicleta? Novas classes! 
•  Para construir as novas classes: tomar a classe Veiculo como base (pois, 
caminhão, carro de passeio ou motocicleta são veículos). 
•  As novas classes serão subclasses da classe Veiculo. 
•  A construção de classes tendo como base uma outra classe permite 
construir uma hierarquia de classes. 
•  Numa hierarquia de classes, a classe mais geral (superclasse) serve de base 
para a construção de classes mais específicas (subclasses). 
5. Hierarquia de Classes 
Veiculo 
− double velocidade 
− double posicao 
+ Veiculo() 
+ void atualizarVelocidade() 
+ void atualizarPosicao() 
 
•  As subclasses herdam os campos e métodos de sua superclasse, que por sua 
vez, pode ter herdado campos e métodos de outras superclasses. 
•  Em Java, uma classe pode ter apenas de uma superclasse imediata. Isto é 
conhecido como estrutura de herança simples. 
•  Por exemplo: Caminhao não pode ser subclasse de Veiculo e também ser 
subclasse de uma classe MinhaFrota. 
© ELFS 80 
5. Hierarquia de Classes 
Veiculo 
# double velocidade 
# double posicao 
+ Veiculo() 
+ void atualizarVelocidade() 
+ void atualizarPosicao() 
Motocicleta 
− boolean pagaPedagio 
Carro 
− int numPassageiros 
+ void atualizarPosicao() 
Caminhao 
− double capacidade 
− int numEixos 
+ void alterarCarga() 
Note que os campos da 
superclasse devem ser 
protected (e não private) 
para serem herdados pelas 
subclasses. 
© ELFS 81 
•  Definição de classe tendo como base uma outra classe: 
•  O modificador estabelece o nível de acesso à classe. Classes só podem ser 
definidas no nível public (acesso total) ou pacote (ausência do modificador). 
•  A palavra-chave super pode ser utilizada em uma subclasse para acessar os 
campos ou métodos da superclasse (se acessíveis). 
 
A classe Object 
•  Todas as classes herdam, em última instância, da classe Object. A classe 
Object possui métodos que podem ser reutilizados por todas as classes de 
um programa, por exemplo, o método toString(). 
•  Em Java, a declaração de uma classe implicitamente inclui extends Object. 
[<modificador>] class <nome_classe> [extends <nome_superclasse>] 
{ 
 [<declaração_atributos>] 
 [<declaração_construtores>] 
 [<declaração_métodos>] 
} 
5. Hierarquia de Classes 
class Carro extends Veiculo 
{ 
 private int numPassageiros; 
 ... 
} 
© ELFS 82 
Redefinição de métodos 
•  Métodos herdados de uma superclasse podem ser redefinidos na subclasse. 
A redefinição é uma nova implementação para o método herdado, específica 
para a subclasse. 
•  Lembrando: a combinação do nome de um método com sua lista de 
parâmetros é conhecida como assinatura do método. 
•  Para a redefinição, o método da subclasse deve ter a mesma assinatura do 
método herdado da superclasse. O valor de retorno (embora não sendo 
parte da assinatura) também deve ser o mesmo. 
•  O modificador de acesso pode mudar, mas o método na subclasse não pode 
ser menos acessível do que o método da superclasse. 
•  Se os métodos herdados da superclasse forem definidos na subclasse com 
assinaturas diferentes haverá a sobrecarga e não a redefinição dos métodos. 
5. Hierarquia de Classes 
private (package) protected public 
© ELFS 83 
Exemplo: 
5. Hierarquia de Classes 
Figura 
# int base 
# int altura 
+ Figura(int, int) 
+ double calcularArea() 
+ void mostrar() 
Triangulo 
− boolean retangulo 
+ Triangulo(int, int) 
+ double calcularArea() 
Quadrado 
+ Quadrado(int) 
+ void mostrar(int) 
Retangulo 
+ Retangulo(int, int) 
Figura é a superclasse. 
Retangulo e Triangulo são subclasses 
de Figura. 
Quadrado é subclasse de Retangulo (ou 
seja Retangulo é superclasse de 
Quadrado). 
 
A classe Retangulo herda os campos base e altura da 
classe Figura. A classe Retangulo herda também os 
métodos calcularArea() e mostrar() da classe Figura 
(construtores não são herdados). 
Na classe Triangulo, o método calcularArea() é 
redefinido. 
 Quais são os campos e métodos da classe Quadrado? 
 
© ELFS 84 
Polimorfismo 
•  Numa hierarquia de classes, uma variável de referência para um objeto da 
superclasse pode apontar também para um objeto da subclasse. 
•  Como cada objeto tem sua própria forma (definida pela classe), essa variável 
ao referenciar objetos de diferentes classes, terá diferentes formas 
(polimorfismo). 
•  Exemplo: 
public class Midia { 
 protected int codigo; 
 protected float preco; 
 public String getDetalhes() { 
 return codigo + ": " + preco; 
 } 
} 
public class DVD extends Midia { 
 protected String autor; 
 public String getDetalhes() { 
 return super.getDetalhes() + " - " + autor; 
 } 
} 
5. Hierarquia de Classes 
Midia 
# int codigo 
# float preco 
+String getDetalhes() 
DVD 
# String autor 
+String getDetalhes() 
Exemplo: 
© ELFS 85 
Midia m; 
m = new Midia(); 
m.getDetalhes(); // será chamado o método da superclasse 
m = new DVD(); 
m.getDetalhes(); // será chamado o método da subclasse 
O método a ser chamado é definido em 
tempo de execução (runtime). A isso 
dá-se o nome de ligação dinâmica de 
método. Daí vem o polimorfismo. 
Observe que quando a variável m aponta para o 
objeto DVD, a partir de m tem-se acesso aos 
campos e métodos (herdados) da superclasse 
(Midia). No entanto, para os métodos de Midia que 
foram redefinidos em DVD, o acesso é feito aos 
métodos da subclasse. 
Œ 
 
Stack Heap 
m Midia 
DVD 
 
Œ 
5. Hierarquia de Classes 
© ELFS 86 
•  Considere a seguinte hierarquia de classes: 
•  Imagine que desejamos implementar um método calcularPreco() para as 
classes CD e DVD. Podemos incluir esse método na classe Midia para que seja 
herdado pelas classes CD e DVD? Sim! Usando a palavra-reservada this e o 
operador instanceof. 
•  A palavra this, usada no corpo de um método, corresponde ao objeto que 
chamou o método. 
•  O operador instanceof permite identificar a classe para a qual uma variável de 
referência aponta. 
•  Para a hierarquia de classe acima, uma variável declarada como: 
Midia m; 
w  pode apontar para um objeto da classe Midia ou para um objeto de uma das 
subclasses CD ou DVD. 
5. Hierarquia de Classes 
Midia 
CD DVD 
© ELFS 87 
•  Podemos implementar o método calcularPreco() na classe Midia como: 
5. Hierarquia de Classes 
 public void calcularPreco() 
 { 
 if (this instanceof CD) 
 preco = 15.00; 
 else 
 if (this instanceof DVD) 
 preco = 30.00; 
 else 
 preco = 2.00; 
 } 
public class TestaMidia { 
 public static void main(String arg[]) { 
 Midia m = new Midia(); 
 m.calcularPreco(); 
 ... 
 m = new CD(); 
 m.calcularPreco(); 
 ... 
 } 
} 
É claro que, mesmo sem polimorfismo, por 
exemplo: 
CD c = new CD(); 
c.calcularPreco(); 
o método calcularPreco() retornaria o valor 
correto, devido ao uso do operador instanceof. 
© ELFS 88 
Construtores e Herança 
•  Um construtor de uma subclasse pode chamar explicitamente um construtor 
de sua superclasse utilizando o método super(). Neste caso, a chamada ao 
método super() deve ser a primeira linha do construtor da subclasse. O 
construtor da superclasse a ser chamado é definido pelos parâmetros 
passados ao método super(). 
•  Se no construtor da subclasse nenhuma chamada a this() (construtor da 
própria classe) ou a super() for feita, o compilador incluirá automaticamente 
uma chamada a super(), ou seja, ao construtor sem parâmetros dasuperclasse. Se a superclasse não tiver um construtor sem parâmetros, um 
erro será gerado pelo compilador. 
•  Se na subclasse não existir um construtor, a chamada super() também será 
inserida no construtor padrão (inserido automaticamente pelo compilador). 
•  Objetivo: garantir que um objeto da classe Object seja instanciado. 
5. Hierarquia de Classes 
© ELFS 89 
Exemplo: 
public class Object 
{ 
 public Object() {} 
} 
public class Midia extends Object 
{ 
 protected int codigo; 
 protected double preco; 
 
 public Midia(int c, double p) 
 { 
 // chamada implicita a super() 
 codigo = c; 
 preco = p; 
 } 
 public Midia(int c) 
 { 
 this(c, 0.0); 
 } 
} 
public class DVD extends Midia 
{ 
 protected String autor; 
 
 public DVD(String a) 
 { 
 super(10); 
 autor = a; 
 } 
} 
5. Hierarquia de Classes 
Lembrar que: 
 
this() corresponde a uma 
chamada ao construtor da 
própria classe. 
 
super() corresponde a uma 
chamada ao construtor da 
superclasse. 
© ELFS 90 
Exemplo: 
public class Ponto 
{ 
 protected int x, y; // coordenadas do ponto 
 
 public Ponto() 
 { 
 x = 0; 
 y = 0; 
 } 
 public Ponto(int a, int b) 
 { 
 setX(a); 
 setY(b); 
 } 
 
 public void setX(int a) { x = ((a > 0)? a : 0); } 
 public void setY(int b) { y = ((b > 0)? b : 0); } 
 public int getX() { return x; } 
 public int getY() { return y; } 
 
 public String toString() 
 { 
 return "[" + x + ", " + y + "]"; 
 } 
} 
Haverá uma chamada implícita a super(), ou 
seja, o construtor padrão da classe Object. 
5. Hierarquia de Classes 
Ponto.java 
Haverá uma chamada implícita a super(). 
O método toString() da classe Ponto redefine o 
método toString() herdado da classe Object. 
© ELFS 91 
public class Circulo extends Ponto 
{ 
 protected double raio; 
 
 public Circulo() 
 { 
 raio = 0; 
 } 
 public Circulo(double r, int a, int b) 
 { 
 super(a,b); 
 setRaio(r); 
 } 
 
 public void setRaio(double r) { raio = (r >= 0)? r : 0.0; } 
 public double getRaio() { return raio; } 
 
 public double area() 
 { 
 return Math.PI * Math.pow(raio,2); 
 } 
 
 public String toString() 
 { 
 return "Centro = [ " + x + ", " + y + "]; Raio = " + raio; 
 } 
} 
Haverá uma chamada implícita ao construtor padrão da classe 
Ponto. Se a classe Ponto tivesse apenas o construtor com 
parâmetros, haveria um erro de compilação. 
5. Hierarquia de Classes 
Circulo.java 
O método toString() da classe Circulo redefine o 
método toString() herdado da classe Ponto. 
Saída: 
© ELFS 92 
public class TestaHierarquia { 
 public static void main(String args[]) { 
 Ponto p; 
 Circulo c; 
 
 p = new Ponto(30,50); 
 System.out.println("Ponto: " + p); 
 
 c = new Circulo(2.5,120,90); 
 System.out.println("Circulo: " + c); 
 
 p = c; 
 if (p instanceof Circulo) 
 { 
 System.out.prinln("p se refere a um circulo"); 
 System.out.println("Circulo: " + p); 
 System.out.println("Area = " + c.area()); 
 } 
 } 
} 
5. Hierarquia de Classes 
TestaHierarquia.java 
Ponto: [30, 50] 
Circulo: Centro = [ 120, 90]; Raio = 2.5 
p se refere a um circulo 
Circulo: Centro = [ 120, 90]; Raio = 2.5 
Area = 19.634954084936208 
Notar que p.area() seria incorreto, 
pois p foi declarado como Ponto e, 
portanto, em tempo de compilação, 
p não tem acesso ao método area(). 
© ELFS 93 
A palavra-chave final 
 
•  Algumas vezes pode ser interessante que um elemento de um programa 
(classe, campo ou método) não possa ser modificado. Nestes casos, a 
palavra-chave final deve ser usada. 
 
•  Classe final: uma classe especificada como final não pode ter subclasses. A 
classe String é final: garante-se que essa classe não será alterada. 
 
•  Método final: um método definido como final não pode ser redefinido. 
Métodos são definidos como final quando sua implementação não puder ser 
alterada por alguma razão. Métodos declarados como static ou como 
private são implicitamente final. Todos os métodos de uma classe final são 
implicitamente final. 
 
•  Campo final: um campo definido como final não pode ser modificado, ou 
seja, é uma constante. Uma vez atribuído um valor ao campo, este valor 
não pode ser alterado. Uma classe pode ter um campo final que não é 
inicializado na definição e sim em um construtor, mas uma vez que a 
atribuição seja feita, o valor não pode mudar. 
5. Hierarquia de Classes

Outros materiais