Me parece que a classe String da API do Java é final. Segundo li em algum lugar ela é final porque em nenhuma circunstancia pode haver duvidas sobre como ela se comportará.
Você é quem tem que saber dentro do contexto da sua aplicação que classes poderiam gerar herança e ter seu conteúdo reaproveitado, esse modificador apenas te da a possibilidade impedir que uma classe possa ser ser estendida.
Se não me engando a classe String é final, ou seja você não consegue especializa-la.
Pelo que li no SCJP, usamos a final para garantir a integridade de algum dado.
o String e final para que não possa ser extendido pois precisamos confiar no que ele faz. Só quando algum metodo, em hipotese alguma poder ser mudado usa-se o final.
Utilçiza-se final na declaração de uma classe para impedir que seja “extendida”.
A aplicação prática é quando você quer impedir no contexto do seu sistema que uma determinada classe seja especializada, mudando os seus métodos através de sobreescrita.
Com o uso do final você garante que nunca haja dúvida sobre o comportamento de uma determinada classe.
A classe String é final para impedir que se faça sobreescrita em seus métodos. Já pensou cada um implementando toUpperCase, substring, split, da maneira que quiser?
Você pode fazer isso através de suas classes, mais jamais conseguira fazer isso utilizando herança e polimorfismo sobre a classe String.
A classe String é sim final. Todas as classes wrapper para tipos primitivos também são.
Um motivo que pode servir como exemplo para você, é que o framework de segurança de Java SE precisa que os Strings são imutáveis. Se fosse possível modificar o conteúdo de um objeto String iria quebrar esse framework.
Exemplo: Quando você se conecta num servidor usando a classe Socket, é feito uma verificação com o SecurityManager para verificar se essa ação é permitido. Agora imagina um código passando o hostname como um String que mudaria seu valor de “servidorpermitido” para “servidornaopermitido” depois que o SecurityManager já tinha feito a verificação e permitido tal hostname mas antes de conectar no servidor.
Se fosse possível criar seu próprio subclasse da classe String, daria para criar Strings mutáveis.
bom um exemplo legal é o seguinte, a class String ela é final, ou seja inalterada, um exemplo para ti ajudar:
String nome = "camilo";
ai ja era, eh inalteravel essa variavel da class String, pois elas nao podem ser alteradas… devido o seguinte:
qdo vc lança isso nao memoria é gravado camilo, entao ali fica uma referencia se por acaso la na frente vc fizer outra referencia ele vai ver que ja tem uma referencia a camilo na memoria e vai apenas apontar para essa referencia e isso vai otimizar memoria, uma vantagem pq elas final… uma vez criado vc nao pode mais alterar… ela pode se tornar perdida na memoria assim:
String sobre ="lopes";
sobre+=nome;
ai vc tem adicionou nome a sobre… entao o objeto String nome = “camilo” foi perdido da memoria… mais nao foi subscrito TENHA ISSO EM MENTE, apenas está referenciando a outra variavel mais nao subscrevendo a variavel… bom ai vc ta pensando se eu fizer isso N vezes vou ter varios objetos perdidos na memoria… e isso é ruim… hehe depois que estudar a class String vc vai conhecer as classes StringBuilder que ajuda na questao objetos perdidos na memoria.
Espero ter ajudado… hehe mais isso é um exemplo de uma class q é final.
A principal função é evitar, garantir que ela não seja extendida, não seja herdada, herança. Quando você cria um metodo, uma classe, um atributo final ele termina ali. os exemplos práticos nossos colegas ja colocaram pra você.