terça-feira, 24 de agosto de 2010

Resumo SCJP - Parte II


Não vou alongar demais nos dizeres, hoje continuaremos até o fim do primeiro capitulo, onde estamos falando de Declaração e Controle de Acesso.

Seguindo de onde paramos no post anterior (Primeira Parte), hoje vamos falar de:

Métodos FINAIS:
Qualquer coisa que for declarado como FINAL, não poderá, em hipótese nenhuma ser alterado, sendo assim, podemos definir que vira uma constante. No caso métodos, eles não poderão ser subscritos nas subclasses.

class Veiculo {
      public final void valor(){}
}

class Fusca extends Veiculo{
      public final void valor(){}
}
Isso não compila

Métodos ABSTRACT:
Métodos com apenas as declarações, não tem nenhuma implementação.
Quem devem implementa-los?
è A primeira classe concreta que extends a classe abstrata desse métodos
Só devem existir em uma classe abstrata.
Eles são sobrecarregados?
è Não. Eles são subscritos.
Uma classe abstrata, é obrigada a ter métodos abstratos?
è Não, uma classe pode ter um ou nenhum método abstrato. Mas se classe tiver pelo menos 1 método abstrato, ele obrigatoriamente deverá ser abstrata.

Lembrete:
Jamais use:
ABSTRACT e FINAL
ABSTRACT E PRIVATE
Métodos  Abstract  não podem ser também STATIC;
Usar Abstract apenas para Classes e Métodos, nada de variáveis.

Métodos SYNCHRONIZED:
São mais usados com Threads, para sincronia de métodos e blocos de códigos.
Pode ser usado para métodos e variáveis.

Métodos NATIVOS:
Utilizados apenas para métodos. É um modificador de acesso.

Métodos STRICTFP:
Força pontos flutuantes no padrão IEEE 754. Utilizado em métodos e classes.




Agora vamos falar de mais um recurso do java que também é bastante interessante.

VARARGS:
Este recurso permite receber inúmeros valores via parametro de um tipo que foi declarado.
Ajuda a evitar a sobrecarga de métodos.
               
class Veiculo {
     
      public void valor(int ... a){
           
      }
     
}
Acima mostramos um exemplo simples do varargs.
Uma pegadinha que pode cair no exame é que os varargs,  DEVEM SEMPRE vir por último na lista de parametros.

Alguns lembretes:
Argumento: Aquilo que é passado explicitamente: setX(10)
Paramentro: Quando é passado o tipo que pode receber: setX(int x)

Construtores:
Não tem nenhum tipo de retorno, e tem o mesmo nome da classe. São sempre chamados quando um objeto é construído.
Não podem ser STATIC, FINAL  e nem ABSTRACT.
Pode receber o PROTECTED como modificador de acesso.

Algumas atenções que merecem destaque:
class Veiculo {
      public Veiculo(String nome) {
     
      }    
}

class Fusca extends Veiculo{
      aqui chama o super(), implicitamente,logo, isso não compila.
      public static void main(String[] args) {
           
      }
}
-------------

class Veiculo {
      public Veiculo(String nome) {
     
      }    
}

class Fusca extends Veiculo{
      acho que ficou pior ainda, constructor dentro de método.
      public static void main(String[] args) {
            Fusca(){
                  super("fusca");
            }
      }
}
-----------------
class Veiculo {
      public Veiculo(String nome) {
     
      }    
}

class Fusca extends Veiculo{

      Fusca(){
            super("fusca"); //agora sim!!!!
      }
      public static void main(String[] args) {
           
      }


VARIÁVEIS:
Primitivos: int, float,double, etc. Uma vez declarado o seu tipo, jamais poderá ser modificado.

VARIÁVEIS DE REFERENCIA:
São usadas para referir a um objeto, e seu tipo não pode ser modificado.
Devemos sempre lembrar que para se referir a um objeto, o teste de   E-UM, deverá ser realizado.

class Veiculo {}

class Fusca extends Veiculo{}

Fusca É-UM Veiculo. Sendo assim, posso fazer o seguinte:
class Veiculo {}

class Fusca extends Veiculo{
      Veiculo veiculo = new Fusca();
} //Minha variável de referencia veiculo É-UM objeto FUSCA do tipo VEICULO

VARIÁVEIS DE INSTANCIA:
Ficam localizadas dentro das classes e fora dos métodos.

VARIÁVEIS TRANSIENT:
São variáveis que são ignoradas na serialização do objeto.

METODOS E VARIAVEIS STATIC:
Quando se cria variaveis deste com esta configuração, elas são usadas independente de ter uma instancia dessa classe.
É interessante lembrar que  um membro STATIC so pode acessar outro membro STATIC.

ENUMS:
Enums são um tipo especial de classes, onde seus membros são constantes .
Podem ser declarados fora ou dentro de classes.
Não podemos é criar enums dentro de métodos.
Enums são: STATIC E FINAL.

enum COR{
      PRETO, AMARELO, AZUL
}

class Veiculo {}

class Fusca extends Veiculo{
      Veiculo veiculo = new Fusca();
     
