[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 =)

[OCPJP6] 017 – Orientação a objetos

Cast

Significa conversão. Mais especificamente em Java, conversão de variável. O cast pode ocorrer em variáveis de objetos e primitivos, para este capítulo vamos ver apenas o cast em objetos. Dividido em downcast e upcast.

downcast

Em downcast a conversão da variável de referência é para baixo na herança, ou seja o cast da variável de referência pode ser declarada apenas para classes específicas, caso contrário não irá compilar. Uma das exceções mais conhecidas ClassCastException (indica que a conversão em tempo de execução está errada) pode acontecer no downcast. Vamos ver alguns exemplos:

package certificacao;
public class Homem { public void correr(){} }
public class Menino extends Homem { public void brincar(){} }

No exemplo abaixo irá ocorrer um ClassCastException em tempo de execução, porque a instância da variável de referência “homem” é Homem e não Menino. O compilador aceita o cast (downcast) porque Menino é um Homem, mas em execução “homem” não é um Menino e então ocorre o erro.

// ...
Homem homem = new Homem();
Menino menino = (Menino) homem;

No próximo exemplo ocorrerá um erro de compilação porque não existe uma herança (generalização -> especialização).

// ...
Animal animal = new Animal();
Menino menino = (Menino) animal;

upcast

Bem mais simples, o upcast é o contrário do downcast e acontece implicitamente. Vamos ver alguns exemplos:

// ...
Menino menino = new Menino();
Homem homem = menino;

Acessando métodos

Os métodos visíveis das variáveis são referentes ao tipo. Masssss nada impede de acessar um método de uma especialização. Vamos ver alguns exemplos:

// ...
Menino menino = new Menino();
Homem homem = menino;
homem.correr(); // visível
homem.brincar(); // NAO COMPILA
((Menino)homem).brincar(); // AGORA SIM =D

Comentem, estendam o assunto… Compartilhem =)