FINAL
Não Herdada // Não Sobrescrito

A classe não pode ser herdada ou estendida por outra classe, e nenhum de seus métodos poderão ser sobrescritos.
Obs: a palavra-chave final pode ser combinada com qualquer modificador de acesso, ou seja, uma classe pode ter acesso default ou público e ser também marcada como final.


package bebida;
public final class Refrigerante{  
//pública e final          
}

package bebida.brasil;
import bebida.Refrigerante;
/* erro de compilação - a classe Coca não pode herdar
 * de Refrigerante pq esta está marcada como final */
public class Coca extends Refrigerante { 
}


Classe final: impede que a classe seja herdada.
Método final: impede um método de ser sobrescrito em uma subclasse.

Argumento final: valor não poderá ser modificado dentro do método.

Nesse caso, “modificado” significa a retribuição de um novo valor à variável, ou seja, o argumento final deve manter o mesmo valor que o parâmetro tinha quando foi passado para o método até o final.

public class Argumentos {
      public void setArg(String obj1,
                         final String obj2) {
            String obj3 = new String();
            obj1 = obj3;
            /* erro, argumentos final não podem ter
             * um novo valor reatribuído */
            obj2 = new String();
            /* erro, argumentos final não podem ser
             * modificados */
            obj2 = obj3;          
      } 
}



Os modificadores de acesso definem o escopo de visibilidade da classe, ou seja, servem para restringir ou permitir o acesso a uma classe. 
Acesso= Visiabilidade



Acesso padrão ou default: Não possui modificador.
Esse é o chamado acesso em nível de pacote, pois classes com esse tipo de acesso só podem ser vistas (acessadas) por classes de dentro do mesmo pacote em que estão declaradas.
Por exemplo, criando duas classes com acesso padrão e as colocarmos em pacotes diferentes, uma não poderá enxergar a outra; ou seja, uma classe não poderá herdar ou criar instâncias da outra classe, ou até mesmo declarar um retorno ou uma variável com o tipo da outra classe.

Acesso public: Acesso público, permitindo que todas as classes de todos os pacotes a vejam e acessem.

Por exemplo, se duas classes possuem acesso público, uma poderá criar instâncias, herdar, declarar uma variável ou um retorno com o tipo da outra classe.

Exemplo de acessos default e público:


package bebida;
public class Bebida_alcoolica {  // acesso público
/* erro de compilação Bebida_alcoolica não tem acesso a classe Caipirinha porque estão em pacotes diferentes e Caipirinha possui acesso default */
Caipirinha c = new Caipirinha();
}

package bebida.brasil;
import bebida.Bebida_alcoolica;
class Caipirinha {  // acesso default
/* possui acesso a classe Bebida_alcoolica, mesmo em pacotes diferentes, porque Bebida_alcoolica possui acesso público */
Bebida_alcoolica b = new Bebida_alcoolica();
}


Classe Private: Métodos e variáveis marcadas como private só podem ser acessados pela classe na qual foram declarados;  outras classes não acessam membros privados nem por herança, nem por instância.

Membros protected: Pode ser acessado por classes do mesmo pacote por meio da instanciação, e acessado por classes de outros pacotes através de herança.
Obs: membros padrão e protected diferem apenas quando se trata de subclasses.

Enfim, protected acessa mesma classe, mesmo pacote por subclasse e não subclasse e pacote diferente pela subclasse.