[OCPJP6] 018 – Orientação a objetos

static

Dando continuidade ao post [011], métodos e variáveis static podem ser acessados a partir de uma classes não instanciada (new). Mas isso não impede que métodos ou variáveis static seja acessado por uma instância. Resumindo, métodos e variáveis static são compartilhados sem a necessidade de instância da sua classe de declaração.

Pontos importantes

  • Não existe sobrescrita de método static.
  • Dentro de um método static não é possível acessar métodos e variáveis não static.
  • Tanto métodos como variáveis static não podem ser acessados pela internamente como “this.”, se uma classe Automovel tiver uma variável tipo static, internamente ela poderia ser acessada Automovel.tipo e não this.tipo. Não compilaria porque this represeta a instância da classe.
  • Variáveis não static não podem receber (=) variáveis static.

Exemplos

package certificacao;
public class Automovel {
    public static void ligar() {
        System.out.println("Automovel..."); } }

public class Carro extends Automovel {
    public static void ligar() {
        System.out.println("Carro..."); } }

public class Main {
    public static void main(String[] args) {
        Automovel a = new Carro();
        a.ligar();
    }
}

Analisando o código acima, qual seria o resultado esperado?

  • Automovel…
  • Carro…

A resposta correta é “Automovel…” porque o método ligar() não referência uma instância. Se o método não fosse static, teriamos um exemplo de polimorfismo e obteríamos o resultado “Carro…”. A melhor forma de acessar o método ligar() sem ter dúvidas é: Automovel.ligar() ou Carro.ligar().

package certificacao;
public class Main {
    public static int count = 0;
    public Main() { count += 1; }

    public static void main(String[] args) {
        Main m = new Main(); // 1a instancia
        m = new Main(); // 2a instancia
        m = new Main(); // 3a instancia
        System.out.println(Main.count);
    }
}

Analisando o código acima, qual seria o resultado esperado?

O resultado será 3, porque a variável static count está compartilhada para qualquer instância.

Comentem, estendam o assunto… Compartilhem =)

Anúncios

[OCPJP6] 011 – Declarações e controle de acesso

Finalizando declarações e controle de acesso

transient

O modificador transient só pode ser aplicado a variáveis. Ao marcar uma variável como transient indicamos a máquina virtual do Java que ignore-a na serialização. (Serialização significa gravar um objeto e seu estado em um tipo de stream, exemplificando, é possível salvar um objeto em um arquivo. Comenterai mais pra frente sobre serialização.)

// ...
private transient int posicaoX;

volatile

Basicamente volatile é usada para indicar que o valor da variável poderá ser modificada por diferentes threads. Tudo que precisamos saber para a certificação sobre este modificador é de que só pode ser aplicado a variáveis.

static “conceitos básicos”

Onde é possível usar?

  • métodos
  • variáveis
  • inner class
  • blocos de inicialização
public class CalculadoraUtil {

    // variaveis
    public static Integer UM = 1;
    public static Integer DOIS;

    // blocos de inicializacao
    static {
        DOIS = 2;
    }

    // metodos
    public static Double soma(Double... numeros) {
        Double result = Double.valueOf(0);
        for (Double d : numeros) {
            result = result + d;
        }
        return result;
    }

    // inner class
    static class Formula { }
}

Mais pra frente irei dedicar um post só para static =D

Comentem, estendam o assunto… Compartilhem =)