Repare no cabeçalho da classe:
public class JogoComObjetivo extends Jogo
A palavra extends
diz ao compilador que esta é uma subclasse da classe Jogo
, ou seja:
todos os métodos e atributos definidos na classe Jogo
também fazem parte, implicitamente, da classe JogoComObjetivo
; não precisamos de voltar a escrevê-los quando definimos a subclasse;
como consequência, as classes cliente de JogoComObjetivo
poderão aceder:
Jogo
com acessibilidade public
;Jogo
com acessibilidade package
, desde que sejam classes cliente pertencentes ao mesmo package que Jogo
;no corpo de qualquer método definido na classe JogoComObjetivo
, podemos aceder:
Jogo
com acessibilidade public
;Jogo
com acessibilidade protected
;`Jogo
com acessibilidade package
, desde que JogoComObjetivo
pertença ao mesmo package que Jogo
.
O seguinte método main
, numa qualquer classe cliente de JogoComObjetivo
, acede não só ao construtor dessa classe e ao método pontuacaoObjetivo
nela definidos, como também aos métodos juntarJogador
, registarPontosJogada
e estahEmJogo
definidos na classe Jogo
e "herdados" pela subclasse:
xxxxxxxxxx
public static void main (String [] args) {
JogoComObjetivo meuJogo = new JogoComObjetivo("Spiral",30);
System.out.println("O objetivo eh " + meuJogo.pontuacaoObjetivo());
meuJogo.juntarJogador("Maria");
meuJogo.registarPontosJogada("Maria", 13);
System.out.println("Maria estah em jogo? " + meuJogo.estahEmJogo("Maria"));
System.out.println("Pontuacao Maria: " + meuJogo.pontuacao(“Maria"));
}
Se o executarmos, obtemos o output:
xxxxxxxxxx
O objetivo eh 30
Maria estah em jogo? true
Pontuacao Maria: 13
No Java, a relação de subclasse/superclasse é realizada através da palavra extends
:
xxxxxxxxxx
class B extends A { // B é subclasse de A
… // e
} // A é superclasse de B
No Java,
- toda e qualquer classe é subclasse da classe
Object
.- a classe
Object
é superclasse de toda e qualquer classe.
Então porque é que os cabeçalhos das classes que temos construído ao longo deste curso não contêm as palavras extends Object
? Porque não é necessário. Quando nada é dito, o compilador assume que a classe herda diretamente da classe Object
.
No Java, a herança é simples:
- uma classe só pode ter uma superclasse direta;
- mas pode ter várias subclasses diretas.
Existem outras linguagens orientadas a objetos que suportam herança múltipla mas o Java não o permite.
A herança é transitiva:
- se uma classe C é subclasse de B e se B é subclasse de A, então C é subclasse de A.
Percebe-se melhor agora a frase "Toda e qualquer classe é subclasse da classe Object
". A classe JogoComObjetivo
estende diretamente a classe Jogo
; esta, por sua vez, estende diretamente a classe Object
, pois não declara no seu cabeçalho que estende alguma outra classe. Logo, a classe JogoComObjetivo
é subclasse de Object
, herdando, por isso, também, os vários métodos nesta definidos (toString
, equals
, hashCode
, etc), como mais adiante estudaremos.
Para representar a relação de extends
entre duas classes, usa-se uma seta a com a cabeça branca.
Anterior: 14.1. Uma subclasse de Jogo
Seguinte: 14.3. Subtipos