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

De classes abstratas a interfaces

No último post escrevi um pouco sobre classes abstratas, hoje irei passar alguns conceitos de interface, e também alguns exemplos.

  1. Uma interface pode ser public ou default.
  2. Todos os métodos são implicitamente public e abstract. Em outras palavras, você não precisa declarar os modificadores public e/ou abstract no método, mesmo assim ele sempre será public e abstract.
  3. Todas os atributos definidos em uma interface devem ser public, static e final. Em outras palavras, as interfaces só podem declarar constantes (variáveis de não instância).
  4. Uma interface não pode implementar uma interface ou uma classe.
  5. Uma interface pode estender uma ou mais interfaces.
  6. Uma classe que implementa uma interface deve implementar todos os métodos.

Exemplos de métodos e atributos implícitos e explícitos:

Fruta.java

package certificacao;

public interface Fruta {
    public abastract String cor(); // metodo – explicito
}

FrutaCitrica.java

package certificacao;

public interface FrutaCitrica extends Fruta {
    String vitamina = "C"; // constante – public static final
    boolean isAcida(); // metodo – public abstract implicito
}

Um adicional: Interface + Classe Abstrata

Dado uma classe que implementa uma interface e não implementa os métodos, irá ocorrer erro de compilação. Veja abaixo:

Suco.java

package certificacao;

public interface Suco {
    public abstract boolean comAcucar(); // metodo – explicito
}

SucoNatural.java

package certificacao;

public class SucoNatural implements Suco {
    // ERRO
}

Mas, e se for uma classe abstrata?

package certificacao;

public abstract class SucoNatural implements Suco {
    // OK
}

Haaaaaaa… agora compila =) Por quê? 

– O método comAcucar() só precisa ser implementado em uma subclasse de instância, por exemplo public class SucoNaturalSimplesMas, também pode ser implementado na classe SucoNatural.

Comentem, estendam o assunto… Compartilhem =)

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

Modificadores e controles de acesso em classes

As classes em Java, são compostas por variáveis e métodos. O modo como você declara -utilizando um modificador ou controle de acesso – uma classe, um método ou uma variável afeta o comportamento do código. Vejamos abaixo isso em classes:

Os modificadores se dividem em duas categorias:

  1. Modificadores de acesso: public, protected, private.
  2. Modificadores que não se referem a acesso (incluindo strictfp, final e abstract).

Os controles de acesso (nível de acesso) são classificados em quatro e são representados por três modificadores de acesso. O quarto controle de acesso – chamado de acesso default – é o que você obtém quando não usa nenhum dos três modificadores de acesso.

Dentre os quatro controladores de acesso apenas dois podem ser usados nas declarações das classes, são eles public ou default, a não ser que seja uma inner class (classe interna) que pode usar o controlador private.

Modificadores de acesso

default

Uma classe com acesso default não tem nenhum modificador na declaração. Esse é o controle que você obtém quando não declara um modificador. As classes de nível default só podem ser acessada por classes do mesmo pacote.

Exercicio.java

package certificacao;

class Exercicio { }

Prova.java

package certificacao.prova;
import certificacao.Exercicio;

class Prova extends Exercicio { }

A classe Prova.java não irá compilar porque está em pacote diferente. Para essa classe compilar seria necessário mudar o modificador de acesso para public da classe Exercicio.java ou mover uma das classes para o mesmo pacote podendo manter o modificador default.

public

Uma classe com acesso public dá acesso a todas as classes de todos os pacotes. No entanto, não esqueça de que ao utilizar uma classe public de outro pacote, você precisará importar a classe.

Modificadores que não se referem a acesso

final

Classes com o modificador final significam que não podem ser estendidas, ou seja, nenhuma outra classe pode herdar de uma classe final. Na prática, você quase nunca criará uma classe final. As classes final acabam com um benefício fundamental da programação OO – a herança. A não ser que você tenha uma série preocupação de segurança.

Exercicio.java

package certificacao;

public final class Exercicio { }

Prova.java

package certificacao.prova;

import certificacao.Exercicio;

class Prova extends Exercicio { }

Neste caso a classe Prova.java não compilaria.

abstract

Uma classe abstract não jamais pode ser instanciada. O seu único propósito/missão, é ser estendida (herdada). Classes abstract são útilizadas para deixar as coisas genéricas, comuns a suas especializações (classes que herdam dela).

Carro.java

package certificacao.automovel;

public abstract class Carro {

    private String cor;
    private String valor;
    // getters and setters
}

Bmw.java

package certificacao.automovel;

public class Bmw extends Carro {

    private Turbo turbo;
    // getters and setters
}

Neste caso uma Bmw tem tudo que um Carro tem + turbo. Pensando em uma outra especialização de Carro, poderíamos criar um Palio com tudo que um Carro tem, mas sem o turbo da Bmw rs.

Mais pra frente irei escrever um pouco sobre polimorfismo, e como as classes abstratct são importante em questões de flexibilidade e extensibilidade.

Analisando os dois casos: Não é possível ter uma classe final e abstract ao mesmo tempo. Uma anularia a outra rs =)

Comentem, estendam o assunto… Compartilhem =)