      public static void main(String[] args) {
            COR cor = COR.PRETO;
            System.out.println(cor);
      }
}
---------

class classEnum{
     
      enum Tam {
            M(10),P(20),G(30);
            Tam(int a){
                  tam = a;
            }
            private int tam;
            public int getTam() {
                  return tam;
            }
      }
     
      public static void main(String[] args) {
            Tam tam = Tam.G;
            System.out.println(tam.getTam());//imprime 30
      }
}

Bom, ficamos por aqui por hoje, em breve voltaremos com o proximo capitulo... FUNDAMENTOS.

segunda-feira, 23 de agosto de 2010

Resumo SCJP - Parte I


Resumo SCJP -  Parte I

Bom pessoal, como estou estudando para a SCJP e precisando de um grande incentivo para esta tarefa “árdua”, rsrsrs, vou colocando ao longos dos dias um resumo das matérias.
Logo,  as explicações serão bastantes objetivas. Então vamos lá....

1 - Declaração e Controle de acesso

Em java os identificadores legais só podem começar com letras, $ ou ‘.’, qualquer coisa diferente disso, o código não é compilado.  O uso de palavras reservadas também não poderá ser usado.

Convenção da Sun:  Apenas uma forma organizada de desenvolvimento, nada obriga o desenvolvedor codificar do “seu jeito”. Mas para algumas outras provas de certificações o padrão da SUN é exigido.

Declaração de Interfaces:
IPessoaService – a primeira letra maiúscula, quando o nome é composto, a segunda letra (como no exemplo) também deve ser maiúscula. O mesmo serve para as Classes ( Pessoa.java )

Declaração de Métodos:
Os métodos, devem conter a primeira letra minúscula, e caso seja um nome composto, a primeira letra do segundo nome deverá ser maiúscula. (findById();)
É interessante que suas varíaveis de instância, tenham métodos de acesso também. Por exemplo:

Private Integer idade;

Public void setIdade(Integer idade) {
                This.idade = idade;
}             
Public Integer getIdade(){
                Return this.idade;
}
Para os boleanos o devemos alterar o get por is, por exemplo:
Public Boolean isGravou(){...}

Classes
Uma class declarada como default pertence apenas ao pacote onde foi criada, não sendo possível classes de outros pacotes acessarem, mesmo que eles tenham um import.
Classes só podem ser default ou public.
Exemplo:

Package util
Class valida{}

Package service
Import util.makeAll
Class Pessoa extends valida{}     Este código não compila.
Para que consigamos acessar a classe, basta alterar o seu modificador de acesso para public.



Classes Abstratas
Classes abstratas jamais podem ser declaradas como FINAL. Ou seja: Abstract Final, não pode andar juntos.
Quando uma classe é abstratada, não é necessário ter um método abstrato, mas se uma classe concreta tiver uma método abstrato, ela obrigatoriamente deve ser abstrata.
Não é possível instanciar classes abstratas, uma boa analogia a isso é que, não podemos criar nada que não é real, ou seja algo que é abstrato, não pode ser criado.

Pegadinhas que podem cair no exame.

package estudo.Carros;

public abstract class Aviao{
      String nome = "Boing";
}

package estudo.Cliente
import estudo.Carros.Aviao;

public class Pass extends Aviao{
      public static void main(String[] args) {
            System.out.println(nome);
      }
}
Este código não compila.....
A variável nome, não foi declarada como static, e estamos tentando acesso dentro de um método Static.
Moral da História: “coisas” static, devem ser acessadas dentro de outras “coisas” static..

Dessa forma..
class Rascunho{
     
