modificadores marco antonio, arquiteto de software – tjdf ma@marcoreis.net atualizado em...

Post on 17-Apr-2015

107 Views

Category:

Documents

3 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Modificadores

Marco Antonio,

Arquiteto de Software – TJDF

ma@marcoreis.net

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

top related