sábado, 28 de agosto de 2010

Resumo SCJP - Parte IV


CONVERSÃO DE VARIÁVEIS DE REFERENCIA:
                                            
class Game{
}
class TopGear extends Game{
}
public class Rascunho{
      public static void main(String[] args) {
            TopGear b = (TopGear) new Game();
      }
}
Dessa forma, o código consegue ser compilado, mas lança um warning.
Outro motivo de compilar, é por estar todas na mesma árvore de herança, pois um TopGear não pode ser um Jogo!!!
Outra atenção que devemos ter é: o que deve ser convertido é o OBJETO não o TIPO DELE.

class Game{
}
class TopGear extends Game{
}
public class Rascunho{
      public static void main(String[] args) {
            Game game = new TopGear();
            Game gm = (TopGear)game;
            //compila porque game é um objeto do tipo TopGear
      }
}

Se o tipo do objeto não fazer parte da arvore de herança NÃO É COMPILADO.

Quando tempo fazer algo impossível, uma conversão meio cabulosa, uma exceção é lançada:
TopGear game = new Game();
Outra erro de compilação:
class Pais{
      public void pib(){
            System.out.println("PIB");
      }
}
class Brasil extends Pais{
      public void populacao(){
            System.out.println("populacao");
      }
}

class MinasGerais extends Brasil{
      public void comida(){
            System.out.println("comida");
      }
}

class BH{
      public void  bairro(){
            System.out.println("Bairro");
      }
}

class Localizacao extends BH{
      public void local(){
            System.out.println("local");
      }
}

public class Rascunho{
      public static void main(String[] args) {
            BH bh = new Localizacao();
            bh.local();
      }
}
Aí não temos o metodo local() na classe BH. Por isso o código não é compilado, devemos converter para que nosso código seja compilado.

((Localizacao)bh).local();
Dessa forma, o nosso código compila.



INTERFACE

 - É um contrato que fazemos, onde todos os métodos assinados na interface deverão ser implementados.
 - Fornecer implementação concreta para todos os métodos abstratos;
 - Seguir regras de sobrecarga;
 - Manter assinatura e mesmo tipo de retorno.

Se a classe que tiver implementando uma interface for ABSTRATA, ela não tem obrigação de implementar nenhum método.
Uma classe pode implementar 2 ou mais interfaces.

O que não devemos esquecer:

- Uma interface jamais vai implementar outra.
- Uma interface jamais vai implementar uma classe.
- Interface não extends class
interface veiculo{
      void velocidade();
}
interface fabricante{
      void modelo();
}
class fusca implements veiculo, fabricante{
      public void velocidade() {
      }
      public void modelo() {
      }
}

Neste exemplo a classe fusca implementa as duas interfaces, tem que implementar os metodos das respectivas. Caso um deixe de ser implementado o codigo não é compilado.

Como falamos anteriormente, se a classe for abstrata ela não necessita implementar todos os métodos.

interface veiculo{
      void velocidade();
}
interface fabricante{
      void modelo();
}
abstract class fusca implements veiculo, fabricante{
      public void velocidade() {
      }
}

Uma observação que merece ser frisada é que, quando duas interfaces forem implementadas pela mesma classe, as interfaces definitivamente não poderá ter métodos com mesmo nome.

Interfaces não possuem construtores.


TIPOS DE RETORNO:

Void: não retorna nada
public void velocidade() {}

Retorno de Objetos: em um método que tenha um tipo de Objeto como retorno, ela pode retornar qualquer tipo (desde que esteja dentro da arvore de herança)
public Animal velocidade() {
      return Cavalo(); 
}
// a classe deve extends a Animal

CONSTRUTORES:
Serve para inicializar o estado das variáveis de instância. Toda classe possui um (ou mais) construtores.
Construtores não possuem tipo de retorno.
Uma atenção que devemos tomar é: VOID é um tipo de retorno, e um construtor não deve ter um retorno.


abstract class fusca implements veiculo, fabricante{
      public void velocidade() {
      }
      public fusca(){}
}

O código abaixo não compila, pois o construtor da superclasse necessita de um parametro.

class PaisFabricacao{
      private String nomePais;
     
      public PaisFabricacao(String nome) {
            this.nomePais = nome;
      }
}

abstract class fusca extends PaisFabricacao implements veiculo, fabricante{
      public void velocidade() {
      }
      public fusca(){}
}

Como herdamos a classe PaisFabricacao, e o construtor dessa necessita de um parametro, devemos instacia-la passando um paramentro no construtor.

ESTÁTICOS – STATIC
Garante que haverá apenas uma referencia a determinada variável na memoria.

Satic, nos permite acessar diretamente, sem a necessitedade de instanciar o objeto.

class PaisFabricacao{
      private String nomePais;
      public static String fabricaoEmSerie = "FABRICACAO_EM_SERIE";
      public PaisFabricacao() {
      }
     
      public PaisFabricacao(String nome) {
            this.nomePais = nome;
      }
}

abstract class fusca extends PaisFabricacao implements veiculo, fabricante{
      public void velocidade() {
      }
      public fusca(){}
      public static void main(String[] args) {
            String emSerie = PaisFabricacao.fabricaoEmSerie;
            //como é public e static, não nessecitamos de instanciar um objeto
           
      }
}
O mesmo é aplicado para métodos.


COESÃO E ACOPLAMENTO.

COESÃO: Quando uma classe é bem definida e focada. Quando uma classe tem um único objetivo e função. Devemos sempre tentar com uma alta COESÃO.

class VendaCliente{
      public void efetuaVenda(){}
      public void calculaTotal(){}
}

ACOPLAMENTO:
Quando uma classe tem dependencia com outras. Devemos tentar ao máximo diminuir o acoplamento.

No exemplo abaixo, nada sei sobre o cliente, apenas consumo o seus serviços.

class Cliente{
      void verificaCredito(){}
}

class VendaCliente{
      private static Cliente cliente;
      public void efetuaVenda(){}
      public void calculaTotal(){}
      public static void main(String[] args) {
            cliente.verificaCredito();
      }
}

Uma classe não deve saber quase nada da outra, assim garantimos um baixo acoplamento.

Bom, por hoje é só, no próximo resumo entraremos no terceito capitulo do livro da kathy Sierra.

Espero ter ajudado.....

Nenhum comentário:

Postar um comentário