Archive

Posts Tagged ‘Java’

Variável Final

Declarar uma variável com a palavra-chave final impossibilita a reutilização dessa variável depois de ele ter sido inicializada com um valor explícito. Para primitivos, isso significa que, uma vez que a variável recebeu um valor, esse valor não poderá ser alterado. Por exemplo, se voçê atribuir 10 a uma variável int x, então x vai permanecer como 10 para sempre. Isso é bem simples para primitivos, mas o que significar ter uma variável de referência marcada como final não pode jamais ser reatribuída para referir-se a um objeto diferente. Os dados do objeto podem ser modificados, mas a variável de referência não pode ser modificada. Em outras palavras, uma referência final ainda lhe permite modificar o estado do objeto ao qual se refere, mas voçê não pode modificar a variável de referência para fazê-la se referir a um objeto diferente. Decore isto: não existe objetos final, apenas referência final.

Categorias:Java, SCJP Tags:, ,

Declaranções de Arrays

Em Java, os arrays são objetos que armazenam múltiplas variáveis do mesmo tipo, ou variáveis que são todas subclasses do mesmo tipo. Os arrays podem armazenar ou primitivos ou referência a objetos, mas o próprio array será sempre um objeto no heap, mesmo se oarray for declarado com tipos primitivos. Em outras palavras não existe um array primitivo, mas voçê pode declarar um array de primitivos.

Os arrays são declarados informando-se o tipo de elemento que o array irá armazenar, seguido por colchetes em um dos lados do identificador.

Declarando um Array de Primitivos:


int [ ] key; //Colchetes antes do nome (recomendado)

int key [ ]; //Colchetes depois do nome (válido, mas menos legível)

Declarando um Array de Referência a Objetos:


Thread [ ] threads; //Recomendado

Thread threads [ ]; //Válido, mas menos legível

Podemos declarar arrays multidimensionais, que, na verdade, são arrays de arrays.

Isso pode ser feito da seguinte maneira;


String [ ] [ ] [ ] nome;

String [ ] gerente [ ];

O primeiro exemplo é um array tridimensional, e o segundo é um array bidimensional.

Variáveis Locais (Automatic/Stack/Method)

Variáveis locais são aquelas declaradas dentro de um método. Isso significa que a variável não é apenas inicializada dentro do método, mas também declarada dentro dele. Assim como a variável local inicia a sua vida dentro do método, ela também é destruída quando o método finaliza. As variáveis locais ficam sempre na pilha, e não no heap. Embora o valor da variável possa ser passado para, digamos, outro método que não armazene o valor em uma variável de instância propriamente dita só vive dentro do escopo do método.


class Teste{

    public void login(){

    int count = 10;

}

    public void loginTest(int i){

        count = i;	//Não vai compilar! Não é possível acessar

                        //count de fora do método login()

    }

}

É possível declarar uma variável local como mesmo nome que uma variável de instância. Isso é conhecido como sombreamento, como o seguinte código demonstra:


class Teste{

    int count = 9;	//declara uma variável de instância

    public void login(){

        int count = 10; //Declara uma variável loca chamada de count

        System.out.println( count );

    }

    public void count(){

        System.out.println( count );

    }

    public static void main(String[] args){

        new Teste().login();

        new Teste().count();

    }
}

O código acima produz a seguinte saída:

10
9

Variáveis de Instâncias

As variáveis de instância são definidas dentro da classe, mas fora de qualquer método, e só são inicializadasquando a classe é instânciada. As variáveis de instâncias são os campos que pertencem a cada objeto único. Por exemplo, o seguinte código define campos (variáveis de instâncias) para nome, titulo e gerente para objetos Funcionário.


class Funcionario {

    private String nome;

    private String titulo;

    private String manager;

}

Variáveis de Instâncias:

  • Podem ser marcadas como final;
  • Podem ser marcadas como transient
  • Não podem ser marcadas como abstract
  • Não podem ser marcadas como sinchronized
  • Não podem ser marcadas como strictfp
  • Não podem ser marcadas como native
  • Não podem ser marcadas como static, porque se transformaria em variável de classe.

Modificadores de acesso Variáveis X Métodos:

Variáveis locais Variáveis (não locais) Métodos
final final final
  public public
  protected protected
  private private
  static static
  transient  
  volatile abstract
    synchronized
    strictfp
    native

Intervalos de Primitivos Numéricos


Tipo Bits Bytes Intervalo Mínimo Intervalo Máximo
byte 8 1 -2 na 7 -2 na 7 – 1
short 16 2 -2 na 15 -2 na 15 – 1
int 32 4 -2 na 31 -2 na 31 – 1
long 64 8 -2 na 63 -2 na 63 – 1
float 32 4 n/d n/d
double 64 8 n/d n/d

Para tipos booleanos não há um intervalo, um booleano só pode ser true ou false.

O tipo char (um caracter), contém um só caracter Unicode de 16 bits. Embora o conjunto ASCII estendido conhecido como ISO Latin – 1 precise de apenas 8 bits (256 caracteres diferentes), é necessário um intervalo maior para representar caracteres encontrados em língueas diferentes do íngles.

Embora tanto chars quanto shorts sejam tipos de 16 bits, lembre-se de que um short usa um bit para representar o sinal, de modo que menos números positivos são aceitáveis emum short.

Tipos de variáveis

Existem dois tipos de variáveis em Java:

  • Primitivos Um primitivo pode ser de oito tipos diferentes: char, boolean, byte, short, int, long, double ou float.
  • Variáveis de referência As variáveis de referência são usadas parase referir um objeto. Uma variável de referência é declarada como sendo de um tipo específico, e esse tipo não pode ser nunca modificado. Uma variável de referência pode ser usada para refirir-se a qualquer objeto do tipo declarado, ou um subtipo do tipo declarado (um tipo compátivel).
Categorias:Java, SCJP Tags:, ,

Declaração de Construtores

Em Java, os objetos são construídos. Sempre que voçê cria um novo objeto, pelo menos um construtor é invocado. Toda classe tem um construtor, e, se voçê não criar um explicitamente, o compilador vai criar um para voçê.


class Upf{

    protected Upf( ){ }      //esse é o construtor de Upf.

    Protected void Upf( ){ } //esse é um método com um péssimo
                             //nome mas válido.

}

A principal diferença entre um construtor e um método é que construtores nunca, jamais terá um retorno. As declarações de construtores podem ter, no entanto, todos os modificadores de acesso normais, e podem usar var-arg, da mesma forma como os métodos. A outra regra importante a se entender sobre os construtores é que eles devem ter o mesmo nome que a classe no qual são declarados. Os construtores não podem ser marcados como static.

Algumas declarações de construtores válidos e inválidos:


class PassoFundo {

    //construtores válidos

    PassoFundo(  ) { }

    private PassoFundo( byte b ) { }

    PassoFundo( int x ) { }

    PassoFundo( int x, int... y ) { }

    //Inválidos

    void PassoFundo(  ) { }	//é um método

    PassoFundo2(  ) { }		//não é método nem construtor

    static PassoFundo(  ) { }	//não pode ser static

    final PassoFundo(  ) { }	//não pode ser final

    abstract PassoFundo(  ) { }	//não pode ser abstract
}
Categorias:Java, SCJP Tags:, ,