2 - FUNDAMENTOS
HERANÇA
Promove a reutilização de códigos, deixando códigos mais claros e evita a duplicação do código. Ganhamos muita produtividade em sistemas “grandes”, quando temos que realizar algum tipo de manutenção em um determinado código.
class Game{
public void inicio(){
System.out.println("Inicio");
}
}
class TopGear extends Game{
public void fim(){
System.out.println("Fim");
}
}
public class Rascunho{
public static void main(String[] args) {
TopGear jogo = new TopGear();
jogo.inicio(); //metodo da classe Game
jogo.fim(); //metodo da classe TopGear
}
}
Um bom exemplo de herança foi citado acima, a classe TopGear herdou o método inicio da classe Game.
RELACIONAMENTO É-UM:
Este conceito é baseado na herança de classes ou implementações de interfaces.
Segue alguns exemplos:
Belina É-UM Veiculo(Belina é um tipo de veiculo – pode até não parecer verdade, mas é J )
Cachorro É-UM Animal.
Em java isso ficaria assim:
class Game{
public void inicio(){
System.out.println("Inicio");
}
}
class TopGear extends Game{
public void fim(){
System.out.println("Fim");
}
}
public class Rascunho{
public static void main(String[] args) {
Game jogo = new TopGear();
// TOPGEAR É UM JOGO -> ISSO COMPILA
TopGear jogo = new Game();
// GAME NÃO É UM TOPGEAR -> ISSO NÃO COMPILA
// o máximo que poderíamos fazer, é converter game para // topgear, mas não seria o nosso caso
}
POLIMORFISMO:
Como o próprio nome já bastante intuitivo, muitas formas.
Sabemos que vários animais correm, mas também sabemos que correm de maneira de diferentes.
Uma classe pode herdar métodos da classe mãe e pode implementar os métodos marcados com abstract.
class Game{
public void start(){
System.out.println("Start game");
}
}
class TopGear extends Game{
public void start(){
System.out.println("Inicio Lento");
}
}
class NeedForSpeed extends Game{
public void start(){
System.out.println("Incio rápido");
}
}
Polimorfismo em Interface: não faz parte da hierarquia de classe ou seja, uma classe não pode extends a uma interface mas pode implementá-la;
Métodos subscritos:
Acontece quando herdo um método da classe mãe, e altero o comportamento dele na classe filha.
Um ponto importante a ser destacado, é que métodos abstratos não podem ser sobrecarregados.
abstract class Game{
public void start(){
System.out.println("Start game");
}
public abstract void nada();
}
class TopGear extends Game{
public void start(){
System.out.println("Inicio Lento");
}
public void nada(){
//tenho que implementar
}
}
Só é possível referenciar objetos do tipo que a super classe conheça.
class Game{
public void start(){
System.out.println("Start game");
}
}
class TopGear extends Game{
public void start(){
System.out.println("Inicio Lento");
}
}
public class Rascunho{
public static void main(String[] args) {
Game a = new Game();
Game b = new TopGear();
a.start();
b.start();
}
}
No caso acima, como a variável “a” é do tipo Game e o objeto do tipo Game, a.start() irá imprimir “Start Game”, e a variável “b” é do tipo TopGear() porém o objeto é TopGear, irá imprimir “Início Lento”.
Outra informação que vale muito a pena salientar: Se na classe TopGear tivesse o ‘public void velocidade(){}’ e se o objeto B tentasse acessá-lo, um erro de compilação iria acontecer, pois a classe Pai, não possui este método.
class Game{
public void start(){
System.out.println("Start game");
}
}
class TopGear extends Game{
public void start(){
System.out.println("Inicio Lento");
}
public void velocidade(){
System.out.println("100km/h");
}
}
public class Rascunho{
public static void main(String[] args) {
Game a = new Game();
Game b = new TopGear();
a.start();
b.start();
b.velocidade(); // classe pai não tem este método..
// ERRO COMPILAÇÃO
}
}
Regras Importantes a serem seguidas:
- Ao herdar um método, jamais posso diminuir a sua visibilidade;
- Tipo de retorno deve ser o mesmo;
- Lista de argumentos deve ser igual, se não vira sobrecarga;
- Métodos staticos não podem ser subscritos.
- Método subscrito pode ou não lançar uma execeção mais restritiva que a da superclasse.
class Game{
public void start(){
System.out.println("Start game");
}
}
class TopGear extends Game{
public void start() throws Exception{//Erro de compilação
System.out.println("Inicio Lento");
}
}
O mesmo vale para métodos Static.
Quando se tem exceções menos restritivas, o código compila.
class Game{
public void start(){
System.out.println("Start game");
}
}
class TopGear extends Game{
public void start() throws RuntimeException{
System.out.println("Inicio Lento");
}
}
MÉTODOS SOBRECARREGADOS.
Usar o mesmo nome de um método várias em uma mesma classe, alterando apenas os argumentos.
Métodos sobrecarregados podem:
- alterar o tipo de retorno
- alterar o modificador de acesso (private, protected)
- ser sobrecarregado na mesma classe ou subclasse
Game b = new TopGear();
//Game: referencia
//TopGear: tipo do objeto
Um exemplo que pode confudir é este:
class Game{
public void start(){
System.out.println("Start game");
}
}
class TopGear extends Game{
public void start(int a){
System.out.println("Inicio Lento");
}
}
public class Rascunho{
public static void main(String[] args) {
Game b = new TopGear();
b.start();
//vai executar o metodo da referencia, pois o do tipo foi sobrecarregado
}
}
Neste caso acima, ele so chama o método do tipo, se criarmos um objeto com a referencia TopGear.
Outro exemplo que confunde bastante:
class Game{
public void cor(){
System.out.println("branco");
}
public void cor(String str){
System.out.println("Preto");
}
}
class TopGear extends Game{
public void cor(){
System.out.println("Azul");
}
public void cor(String str){
System.out.println("vermelho");
}
}
public class Rascunho{
public static void main(String[] args) {
Game b = new Game();
Game c = new TopGear();
Game d = new TopGear();
Linha 1 b.cor(); //branco
Linha 2 c.cor();// azul
Linha 3 d.cor("cor");// vermelho
}
}
Na linha 2, ele chama o metodo da subclasse, pois o método sobrecarregado foi subscrito, ele chama a cor() do Objeto não da referência.
Metodo cor foi sobrecarregado na superclass
Metodo cor foi subscrito na subclasse.
Bom, por hoje é só. Amanhã volto com mais novidades no meu resumão. :-)
Nenhum comentário:
Postar um comentário