Upload
internet
View
109
Download
3
Embed Size (px)
Citation preview
Modificadores
Marco Antonio,
Arquiteto de Software – TJDF
Atualizado em Novembro/2008
Modificadorespublic
protected
private
default
final
abstract
static
transientstrictfpsynchronizedvolatilenativeCom exceção do default, todos os demais são palavras reservadas.
publicAplicado a classes, atributos e métodos
Elementos com esse modificador podem ser utilizados em todo o sistema sem nenhuma restrição
ClassePublicapackage com.javabasico.modificadores;
public class ClassePublica {
public String variavelPublica = "Diga oi;";
}
TesteClassePublicapackage com.javabasico.modificadores.teste;
import com.javabasico.modificadores.*;
public class TesteClassePublica { public static void main(String[] args) { ClassePublica classe = new ClassePublica(); System.out.println("Valor da variável: " + classe.variavelPublica); }}
privateAplicado a variáveis e métodos
Métodos e atributos private são visíveis apenas dentro da própria classe que os definem
Nem mesmo as subclasses têm acesso a variáveis e métodos private de sua superclasse
SubClassePublicapackage com.javabasico.modificadores;
public class SubClassePublica {
private void testeDaVariavelPrivada(){
System.out.println(variavelPrivada);
}
}
Testepackage com.javabasico.modificadores.teste;
import com.javabasico.modificadores.*;
public class TesteClassePublica { public static void main(String[] args) { ClassePublica classe = new ClassePublica(); System.out.println("Valor da variável: " + classe.variavelPublica); System.out.println("Valor da variável private: " + classe.variavelPrivada); }}
protectedAplicado a métodos e atributos
Podem ser acessados pela própria classe e suas subclasses, mesmo que estejam em outros pacotes
ClassePublicapackage com.javabasico.modificadores;
public class ClassePublica {
public String variavelPublica = "Diga oi;";
private String variavelPrivada = "Diga alô";
protected String variavelProtegida = "Diga olá";
}
SubClassePublicapackage com.javabasico.modificadores;
public class SubClassePublica { private void testeDaVariavelPrivada(){ System.out.println(variavelPrivada); } private void testeDaVariavelProtegida(){ System.out.println(variavelProtegida); }}
Não é subclasse• Veja a mensagem informada pelo
compilador.
SubClassePublicapackage com.javabasico.modificadores;
public class SubClassePublica extends ClassePublica { private void testeDaVariavelPrivada() { System.out.println(variavelPrivada); }
private void testeDaVariavelProtegida() { System.out.println(variavelProtegida); }}
defaultNão é um modificador, e sim a ausência dele
Aplicado a classes, métodos e atributos
Métodos e atributos default podem ser acessados por qualquer classe que esteja no mesmo pacote
Não é uma prática incentivada
finalAplicado a classes, métodos e atributos
Classes final:Não podem ter subclasses
Métodos:Não podem ser sobrescritos
Atributos:Não podem ter seu valor modificado
ClasseFinalpackage com.javabasico.modificadores;
public final class ClasseFinal {
}
SubClasseFinalpackage com.javabasico.modificadores;
public class SubClasseFinal extends ClasseFinal {
}
Variável finalpackage com.javabasico.modificadores;
public class ClassePublica { public String variavelPublica = "Diga oi;"; private String variavelPrivada = "Diga alô"; protected String variavelProtegida = "Diga olá"; public final String variavelFinal = "Valor inalterável";}
Testepackage com.javabasico.modificadores.teste;
import com.javabasico.modificadores.*;
public class TesteClassePublica { public static void main(String[] args) { ClassePublica classe = new ClassePublica(); System.out.println("Valor da variável: " + classe.variavelPublica); // System.out.println("Valor da variável private: " + classe.variavelPrivada); classe.variavelFinal = "Novo valor"; }}
Consequências• Podemos alterar o valor de uma variável
final?• Veja novamente a mensagem do
compilador.
Método finalpackage com.javabasico.modificadores;
public class ClassePublica { public String variavelPublica = "Diga oi;"; private String variavelPrivada = "Diga alô"; protected String variavelProtegida = "Diga olá"; public final String variavelFinal = "Valor inalterável"; public final void facaAlgumaTarefa(){ System.out.println("Alguma tarefa..."); }}
Método final sobrescritopackage com.javabasico.modificadores;
public class SubClassePublica extends ClassePublica { private void testeDaVariavelPrivada() { System.out.println(variavelPrivada); }
private void testaDaVariavelProtegida() { System.out.println(variavelProtegida); } public void facaAlgumaTarefa(){ System.out.println("Não pode ser sobrescrito"); }}
abstractAplicado a classes e métodos
Métodos abstract não podem ter implementação, apenas a assinatura
Se houver ao menos um método abstract em uma classe, ela deverá ser definida como abstract
Uma classe pode ser abstract mesmo que não tenha nenhum método abstract
staticAplicado a métodos e atributos
Utilizado em classes utilitárias
Métodos e atributos static podem ser utilizados sem a necessidade de criação de objetos
São chamados de métodos/atributos da classe, não do objeto
Compartilha os valores entre todas as chamadas
Utilitário padrãopackage com.javabasico.modificadores;
public class UtilString { public String capitula(String palavra) { return Character.toUpperCase(palavra.charAt(0)) + palavra.substring(1); }}
Testepackage com.javabasico.modificadores;
public class TesteUtilString { public static void main(String[] args) { String frase = "alguma frase a ser capitulada."; UtilString utilitario = new UtilString(); System.out.println(utilitario.capitula(frase)); }}
Método do objeto• Tivemos que criar um objeto da classe
utilitária, por isso dizemos que o método é do objeto.
Método staticpackage com.javabasico.modificadores;
public class UtilString { public static String capitula(String palavra) { return Character.toUpperCase(palavra.charAt(0)) + palavra.substring(1); }}
Teste sem objetopackage com.javabasico.modificadores;
public class TesteUtilString { public static void main(String[] args) { String frase = "alguma frase a ser capitulada."; System.out.println(UtilString.capitula(frase)); }}
Método da classe• Nessa nova situação não criamos um objeto
para utilizar o método, por isso dizemos que o método é da classe (e não do objeto).
• Tudo isso em função do modificador static.
Utilitário de datapackage com.javabasico.modificadores;
import java.sql.*;import java.text.*;
public class UtilDate { /** * Retorna um objeto da classe Date apartir de uma data informada em formato * texto. * @param dataEmFormatoTexto Data em formato texto. * @param mascaraDaData Formato da data informada. * @return Data * @throws ParseException * Data inválida. */ public static Date getData(String dataEmFormatoTexto, String mascaraDaData) throws ParseException { if (dataEmFormatoTexto != null) { SimpleDateFormat formatador = new SimpleDateFormat(mascaraDaData); java.util.Date parse = formatador.parse(dataEmFormatoTexto); long horaEmMilis = parse.getTime(); return new Date(horaEmMilis); } return null; }
Cont... /** * Retorna o dia da semana referente à data passada em forma de número.<br> * Ex: Domingo=0, Segunda=1..., Sábado=6 * * @param data * Data que se deseja saber o dia da semana. * @return Dia da semana */ public static int getDiaDaSemana(Date data) { java.util.GregorianCalendar calendario = new java.util.GregorianCalendar( java.util.TimeZone.getDefault()); calendario.setTime(data); return (calendario.get(java.util.GregorianCalendar.DAY_OF_WEEK) - 1); }}
TesteDatapackage tjdf.infra.util;
import java.sql.*;import java.text.*;
public class TesteData { public static void main(String[] args) { try { Date dataSQL = UtilDate.getData("06/04/1979", "dd/MM/yyyy"); System.out.println("Data SQL: " + dataSQL); System.out.println("Dia da semana:" + UtilDate.getDiaDaSemana(dataSQL)); } catch (ParseException e) { e.printStackTrace(); } }}
transient• Aplica-se a atributos de classe.• Indica ao compilador que o atributo não
deve ser serializado.
strictfp• Indica que todas as variáveis da classe
atendem ao padrão IEE754, que é um padrão internacional que gerencia a precisão dos valores double e float.
synchronized• Sincroniza blocos de código dentro de uma
thread.• Proíbe o acesso concorrente, ou seja, só
deixa uma thread acessar o recurso de cada vez.
volatile• Aplicado a variáveis, tem a função
exatamente oposta do synchronized.• A idéia é compartilhar o valor da variável
entre todas as threads.
native• Define que a implementação do método foi
escrita em linguagem nativa, geralmente C.• Recurso altamente dependente do sistema
operacional.• Geralmente não é portável.
Dúvidas