      String nome = "leandro";
}

class nada extends Rascunho{
     
      public static void main(String[] args) {
            System.out.println(nome);   //aqui dá erro de compilação
      }
     
      private void nda() {
            System.out.println(nome); //aqui funfa demais...
      }
}


Outra pegadinha que devemos ter muita atenção é a seguinte:
package estudo.Carros;

public abstract class Aviao{
      Static String nome = "Boing";
}

package estudo.Cliente
import estudo.Carros.Aviao;

public class Pass extends Aviao{
      public static void main(String[] args) {
            System.out.println(nome);
      }
}
Não compila....
Agora alteramos o modificar de acesso para Static, mas não definimos ela como public, ou seja, não está visível em outro pacote.


Interfaces
Interfaces é apeanas o contrato realizado entre as classes e a interface. Um bom exemplo para isso seria o seguinte: Uma class Ferrari, ou seja, o carro Ferrari, será o único carro com efeitos especiais nos 10 carros que vou produzir.

interface efeitos{
      void voa();
      void andaNaAgua();
}

class Ferrari implements efeitos{

      public void andaNaAgua() {}

      public void voa() {}
     
}

Interfaces são 100% abstratas, e dessa forma não pode de maneira nenhuma ter de maneira nenhuma métodos FINAL. Mas pode ter variáveis, desde que sejam constantes.
·         As constantes são public, static e final
·         As interfaces sempres são public e abstract.
·         Metodos que são implemetados da interfaces, DEVEM OBRIGATORIAMENTE, ser public, caso contrário um erro de compilação é exibido.
·         Não podemos criar interfaces com acesso default, todas são implicitamente public
·         Interfaces não são implementadas por outras, apenas as estende.
·         Não podemos implementar um classe.


  Algumas pegadinhas que podem cair no exame.
package A;
interface IEfeitos{
      void voa();
      void andaNaAgua();
}

package B;
class Ferrari implements efeitos{

      public void andaNaAgua() {
      }

      public void voa() {
      }
     
}  //Não compila...
Colocamos o acesso como default e estamos tentando acessar de outro pacote.

Modificadores de acesso

Como o próprio nome já é sugestivo, os modificadores é que controlam o nível de acesso aos membros de uma class. Podem ser:
Public, private, default e protected. E uma classe só pode ser default ou public

Public = o mundo inteiro vê. Claro, quando estamos em outros demos de importá-los.
Private = Visível apenas dentro da mesma classe. O seu saldo bancário está marcado como private...hehe.....ou pelo menos deveria.

Protected e default = São muito parecidos.
O protected é facilmente acessado de fora do pacote, desde que tenha o import e for através de herança. Ou seja, você precisa de herdar a classe que contem o método para usá-lo.
O default você não tem acesso.

O importante a saber é:
 - Variaveis marcadas como protected, não são herdadas em pacote diferentes, mas o métodos podem ser acessados.
-  Variaveis locais, não podem receber nenhum modificador, a não ser o FINAL.

Bom pessoal, a primeira parte fica por aqui, em breve (espero que amanhã) já consigo finalizar o primeiro Tema.
Espero ter ajudado.....

segunda-feira, 16 de agosto de 2010

PriorityQueue - Coleções

Este post tem o intuito de descrever um pouco de uma das coleções, conhecida com Fila.
Filas são estruturas de dados que servem/podem armazenar informações/elementos seguindo uma ordem lógica de inserção/remoção.
Em Java não existe uma interface de filas de prioridades. Porém existe a classe PriorityQueue que estende a interface Queue.
O curioso que, esta classe não segue os padrões de inserção (FIFOs), o elementos são adicionados seguindo a sua prioridade, determinado pelo objeto comparador.
- PriorityQueue.poll() = retorna sempre o menor elemento(de acordo com o comparador )
- Aceita valores duplicados.
- Não usar o comparador com objetos não classificáveis gera excessão ao tentar adicionar elementos.

Exemplo:
PriorityQueue pq = new PriorityQueue();
pq.add("carrot");
pq.add("appel");
pq.add("banana");

System.out.println(pq.poll() + " - " + pq.peek());

Resultado: appel - banana