Atualizado para JAVA SE 8 (JDK 8)
Java
para iniciantes
Crie, compile e execute programas Java rapidamente
Herbert Schildt
O autor
O autor de best-sellers Herbert Schildt escreve incansavelmente sobre programação
há quase três décadas e é uma das principais autoridades na linguagem Java. Seus
livros de programação venderam milhões de cópias no mundo inteiro e foram tra-
duzidos para diversos idiomas. É autor de vários livros sobre Java, incluindo Java:
The Complete Reference, Herb Schildt’s Java Programming Cookbook e Swing: A
Beginner’s Guide. Ele também escreveu sobre C, C++ e C#. Embora tenha interesse
em todas as áreas da computação, seu foco principal são as linguagens de progra-
mação, incluindo compiladores, interpretadores e linguagens de controle robótico.
Também tem grande interesse na padronização de linguagens. Schildt tem gradua-
ção e pós-graduação pela Universidade de Illinois. Seu site é [Link].
O editor técnico
Dr. Danny Coward trabalhou em todas as edições da plataforma Java. Ele conduziu
a definição dos Java Servlets para a primeira versão da plataforma Java EE e para
além dela, os serviços web para a plataforma Java ME, e a estratégia e planejamento
de Java SE 7. Fundou a tecnologia JavaFX e, mais recentemente, projetou o maior
acréscimo feito ao padrão Java EE 7, a API Java WebSocket. Da codificação em Java
ao projeto de APIs com especialistas da indústria e ao trabalho por vários anos como
executivo do Java Community Process, ele adquiriu uma perspectiva singularmente
ampla de vários aspectos da tecnologia Java. Além disso, é autor de JavaWebSo-
cket Programming e de um livro ainda a ser publicado sobre Java EE. Dr. Coward
tem graduação, mestrado e doutorado em Matemática pela Universidade de Oxford.
S334j Schildt, Herbert.
Java para iniciantes : crie, compile e execute programas
Java rapidamente [recurso eletrônico] / Herbert Schildt ;
tradução: Aldir José Coelho Corrêa da Silva ; revisão
técnica: Maria Lúcia Blanck Lisbôa. – 6. ed. – Porto Alegre :
Bookman, 2015.
Editado como livro impresso em 2015.
ISBN 978-85-8260-337-6
1. Linguagem de programação - Java. I. Título.
CDU 004.438Java
Catalogação na publicação: Poliana Sanchez de Araujo – CRB 10/2094
256 Java para Iniciantes
Usando final
Mesmo com a sobreposição de métodos e a herança sendo tão poderosas e úteis,
podemos querer evitar que ocorram. Por exemplo, podemos ter uma classe que en-
capsule o controle de algum dispositivo de hardware. Além disso, essa classe pode
dar ao usuário a oportunidade de inicializar o dispositivo, fazendo uso de informa-
ções privadas. Nesse caso, não vamos querer que os usuários de nossa classe possam
sobrepor o método de inicialização. Qualquer que seja a razão, em Java, com o uso
da palavra-chave final, é fácil impedir que um método seja sobreposto ou uma classe
seja herdada.
A palavra-chave final impede a sobreposição
Para impedir que um método seja sobreposto, especifique final como modificador no
início de sua declaração. Métodos declarados como final não podem ser sobrepostos.
O fragmento a seguir ilustra final:
class A {
final void meth() {
[Link]("This is a final method.");
}
}
class B extends A {
void meth() { // ERRO! não pode sobrepor.
[Link]("Illegal!");
}
}
Já que meth( ) é declarado como final, não pode ser sobreposto em B. Se você tentar
fazê-lo, ocorrerá um erro de tempo de compilação.
A palavra-chave final impede a herança
Você pode impedir que uma classe seja herdada precedendo sua declaração com
final. A declaração de uma classe como final também declara implicitamente todos
os seus métodos como final. Como era de se esperar, é inválido declarar uma classe
como abstract e final, uma vez que uma classe abstrata é individualmente incomple-
ta e depende de suas subclasses para fornecer implementações completas.
Aqui está um exemplo de uma classe final:
final class A {
// ...
}
// A classe seguinte é inválida.
class B extends A { // ERRO! não pode criar uma subclasse de A
// ...
}
Como os comentários sugerem, é inválido B herdar A, já que A é declarada como
final.
Capítulo 7 Herança 257
Usando final com membros de dados
Além dos usos que acabei de mostrar, final também pode ser aplicada a variáveis mem-
bros para criar o que seriam constantes nomeadas. Se você preceder o nome da variável
de uma classe com final, seu valor não poderá ser alterado durante todo o tempo de vida
do programa. Certamente, você pode dar a essa variável um valor inicial. Por exemplo,
no Capítulo 6, uma classe simples de gerenciamento de erros chamada ErrorMsg foi
mostrada. Essa classe mapeava um string legível por humanos para um código de erro.
Aqui, a versão original da classe será melhorada pelo acréscimo de constantes final,
que representam os erros. Agora, em vez de passar para getErrorMsg( ) um número
como 2, você pode passar a constante int nomeada DISKERR.
// Retorna um objeto String.
class ErrorMsg {
// Códigos de erro.
final int OUTERR = 0;
final int INERR = 1; Declara constantes final.
final int DISKERR = 2;
final int INDEXERR = 3;
String msgs[] = {
"Output Error",
"Input Error",
"Disk Full",
"Index Out-Of-Bounds"
};
// Retorna a mensagem de erro.
String getErrorMsg(int i) {
if(i >=0 & i < [Link])
return msgs[i];
else
return "Invalid Error Code";
}
}
class FinalD {
public static void main(String args[]) { Usa constantes final.
ErrorMsg err = new ErrorMsg();
[Link]([Link]([Link]));
[Link]([Link]([Link]));
}
}
Observe como as constantes final são usadas em main( ). Uma vez que são membros
da classe ErrorMsg, devem ser acessadas via um objeto dessa classe. É claro que
também podem ser herdadas pelas subclasses e acessadas diretamente dentro delas.
Por uma questão estilística, muitos programadores de Java usam identificado-
res maiúsculos em constantes final, como no exemplo anterior, mas essa não é uma
regra fixa.