JavaFreee - Certificação - Cap2 - Modificadores

download JavaFreee - Certificação - Cap2 - Modificadores

of 13

Transcript of JavaFreee - Certificação - Cap2 - Modificadores

  • 8/14/2019 JavaFreee - Certificao - Cap2 - Modificadores

    1/13

    Captulo 2 - Modificadores e Controle de Acesso

    Como em todas as linguagens de programao, a acessibilidade a uma classe/mtodo deve seguir algumas regras, e de extrema necessidade que voc as saiba para novacilar na hora do exame!

    Modificadores

    public

    private

    protected

    abstract

    static

    final

    transient

    strictfp

    synchronized

    volative

    native

    padro

    LEMBRE-SE: com exceo do modificador PADRO, todas as demais so palavras chaves em Java.

    1 - MODIFICADORES PARA CLASSES:

    1.1 - padro

    Um modificador de acesso determina como ser a visibilidade de uma classe/mtodo a partir de outras classes ou mtodos.

    Dado o arquivo Car.java:

    Observe que no foi definido nenhum modificador para a classe, portanto o modificador de acesso nesse caso padro (default ou friendly)! O modificador padro defineque a classe s poder ser acessada por outra classes dentro do mesmo pacote. Uma tentativa de acesso a classe Car a partir de uma classe de outro pacote resultar emum erro de compilao.

    Dada as classes:

    Observe que na classe Oficina houve uma tentativa de acesso por herana, mas como a classe Car tem acesso padro e a classe Oficina est em um pacote diferente dopacote da classe Car, causou erro de compilao. Semelhantemente o erro ocorreu na classe Conserto, apesar de que a forma de tentativa de acesso classe Car foi atravsde referencia. Agora observe:

    Observe que uma classe com modificar padro pode ser acessada somente por classes/mtodos do mesmo pacote.

    1.2 - public

    O modificador public o mais liberal, ou seja, faz com que a classe possa ser acessada por qualquer classe independente de estarem ou no no mesmo pacote.

    view plain copy to cl ipboard print ?

    1. class Car {2. // cdigo da classe3. }

    view plain copy to cl ipboard print ?

    1. Car.java2. package carros;3. class Car { ... }4. 5. Oficina.java6. package oficina;7. import carros.*;8. class Oficina extends Car { ... } // Erro de compilao9.

    10. Conserto.java11. package conserto;12. import carros.*;13. class Conserto {14. publicstaticvoid main(String[] args) {15. Car c = new Car(); // Erro de compilacao16. }17. }

    view plain copy to cl ipboard print ?

    1. Car.java2. package carros;3. class Car { ... }4. 5. Oficina.java6. package carros;7. class Oficina extends Car { ... } // ok8. 9. Conserto.java

    10. package carros;11. class Conserto {12. publicstaticvoid main(String[] args) {13. Car c = new Car(); // ok14. }15. }

    Page 1 of 13Cap. 2 - Modificadores :: Java Free.org

    2/7/2008http://www.javafree.org/javabb/viewtopic.jbb?t=6941&Cap-2--Modificadores

  • 8/14/2019 JavaFreee - Certificao - Cap2 - Modificadores

    2/13

    Observe que a classe Car publica e visvel por qualquer classe, portanto muito cuidado ao definir uma classe como pblica, pode cair na vista do inimigo.

    1) O que acontecer com o seguinte cdigo:

    a) Mostrar: A cor e yellowb) Erro de compilaoc) Exceo na hora da execuod) Mostrar: A cor e nulle) Mostrar: A cor e

    [color=green:0fc8cb2b92]Resposta no final do captulo !!![/color:0fc8cb2b92]

    Caso vc tenha errado, no se preocupe, pois os modificadores aplicados a membros sero discutidos posteriormente.

    1.3 - abstract

    Uma classe definida como abstract no permite criar instncias dessa classe, ou seja, no podemos ter objetos de uma classe abstrata. O modificador abstract aplica omesmo conceito de abstrao que conhecemos no mundo real, ou seja, parta do pressuposto que uma classe abstrata no sabe qual seja o seu "inteiro" comportamento.Voc deve estar se perguntando, por que ento eu usaria uma classe abstrata se no posso instanci-la ? Esse e um recurso interessantssimo das linguagens orientadas aobjetos, a extensibilidade, voc pode definir uma classe Car com comportamentos (mtodos) abstratos e deixar que as subclasses definam esses comportamentos de formadiferente, mesmo porque a forma de acelerao de um Mazda RX7 bem diferente de um Fusca 1300 (putz que comparao mais esdrxula!)

    [color=red:0fc8cb2b92]Erro de compilao: // carros.Car is abstract; cannot be instantiated [/color:0fc8cb2b92]

    No se preocupe se voc ver uma declarao: abstract public class CarNo erro de sintaxe colocar o modificar abstract antes do public.

    Podemos concluir que uma classe abstrata no est pronta para ser usada como uma classe concreta, ou seja, ainda no sabe "coisas" sobre a classe, que muitoprovavelmento ser implementado em subclasses (a no ser que algum programador resolva criar uma classe abstrata e no us-la - puro capricho!)

    1.3 - final

    Um classe final no permite que se tenha subclasses, ou seja, no se pode aplicar a herana em uma classe que seja final. Novamente voc como curioso quer saberporque usaria uma classe final ? Pense em um contexto que se tenha uma classe "perfeita" que faz tudo exatamente como voc definiu, e no precise que sua classe sejaherdada por ningum, para evitar que Programadores Juniores faam cacas !!! Tem mais um detalhe tcnico mais importante que o citado anteriormente: uma classe final, mais rpida que classes no final, isso porque a mquina virtual sabe que no haver nenhuma herana (nem pelos prprios caras da Sun) por isso o processo deexecuo mais rpido. Um exemplo disso a classe String ! Porque deveramos mexer nessa classe ? Se voc ja achou alguma implementao para ela, mande seucurrculo para a Sun, o endereo : [email protected] (no sei porque est em portugus, sendo que so americanos):

    view plain copy to cl ipboard print ?

    1. Car.java2. package carros;3. publicclass Car {4. String getColor() {5. return"yellow";6. }7. }8. 9. Oficina.java

    10. package oficina;11. import carros.*;

    12. publicclass Oficina {13. publicstaticvoid main(String[] args) {14. Car c = new Car(); // ok15. }

    16. }

    view plain copy to cl ipboard print ?

    1. Car.java2. package carros;3. publicclass Car {

    4. String getColor() {5. return"yellow";6. }

    7. }8. 9. Oficina.java

    10. package oficina;11. import carros.*;

    12. publicclass Oficina {13. publicstaticvoid main(String[] args) {14. Car c = new Car();15. System.out.println("A cor e "+c.getColor());

    16. }17. }

    view plain copy to cl ipboard print ?

    1. Car.java2. package carros;3. publicabstractclass Car { ... }4. 5. Oficina.java6. package carros;7. publicclass Oficina {8. publicstaticvoid main(String[] args) {9. Car c = new Car(); // Erro de compilao

    10. }11. }

    Page 2 of 13Cap. 2 - Modificadores :: Java Free.org

    2/7/2008http://www.javafree.org/javabb/viewtopic.jbb?t=6941&Cap-2--Modificadores

  • 8/14/2019 JavaFreee - Certificao - Cap2 - Modificadores

    3/13

    [color=red:0fc8cb2b92]Erro de compilao: cannot inherit from final carros.Car[/color:0fc8cb2b92]

    Se voc um cara esperto, j deve ter percebido que o modificador final no deve ser usado com o modificador abstract, visto porque no faz sentido temos uma classefinal e abstrata ! Como faramos a herana sendo que a classe final !

    [color=red:0fc8cb2b92]Erro de compilao: illegal combination of modifiers: abstract and final[/color:0fc8cb2b92]

    1.4 - strictfp

    Define que membros/variveis da classe sigam as normas do padro IEE754 de ponto flutuante. Se voc no tiver o que fazer, poder estudar esse padro, mas saiba quepara o exame no ser necessrio saber nada sobre o padro, simplesmente o que o modificador faz. Como seu escopo a classe, todos os mtodos seguiram o mesmopadro. Voc tambem poder definir esse modificador para um mtodo especifico, mas isso ser discutido posteriormente.

    Todos os mtodos seguiram o padro IEE754

    2 - MODIFICADORES PARA MTODOS:

    2.1 - padro

    No ser necessrio falar muito, pois semelhante ao conceito de classe, ou seja, um mtodo definido como padro s poder ser acessado por classes dentro do mesmopacote.

    Nenhum problema de acesso pois as classes esto no mesmo pacote

    Se definirmos a classe Oficina da seguinte forma:

    [color=red:0fc8cb2b92]Erro de compilao: getColor() is not public in carros.Car; cannot be accessed from outside package [/color:0fc8cb2b92]

    2.2 - public

    Um mtodo pblico pode ser acessado por qualquer classe em qualquer pacote. bvio que o acesso a um mtodo s permitido se voc tiver primeiro acesso classe,portanto uma tentativa de acesso a um mtodo pblico de uma classe com acesso padro no ser possvel a classes pertencentes a pacotes diferentes da classe que estse desejando o acesso! Se ficou confuso, no se preocupe, vai piorar !!

    view plain copy to cl ipboard print ?

    1. Car.java2. package carros;3. publicfinalclass Car { ... }4. 5. Oficina.java6. package carros;7. publicclass Oficina extends Car { // erro de compilao8. publicstaticvoid main(String[] args) {9. Car c = new Car();

    10. }

    11. }

    view plain copy to cl ipboard print ?

    1. Car.java2. package carros;3. publicabstractfinalclass Car { ... } // erro de compilao

    view plain copy to cl ipboard print ?

    1. Car.java2. package carros;3. publicstrictfpclass Car { ... } // ok

    view plain copy to cl ipboard print ?

    1. Car.java2. package carros;3. publicclass Car {4. String getColor() { mtodo com acesso padro5. return"red";6. }7. }8. 9. Oficina.java

    10. package carros;11. publicclass Oficina {12. publicstaticvoid main(String[] args) {13. Car c = new Car();14. System.out.println("a cor do carro e "+c.getColor()); // ok15. }16. }

    view plain copy to cl ipboard print ?

    1. package oficina;2. import carros.*;3. publicclass Oficina {4. publicstaticvoid main(String[] args) {5. Car c = new Car();6. System.out.println("a cor do carro e "+c.getColor()); // erro de compilao7. }8. }

    Page 3 of 13Cap. 2 - Modificadores :: Java Free.org

    2/7/2008http://www.javafree.org/javabb/viewtopic.jbb?t=6941&Cap-2--Modificadores

  • 8/14/2019 JavaFreee - Certificao - Cap2 - Modificadores

    4/13

    [color=red:0fc8cb2b92]Erro de compilao: carros.Car is not public in carros; cannot be accessed from outside package[/color:0fc8cb2b92]

    Portanto, mesmo que o mtodo seja pblico (como o caso de getColor()), a classe (nesse caso Car) tambm dever ser visvel ao mtodo que est chamando !

    2.3 - private

    Um mtodo private restringe o acesso do mtodo somente classe que o definiu, ou seja, um mtodo privado s poder ser acesso dentro da classe que o definiu e ponto

    final!

    Nota 1: O mtodo foi definido como privateNota 2: O acesso ao mtodo getColor est sendo feito dentro da prpria classe. Isso no ocasiona erro de compilao!Nota 3: Uma tentativa de acesso a um mtodo private - erro de compilao!Nota 4: Acesso a um mtodo pblico que acesso um mtodo private, funciona como uma interface entre o mtodo getColor e a classe Oficina, isso perfeitamente possvel.

    Esse modificador o mais restringvel, os inimigos tremem quando ele usado!

    2.4 - protected

    Ele um pouco mais liberal que o modificador padro, pois ele permite que um mtodo de uma classe X definida em um pacote PX possa ser acessado por uma classe Y deum pacote PY desde que a classe Y estenda da classe X ( que confuso !!!) No esquenta isso bem fcil!

    Nota 1: O mtodo foi definido com protectedNota 2: A classe Oficina estende de Car - por isso os mtodos protegidos podem ser acessados.Nota 3: O mtodo est sendo acessado por herana, mesmo que a classe Oficina esteja definido em pacotes diferentes!

    Observe agora:

    view plain copy to cl ipboard print ?

    1. Car.java2. package carros;3. class Car {4. public String getColor() {5. return"red";6. }7. }8. 9. Oficina.java

    10. package oficina;11. import carros.*;12. class Oficina {13. publicstaticvoid main(String[] args) {14. Car c = new Car();

    15. System.out.println("a cor e "+c.getColor()); // erro de compilao16. }17. }

    view plain copy to cl ipboard print ?

    1. Car.java2. package carros;3. class Car {4. private String getColor() { // Nota 1

    5. return"red";6. }7. 8. publicvoid imprimirCor() {

    9. System.out.println( "a cor do carro e " +getColor()); // Nota 210. }11. }12.

    13. Oficina.java14. package carros;15. class Oficina {16. publicstaticvoid main(String[] args) {

    17. Car c = new Car();18. System.out.println("a cor e "+c.getColor()); // Nota 319. c.imprimirCor(); // Nota 420. }

    21. }

    view plain copy to cl ipboard print ?

    1. Car.java

    2. package carros;3. publicclass Car {

    4. protected String getColor() { // Nota 15. return"red";6. }7. }

    8. 9. Oficina.java

    10. package oficina;11. import carros.*;

    12. class Oficina extends Car { // Nota 213. publicvoid imprimirCor() {14. System.out.println("a cor e "+getColor()); // Nota 315. }16. }

    Page 4 of 13Cap. 2 - Modificadores :: Java Free.org

    2/7/2008http://www.javafree.org/javabb/viewtopic.jbb?t=6941&Cap-2--Modificadores

  • 8/14/2019 JavaFreee - Certificao - Cap2 - Modificadores

    5/13

    Nota 1: A classe Oficina no estende de nenhuma superclasse.Nota 2: H um tentativa de acesso por referncia ao mtodo getColor que protegido, o que causar um erro de compilao: [color=red:0fc8cb2b92]getColor()hasprotected access in carros.Car[/color:0fc8cb2b92]

    Uma classe que herda um mtodo protegido torna-o private para suas subclasses. Complicou ?

    Nota 1: O mtodo pode ser acesso, pois herda de uma classe que o definiu como protegido.Nota 2: Erro de compilao, nessa hierarquia, o direito de acesso da classe Passeio ao mtodo protegido da classe Car, no outorgado a classe Mazda pois essa herda dePasseio, ou seja, um mtodo protected se torna private para suas subclasses quando h herana, no permitindo que as subclasses de Passeio herdem os mtodosprotegidos que herdou.

    2.5 - abstract

    Um mtodo abstrato no implementa nenhuma funcionalidade, somente assina o mtodo e faz com que a primeira subclasse concreta seja obrigada a implementar omtodo. Uma classe que possua um mtodo abstrato deve obrigatoriamente ser abstrata!

    Nota 1: A classe Car tambm teve que ser definida com abstract, uma vez que uma classe contenha um mtodo abstractNota 2: A definio de um mtodo abstrato no pode ter implementao, veja que nem as chaves foram colocadas, e assim que deve ser!Nota 3: A classe Oficina uma classe concreta (no abstrata) portanto deve implementar todos os mtodos abstratos da sua superclasse, se no fizer, o compiladorinsultar o programador, melhor no brincar!

    Erros comuns

    1 - Tentar implementar um mtodo abstrato:

    view plain copy to cl ipboard print ?

    1. Car.java2. package carros;3. publicclass Car {4. protected String getColor() {5. return"red";6. }7. }8. 9. Oficina.java

    10. package oficina;11. import carros.*;12. class Oficina { // Nota 113. publicvoid imprimirCor() {14. Car c = new Car();15. System.out.println("a cor e "+c.getColor()); // Nota 216. }17. }

    view plain copy to cl ipboard print ?

    1. Car.java2. package carros;

    3. publicclass Car {4. protected String getColor() {

    5. return"red";6. }7. }8.

    9. Passeio.java10. package passeio;11. import carros.*;12. class Passeio extends Car {

    13. publicvoid imprimirCor() {14. System.out.println("a cor e "+getColor()); // Nota 115. }16. }

    view plain copy to cl ipboard print ?

    1. Mazda.java2. package esportivo;3. import carros.*;4. class Mazda extends Passeio {

    5. publicvoid mostrarCor() {6. System.out.println("a cor e "+getColor()); // Nota 27. }8. }

    view plain copy to cl ipboard print ?

    1. Car.java

    2. package carros;3. publicabstractclass Car { // Nota 14. publicabstract String getColor(); // Nota 25. }6.

    7. Oficina.java8. package oficina;9. import carros.*;

    10. publicclass Oficina extends Car { // Nota 3

    11. public String getColor() {12. return"red";13. }14. }

    Page 5 of 13Cap. 2 - Modificadores :: Java Free.org

    2/7/2008http://www.javafree.org/javabb/viewtopic.jbb?t=6941&Cap-2--Modificadores

  • 8/14/2019 JavaFreee - Certificao - Cap2 - Modificadores

    6/13

    [color=red:0fc8cb2b92]Erro de compilao: abstract methods cannot have a body[/color:0fc8cb2b92]

    LEMBRE-SE: Um mtodo abstrato deve terminar com ";" e no ter as chaves !

    No definir a classe como abstrata

    [color=red:0fc8cb2b92]Erro de compilao: carros.Car should be declared abstract; it does not define getColor() in carros.Car[/color:0fc8cb2b92]

    No implementar os mtodos abstratos na primeira subclasse concreta

    Nota 1: A classe Passeio estende de Car (classe abstrata) por isso, deve implementar todos os mtodos abstratos, o que no est acontecendo, se tertarmos compilar essa

    classe: carros.Passeio should be declared abstract; it does not define getSize() in carros.CarNota 2: O mtodo foi implementado.

    A regra simples: todos os mtodos abstratos devem ser implementados na primeira subclasse concreta, se definssemos a classe Passeio como abstract no caso anterior,no teria problemas de compilao, pois o mtodo abstratos (getSize, getColor) no precisavam ser implementados na classe Passeio e sim na primeira subclasse concreta.O modificador abstract no pode ser conjugado com modificador private, visto porque um mtodo abstrato deve ser implementado em uma subclasse e um mtodo privateno visvel a nenhuma outra classe.

    2.6 - final

    Um mtodo final define que no pode ser sobreposto, estudaremos mais afundo o que sobreposio de mtodos no captulo 8.

    Nota 1: Mtodo definido com final no pode ser sobreposto.Nota 2: Tentativa de sobrepor um mtodo final - o que ocasiona um erro de compilao: [color=red:0fc8cb2b92]getColor() in carros.Mazda cannot override getColor()incarros.Car; overridden method is final[/color:0fc8cb2b92]

    2.7 - static

    Um mtodo esttico define que esse pode ser executado ser que exista uma instncia da classe - um objeto. Voc s deve us-lo se tiver certeza do que est fazendo.

    view plain copy to cl ipboard print ?

    1. Car.java2. package carros;3. publicabstractclass Car {4. publicabstract String getColor() { ... } // Erro5. }

    view plain copy to cl ipboard print ?

    1. Car.java2. package carros;3. publicclass Car {4. publicabstract String getColor(); // Nota 15. }

    view plain copy to cl ipboard print ?

    1. Car.java2. package carros;3. publicabstractclass Car {4. publicabstract String getColor();5. publicabstract String getSize();6. publicdouble getPrice() {7. return24000.00;

    8. }9. }

    10. 11. Passeio.java

    12. package carros;13. publicclass Passeio extends Car { // Nota 114. public String getColor() { // Nota 215. return"red";

    16. }

    view plain copy to cl ipboard print ?

    1. Car.java2. package carros;3. publicclass Car {4. publicfinal String getColor() { // Nota 15. return"red";6. }7. }8. 9. class Mazda extends Car {

    10. public String getColor() { // Nota 211. return"yellow";12. }13. }

    view plain copy to cl ipboard print ?

    1. Car.java

    2. package carros;3. publicclass Car {4. publicstatic String getColor() { // Nota 15. return"red";6. }7. }

    Page 6 of 13Cap. 2 - Modificadores :: Java Free.org

    2/7/2008http://www.javafree.org/javabb/viewtopic.jbb?t=6941&Cap-2--Modificadores

  • 8/14/2019 JavaFreee - Certificao - Cap2 - Modificadores

    7/13

    Nota 1: Mtodo definido com static, no h necessidade de um objeto para acess-lo.Nota 2: Note que no foi preciso criar um objeto para acessar o mtodo getColor

    2.8 - native

    Define que a implementao do mtodo foi escrita em uma linguagem nativa com por exemplo C ou C++.

    2.9 - strictfp

    Define que os valores de ponto flutuante do mtodo devem seguir o padro I33754, no se preocupe com esse padro agora - saiba somente o que o modificar faz.

    2.10 - synchronized

    Faz com o mtodo seja acessado por uma thread de cada vez, esse estudo ser discutido no captulo 9, ou seja, quando um mtodo sincronizado estiver sendo executadopor uma thread as demais devero aguardar para iniciar a sua execuo.

    3 - Modificadores para variveis de instncia:

    Apesar de muitos acharem que atributos, varivel de instncia e propriedades so as mesmas coisas, gostaria de deixar bem claro que existem diferenas sutis, mas queno sero relevantes nesse estudo. Por conveno chameremos de varivel de instncia por achar que o termo mais correto que define esse conceito.

    3.1 - padro

    Segue as mesmas regras de um mtodo, ou seja, o acesso s permitido a classes dentro do mesmo pacote.

    Nota 1: No foi definido nenhum modificado, portanto assume o modificador padroNota 2: Acesso a varivel de instncia (VI) de uma classe dentro do mesmo pacote

    Observe agora:

    Nota 1: No foi definido nenhum modificado, portanto assume o modificador padroNota 2: Acesso no permitido para classes de pacotes diferentes. Erro de compilao: [color=red:0fc8cb2b92]preco is not public in carros.Car; cannot be accessed fromoutside package[/color:0fc8cb2b92]

    3.2 - public

    O acesso a uma varivel de instncia pblica, segue as mesmas regras de um mtodo. S uma dica ( sem nenhum nus) cuidado ao definir um VI pblica, pois com isso

    voc estar liberando o acesso a todo o mundo, e isso pode enfraquecer sua classe, essa deciso deve ser bem estudada, e no podemos esquecer do encapsulamento.dentro do mesmo pacote.

    view plain copy to cl ipboard print ?

    1. Oficina.java

    2. package oficina;3. import carros.*;4. class Oficina {5. publicstaticvoid main(String[] args) {

    6. System.out.println("a cor e "+Car.getColor()); // Nota 2

    7. }8. }

    view plain copy to cl ipboard print ?

    1. Car.java2. package carros;3. publicclass Car {4. double preco; // Nota 15. }6. 7. Oficina.java

    8. package carros;9. class Oficina {

    10. publicstaticvoid main(String[] args) {11. Car c = new Car();12. c.preco = 13990.00; // Nota 213. }14. }

    view plain copy to cl ipboard print ?

    1. Car.java2. package carros;3. publicclass Car {4. double preco; // Nota 15. }

    6. 7. Oficina.java8. package oficina;9. import carros.*;

    10. class Oficina {11. publicstaticvoid main(String[] args) {12. Car c = new Car();13. c.preco = 13990.00; // Nota 214. }15. }

    Page 7 of 13Cap. 2 - Modificadores :: Java Free.org

    2/7/2008http://www.javafree.org/javabb/viewtopic.jbb?t=6941&Cap-2--Modificadores

  • 8/14/2019 JavaFreee - Certificao - Cap2 - Modificadores

    8/13

    Nota 1: Varivel definida como pblica, todo mundo pode acessar.Nota 2: Acesso a uma VI pblica, compilao sem nenhum contratempo.

    3.3 - private

    Um varivel private restringe o acesso somente a prpria classe, o modificador que mais limita o acesso a um membro de classe.

    Nota 1: Varivel definida como private, acesso somente dentro da prpria classeNota 2: Tentativa de acesso a uma membro privado, erro de compilao: [color=red:0fc8cb2b92]endereco has private access in carros.Oficina[/color:0fc8cb2b92]

    O modificador private usado para proteger uma classe do acesso direito a seus membros, com isso podemos garantir uma classe bem segura, e deve ser usado paraimplementao do conceito: encapsulamento.

    3.4 - protected

    Semelhante aos mtodos protegidos, uma varivel de instncia com esse modificador, limita o acesso subclasses para classes de outros pacotes.

    Nota 1: Membro protegido, pode ser acessador por uma subclasse, ou seja, herana.Nota 2: Acesso ao membro herdado, apesar da classe Diretor estar em outro pacote, note que nome foi definido como protected.

    Vamos mudar um pouco a classe Diretor (definida logo acima) para:

    Nota 1: Se tentarmos compilar a classe Diretor o compilador mostrar a mensagem: nome has protected access in p1.Pessoa

    3.5 - final

    Uma varivel de instncia do tipo final usada para armazenar valores constantes que no sero e nem podem ser alterados (caso algum resolva cair em tentao)durante o escopo de utilizao da classe.Voc deve estar se perguntando, porque usar variveis que nunca sero alteradas ? E se no meio do contexto da classe eu precisar alterar o valor de uma variavel final ?ESQUEA !! Uma vez inicializada uma varivel com esse modificador nunca mais poder ser alterada. Imagine que voc tenha uma classe chamada Pessoa e resolvaarbitrariamente definir uma altura e peso ideal - para qualquer pessoa os valores so idnticos e no podem ser alterados, pronto, ta uma utilizao para uma varivel final.

    view plain copy to cl ipboard print ?

    1. Car.java2. package carros;3. publicclass Car {4. publicdouble preco; // Nota 15. }6. 7. Oficina.java8. package oficina;9. import carros.*;

    10. class Oficina {

    11. publicstaticvoid main(String[] args) {12. Car c = new Car();13. c.preco = 13990.00; // Nota 214. }

    15. }

    view plain copy to cl ipboard print ?

    1. Car.java2. package carros;3. class Oficina {4. private String endereco; // Nota 1

    5. }6. 7. publicclass Car {8. publicstaticvoid main(String[] args) {9. Oficina o = new Oficina();

    10. System.out.println("o endereco "+o.endereco); // Nota 211. }12. }

    view plain copy to cl ipboard print ?

    1. Pessoa.java2. package p1;3. publicclass Pessoa {4. protected String nome = "Kuesley"; // nota 1

    5. }6. 7. Diretor.java8. package p2;

    9. import p1.*;10. publicclass Diretor extends Pessoa { // subclasse de Pessoa11. public String getNome() {12. return nome; // nota 2

    13. }14. }

    view plain copy to cl ipboard print ?

    1. Diretor.java2. package p2;3. import p1.*;

    4. publicclass Diretor { // classe sem herana5. public String getNome() {6. Pessoa p = new Pessoa();7. return p.nome; // nota 1

    8. }9. }

    Page 8 of 13Cap. 2 - Modificadores :: Java Free.org

    2/7/2008http://www.javafree.org/javabb/viewtopic.jbb?t=6941&Cap-2--Modificadores

  • 8/14/2019 JavaFreee - Certificao - Cap2 - Modificadores

    9/13

    Talvez no tenha sido muito feliz no exemplo, mas vamos v-lo na prtica.

    Como os valores de ALTURA_IDEAL_CM e PESO_IDEAL_KG so finais, voc poder implementar mtodos que usem esses valores para calcular por exemplo se uma pessoa,est ou no fora de forma, sem que algum engraadinho fora de forma aumente o PESO_IDEAL_KG para 100 kilos. Qualquer tentativa de mudana de uma varivel finalresultar em alerta do compilador.

    O cdigo abaixo resultar em um erro de compilao:

    [color=red:0fc8cb2b92]Erro de compilao: cannot assign a value to final variable PESO_IDEAL_KG [/color:0fc8cb2b92]

    Como estamos falando de uma variavel de instncia e j discutimos no captulo 1 sobre variveis que so inicializadas automaticamente, saiba que uma VI deve serinicializada EXPLCITAMENTE pelo programador e no esperar que o compilador faa isso por voc!Voc pode realizar essa inicializao de duas maneiras: a primeira junto com a declarao como em nosso exemplo anterior e a segundo no mtodo constructor!

    Primeira Forma:

    O compilador paciente e aguarda que voc inicialize at que o mtodo construtor seja concludo, caso voc tenta esquecido ou tentado engan-lo, aguente asconseqencias.

    Nota 1: Observe que somente o membro ALTURA_IDEAL_CM foi inicializado no construtor, e como o membro PESO_IDEAL_KG no foi inicializado explicitamente nadeclarao, o compilador mostrar a seguinte mensagem: variable PESO_IDEAL_KG might not have been initialized

    Portanto no conte com a idia de inicializao automtica mesmo que sejam tipos primitivos para variveis com modificador final !

    Uma interface tambm pode conter variveis de instncia, e mesmo que no sejam definida explcitamente como final, ele assim ser!

    view plain copy to cl ipboard print ?

    1. Modelo.java2. package p1;3. publicclass Modelo {4. publicfinalint ALTURA_IDEAL_CM = 175;5. publicfinalint PESO_IDEAL_KG = 75;

    6. }

    view plain copy to cl ipboard print ?

    1. package p2;

    2. import p1.*;3. publicclass Diretor {4. publicstaticvoid main(String[] args) {5. Pessoa p = new Pessoa();

    6. p.PESO_IDEAL_KG = 100;7. }8. }

    view plain copy to cl ipboard print ?

    1. package p1;2. publicclass Pessoa {3. publicfinalint ALTURA_IDEAL_CM = 175;4. publicfinalint PESO_IDEAL_KG = 75;5. public Pessoa() { ... } // mtodo construtor6. }7.

    8. Segunda Forma:9.

    10. package p1;11. publicclass Pessoa {

    12. publicfinalint ALTURA_IDEAL_CM;13. publicfinalint PESO_IDEAL_KG;14. public Pessoa() {15. ALTURA_IDEAL_CM = 75; // definido no mtodo construtor

    16. PESO_IDEAL_KG = 75;17. }18. }

    view plain copy to cl ipboard print ?

    1. package p1;2. publicclass Pessoa {3. publicfinalint ALTURA_IDEAL_CM;4. publicfinalint PESO_IDEAL_KG;5. public Pessoa() {

    6. ALTURA_IDEAL_CM = 75; // Nota 17. }8. }

    view plain copy to cl ipboard print ?

    1. FuncionarioPublico.java2. package p1;3. publicinterface FuncionarioPublico {

    4. int tempoEstabilidade = 2; // Nota 15. }

    Page 9 of 13Cap. 2 - Modificadores :: Java Free.org

    2/7/2008http://www.javafree.org/javabb/viewtopic.jbb?t=6941&Cap-2--Modificadores

  • 8/14/2019 JavaFreee - Certificao - Cap2 - Modificadores

    10/13

    Nota 1: Membro de uma interface implicitamente public e final, observe que no foi preciso defin-lo como public para se ter o acesso a outra classe mesmo estando emoutro pacote!Nota 2: Tentativa de alterar um membro de uma interface, como final, o compilador mostrar a seguinte mensagem de erro: [color=red:0fc8cb2b92]cannot assign a valueto final variable tempoEstabilidade[/color:0fc8cb2b92]

    3.6 - static

    Esse modificador muito simples de se entender! Voc como um cara esperto sabe a diferena de uma classe e um objeto certo ? (Se sua resposta for negativa, procuresaber antes de prosseguir!) Uma varivel de instncia com esse modificador compartilhada com todas as instncias (objetos) dessa classe, ou seja, se voc tiver umaclasse com um atributo esttico voc no ter uma cpia desse atributo para cada objeto e sim uma nica cpia para todos, portanto uma alterao do valor desse atributoem qualquer dos objetos, causar efeitos sobre esse atributos para todas as instncia. Por isso, um membro esttico um membro da classe e no do objeto!

    Nota 1: Observe que foi criado uma variavel de instncia count esttico, ou seja, nico para todas as intncias dessa classe!Nota 2: A VI nome no static portando, cada instncia ter um nome distinto.Nota 3: A classe Pessoa tem um modificador parametrizado!Nota 4: Atribui VI 'nome' o valor informado na instanciao do objetoNota 5: Cada vez que o construtor chamado, acrescentado 1 variavel countNota 6: Mtodo que retorna o valor da varivel count. Talvez voc esteja se perguntando mas porque esse mtodo static ? Imagine que voc precise chamar o mtodogetCount sem ter nenhuma instncia de Pessoa, no h problema algum em nosso exemplo tirarmos o modificador static do mtodo getCount, mas voc no poder cham-lo sem haver pelo menos 1 instncia ! Observe tambm que foi usado o nome da classe para chamar os mtodos e no o objetos ('Pessoa.getCount()' ) , apesar de que nohaveria problema pois a JVM saberia que se trata de um modo static e se reportaria a classe para saber as informaes sobre a varivel count.

    Observe a definio das seguintes classes:

    view plain copy to cl ipboard print ?

    1. ProcuradorEstado.java

    2. package p2;3. import p1.*;4. publicclass ProcuradorEstado implements FuncionarioPublico {5. public ProcuradorEstado() {

    6. tempoEstabilidade = 10; // Nota 27. }8. }

    view plain copy to cl ipboard print ?

    1. Pessoa.java

    2. package p1;3. publicclass Pessoa {4. publicstaticint count = 0; // Nota 1

    5. private String nome; // Nota 26. 7. public Pessoa(String n) { // Nota 38. nome = n; // Nota 49. count += 1; // Nota 5

    10. }11. publicstaticint getCount() { // Nota 612. return count;13. }

    14. }

    view plain copy to cl ipboard print ?

    1. Clientes.java2. package p2;

    3. import p1.*;4. publicclass Clientes {5. publicstaticvoid main(String[] args) {6. System.out.println("Antes: "+Pessoa.getCount());

    7. Pessoa p1 = new Pessoa("Kuesley");8. Pessoa p2 = new Pessoa("Jose");9. System.out.println("Depois: "+Pessoa.getCount());

    10. }

    11. }

    view plain copy to cl ipboard print ?

    1. Pessoa.java2. package p1;3. publicclass Pessoa {

    4. publicstaticint count = 0;5. private String nome;6. 7. public Pessoa(String n) {

    8. nome = n;9. count += 1;

    10. }11. publicint getCount() { // Removido o modificador static

    12. return count;13. }14. }15.

    16. Clientes.java17. package p2;18. import p1.*;19. publicclass Clientes {

    20. publicstaticvoid main(String[] args) {21. Pessoa p1 = new Pessoa("Kuesley");22. Pessoa p2 = new Pessoa("Jose");23. System.out.println("Depois p1: "+p1.getCount()); // Nota 1

    24. System.out.println("Depois p2: "+p2.getCount()); // Nota 225. System.out.println("Depois Pessoa: "+Pessoa.getCount()); // Nota 326. }27. }

    Page 10 of 13Cap. 2 - Modificadores :: Java Free.org

    2/7/2008http://www.javafree.org/javabb/viewtopic.jbb?t=6941&Cap-2--Modificadores

  • 8/14/2019 JavaFreee - Certificao - Cap2 - Modificadores

    11/13

    // Nota 1/2: Ambos retornaro 2 no mtodo getCount()// Nota 3: [color=red:0fc8cb2b92]Erro de compilao: non-static method getCount() cannot be referenced from a static context[/color:0fc8cb2b92]

    OBSERVAO: Voc NUNCA poder referenciar de um contexto esttico, uma varivel ou mtodo no esttico! Apesar de que isso j foi falado anteriormente, no estudo dosmtodos estticos, mas sempre bom lembrarmos, pois os caras das provas de certificao. gostam de pegar no nosso p quando se trata de contexto esttico!

    Observe:

    [color=red:0fc8cb2b92]Erro de compilao: non-static variable count cannot be referenced from a static context[/color:0fc8cb2b92]

    Se voc quiser enganar o compilar da seguinte forma:

    Nota 1: O compilador saber que est tentando ser enganado e xingar: [color=red:0fc8cb2b92]Erro: non-static variable count cannot be referenced from a static context[/color:0fc8cb2b92]

    3.7 - transient

    Esse modificador indica a JVM para no esquentar a cabea com as variveis transient quando for realizar a serializao de um objeto! Calma! Calma! Calma! Se voc nosabe o que serializar um objeto, no se preocupe, por enquanto a Sun no est exigindo que voc tenha esse conhecimento - apesar de ser um dos recursos maisbrilhantes da linguagem Java, e usado para a programao em ambientes distribudos! Por isso, apresse seus estudos!Mesmo assim, gostaria que voc tivesse uma idia do que serializar um objeto, pois assim acredito que fique mais fcil a compreenso desse modificador.Imagine que voc esteja desenvolvendo uma aplicao em um ambiente de rede e precise que um objeto Pessoa seja enviado para um outra mquina da rede, e l continueo processo com esse objeto, esse processo conhecido como serializao, ou seja, transformar um objeto em uma sequencia de bytes e envi-lo para outra mquina(consequentemente, outra JVM) que deserializar essa seqencia de bytes, obtendo o objeto como na mquina de origem! Quem disse que no h milagres nainformtica!!!

    Nota 1: Imagine que sua conexo de rede seja muito ruim! E voc no precise ficar transportanto a foto da pessoa na rede, com o modificador transient o membro Foto noser serializado!

    3.8 - volatile

    Quando uma variavel de instancia com esse modificador alterada, a threads dever sincronizar sua cpia com a cpia principal.No se preocupe em saber como issofunciona, estudaremos com exatido isso no captulo 9!

    Uma analogia a esse modificador o caso dos programadores que quando alteram um projeto devem sempre alterar a documentao para que todos os demais membrosda equipe estejam atualizados!

    IMPLEMENTAO DE INTERFACE:

    Voc ter que saber algumas regras sobre interface para se certificar, e dever saber de "cor e salteado" (nunca tinha citado isso) como funciona a interface Runnable ! Umainterface uma espcie de contrato que uma classe deve fazer e cumprir para que todos fiquem felizes! Veja como a implementao de uma interface:

    Uma interface nada mais que uma classe totalmente abstrata, ou seja, s existe as assinaturas de mtodos!Apesar de no terem sidos definidos como abstract e public, convencionalmente os mtodos de uma interface o so. Portanto o compilador os enxerga:

    view plain copy to cl ipboard print ?

    1. package p1;2. publicclass Clientes {3. int count = 0;4. publicstaticvoid main(String[] args) {5. System.out.println(""+count);6. }7. }

    view plain copy to cl ipboard print ?

    1. package p1;2. publicclass Clientes {3. int count = 0;4. publicvoid imprimirLista() {

    5. System.out.println(""+count);6. }7. publicstaticvoid main(String[] args) {8. imprimirLista(); // Nota 1

    9. }10. }

    view plain copy to cl ipboard print ?

    1. publicclass Pessoa {2. public String nome;3. public String endereco.

    4. transientpublic Image Foto; // Nota 15. }

    view plain copy to cl ipboard print ?

    1. publicinterface FuncoesPublicas {2. void assinarPonto();3. void executarResponsabilidade();4. }

    Page 11 of 13Cap. 2 - Modificadores :: Java Free.org

    2/7/2008http://www.javafree.org/javabb/viewtopic.jbb?t=6941&Cap-2--Modificadores

  • 8/14/2019 JavaFreee - Certificao - Cap2 - Modificadores

    12/13

    Apesar de no existir herana mltipla em Java para classe em Java, as interfaces podem herdar de multiplas interface, veja o cdigo a seguir:

    Nota 1: Um interface pode herdar mais de uma interface! No pense em fazer isso com uma classe!Apesar de que uma classe pode implementar vrias interfaces:

    Vejamos:

    Voc deve saber algumas regras quanto declarao de constante de interface:

    Apesar de no estar explcitamente definido mas a varivel tempoServico :

    publicfinalstatic

    O equivalente a:

    CONSIDERAES FINAIS:

    Modificadores de acesso:

    - Os modificadores de acesso: (padro, public, private e protected) nunca podero ser combinados !

    Mtodos- Nunca poder ser definido como (transient, volative)- Um mtodo nunca poder ser abstract e final- Um mtodo nunca poder ser abstract e strictfp- Um mtodo nunca poder ser abstract e native- Um mtodo nunca poder ser abstract e synchronized- Um mtodo nunca poder ser abstract e private- Um mtodo final nunca poder ser sobreposto- Um mtodo abstrato nunca poder ser implementado- Se um mtodo for abstrato a classe tambm ser

    Varivel de Instncia- Pode ter qualquer um dos quatro modificadores de acesso- Podem ser (volative, transient, final, static)- No pode ser (abstract, native, synchronized, strictfp) -

    Interfaces

    - Uma interface nunca herda uma classe- Uma classe nunca herda uma interface- Uma interface nunca implementa outra interface- Uma classe nunca implementa outra classe- Uma interface pode herdar vrias interfaces

    view plain copy to cl ipboard print ?

    1. publicinterface FuncoesPublicas {2. publicabstractvoid assinarPonto();3. publicabstractvoid executarResponsabilidade();4. }

    view plain copy to cl ipboard print ?

    1. publicinterface FuncaoAnimal {2. void nascer();3. }4.

    5. interface FuncaoAve extends FuncaoAnimal {6. void voar();7. }8.

    9. interface FuncaoReptil extends FuncaoAnimal {10. void rastejar();11. }12. 13. interface FuncaoCobraVoadora extends FuncaoAve, FuncaoReptil { // Nota 114. }

    view plain copy to cl ipboard print ?

    1. class CobraViva implements FuncaoAnimal, Runnable { ... }

    view plain copy to cl ipboard print ?

    1. publicinterface FuncoesPublicas {2. int tempoServico = 0;3. }

    view plain copy to cl ipboard print ?

    1. publicinterface FuncoesPublicas {

    2. publicstaticfinalint tempoServico = 0;3. }

    Page 12 of 13Cap. 2 - Modificadores :: Java Free.org

    2/7/2008http://www.javafree.org/javabb/viewtopic.jbb?t=6941&Cap-2--Modificadores

  • 8/14/2019 JavaFreee - Certificao - Cap2 - Modificadores

    13/13

    - Uma variavel de uma interface sempre ser implcitamente: (public, final, static)- Um mtodo de uma interface sempre ser (public, abstract)

    Lembre-se da Interface: java.lang.Runnable

    Apesar de que veremos ela com mais detalhes no captulo 9 (esse o captulo) !

    Ela s tem um mtodo: public void run();

    Este o final do captulo 2 !!!

    [color=green:0fc8cb2b92]Respostas dos exerccios propostos:[/color:0fc8cb2b92]

    1) b

    Page 13 of 13Cap. 2 - Modificadores :: Java Free.org