You are on page 1of 18

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 no vacilar 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:
1. class Car {

2.

// cdigo da classe 3. }

Observe que no foi definido nenhum modificador para a classe, portanto o modificador de acesso nesse caso padro (default ou friendly)! O modificador padro define que 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 em um erro de compilao. Dada as classes:
1. Car.java 2. package carros; 3. class Car { ... }

4.
5. 6. 7. 8. Oficina.java package oficina; import carros.*; class Oficina extends Car { ... } // Erro de compilao

9.
10.Conserto.java 11.package conserto; 12.import carros.*; 13.class Conserto { 14.public static void main(String[] args) { 15.Car c = new Car(); // Erro de compilacao 16.} 17.}

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 do pacote 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 atravs de referencia. Agora observe:
1. Car.java 2. package carros; 3. class Car { ... }

4.
5. Oficina.java 6. package carros; 7. class Oficina extends Car { ... } // ok

8.
9. Conserto.java 10.package carros; 11.class Conserto { 12.public static void main(String[] args) { 13.Car c = new Car(); // ok 14.} 15.}

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.
1. 2. 3. 4. 5. 6. 7. Car.java package carros; public class Car { String getColor() { return "yellow"; } }

8.
9. Oficina.java 10.package oficina; 11.import carros.*; 12.public class Oficina { 13.public static void main(String[] args) { 14.Car c = new Car(); // ok 15.} 16.}

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:
1. 2. 3. 4. 5. 6. 7. Car.java package carros; public class Car { String getColor() { return "yellow"; } }

8.
9. Oficina.java 10.package oficina; 11.import carros.*; 12.public class Oficina { 13.public static void main(String[] args) { 14.Car c = new Car(); 15.System.out.println("A cor e "+c.getColor());

16.} 17.}

a) Mostrar: A cor e yellow b) Erro de compilao c) Exceo na hora da execuo d) Mostrar: A cor e null e) 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 o mesmo 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 a objetos, a extensibilidade, voc pode definir uma classe Car com comportamentos (mtodos) abstratos e deixar que as subclasses definam esses comportamentos de forma diferente, mesmo porque a forma de acelerao de um Mazda RX7 bem diferente de um Fusca 1300 (putz que comparao mais esdrxula!)
1. Car.java 2. package carros; 3. public abstract class Car { ... }

4.
5. Oficina.java 6. package carros; 7. public class Oficina { 8. public static void main(String[] args) { 9. Car c = new Car(); // Erro de compilao 10.} 11.}

[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 Car No 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 muito provavelmento 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 saber porque 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 seja herdada 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 de execuo mais rpido. Um exemplo disso a classe String ! Porque deveramos mexer nessa classe ? Se voc ja achou alguma implementao para ela, mande seu currculo para a Sun, o endereo : pretensao@sun.com (no sei porque est em portugus, sendo que so americanos):
1. Car.java 2. package carros; 3. public final class Car { ... }

4.
5. 6. 7. 8. Oficina.java package carros; public class Oficina extends Car { // erro de compilao public static void main(String[] args) { Car c = new Car();

9.
10.} 11.}

[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 classe final e abstrata ! Como faramos a herana sendo que a classe final !
1. Car.java 2. package carros; 3. public abstract final class Car { ... } // erro de compilao

[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 que para 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 mesmo padro. Voc tambem poder definir esse modificador para um mtodo especifico, mas isso ser discutido posteriormente.
1. Car.java 2. package carros; 3. public strictfp class Car { ... } // ok

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 mesmo pacote.
1. 2. 3. 4. 5. 6. 7. Car.java package carros; public class Car { String getColor() { mtodo com acesso padro return "red"; } }

8.
9. Oficina.java 10.package carros; 11.public class Oficina { 12.public static void main(String[] args) { 13.Car c = new Car(); 14.System.out.println("a cor do carro e "+c.getColor()); // ok 15.} 16.}

Nenhum problema de acesso pois as classes esto no mesmo pacote

Se definirmos a classe Oficina da seguinte forma:


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

[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 est se desejando o acesso! Se ficou confuso, no se preocupe, vai piorar !!
1. 2. 3. 4. 5. 6. 7. Car.java package carros; class Car { public String getColor() { return "red"; } }

8.
9. Oficina.java 10.package oficina; 11.import carros.*; 12.class Oficina { 13.public static void main(String[] args) { 14.Car c = new Car(); 15.System.out.println("a cor e "+c.getColor()); 16.} 17.}

// erro de compilao

[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!
1. 2. 3. 4. 5. 6. Car.java package carros; class Car { private String getColor() { // Nota 1 return "red"; }

7.
8. public void imprimirCor() { 9. System.out.println( "a cor do carro e "+getColor()); // Nota 2 10.} 11.}

12.
13.Oficina.java 14.package carros;

15.class Oficina { 16.public static void main(String[] args) { 17.Car c = new Car(); 18.System.out.println("a cor e "+c.getColor()); 19.c.imprimirCor(); // Nota 4 20.} 21.}

// Nota 3

Nota 1: O mtodo foi definido como private Nota 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 de um pacote PY desde que a classe Y estenda da classe X ( que confuso !!!) No esquenta isso bem fcil!
1. 2. 3. 4. 5. 6. 7. Car.java package carros; public class Car { protected String getColor() { // Nota 1 return "red"; } }

8.
9. Oficina.java 10.package oficina; 11.import carros.*; 12.class Oficina extends Car { // Nota 2 13.public void imprimirCor() { 14.System.out.println("a cor e "+getColor()); // Nota 3 15.} 16.}

Nota 1: O mtodo foi definido com protected Nota 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:
1. 2. 3. 4. 5. 6. 7. Car.java package carros; public class Car { protected String getColor() { return "red"; } }

8.
9. Oficina.java 10.package oficina; 11.import carros.*; 12.class Oficina { // Nota 1 13.public void imprimirCor() { 14.Car c = new Car(); 15.System.out.println("a cor e "+c.getColor()); // Nota 2 16.} 17.}

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()has protected access in carros.Car[/color:0fc8cb2b92] Uma classe que herda um mtodo protegido torna-o private para suas subclasses. Complicou ?
1. 2. 3. 4. 5. 6. 7. Car.java package carros; public class Car { protected String getColor() { return "red"; } }

8.
9. Passeio.java 10.package passeio; 11.import carros.*; 12.class Passeio extends Car { 13.public void imprimirCor() { 14.System.out.println("a cor e "+getColor()); // Nota 1 15.} 16.} 1. 2. 3. 4. 5. 6. 7. 8. Mazda.java package esportivo; import carros.*; class Mazda extends Passeio { public void mostrarCor() { System.out.println("a cor e "+getColor()); // Nota 2 } }

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 de Passeio, ou seja, um mtodo protected se torna private para suas subclasses quando h herana, no permitindo que as subclasses de Passeio herdem os mtodos protegidos 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 o mtodo. Uma classe que possua um mtodo abstrato deve obrigatoriamente ser abstrata!
1. 2. 3. 4. 5. Car.java package carros; public abstract class Car { // Nota 1 public abstract String getColor(); // Nota 2 }

6.
7. Oficina.java 8. package oficina; 9. import carros.*; 10.public class Oficina extends Car { // Nota 3 11.public String getColor() { 12.return "red"; 13.} 14.}

Nota 1: A classe Car tambm teve que ser definida com abstract, uma vez que uma classe contenha um mtodo abstract Nota 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 compilador insultar o programador, melhor no brincar! Erros comuns 1 - Tentar implementar um mtodo abstrato:
1. 2. 3. 4. 5. Car.java package carros; public abstract class Car { public abstract String getColor() { ... } // Erro }

[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
1. 2. 3. 4. 5. Car.java package carros; public class Car { public abstract String getColor(); // Nota 1 }

[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
1. 2. 3. 4. 5. 6. 7. 8. 9. Car.java package carros; public abstract class Car { public abstract String getColor(); public abstract String getSize(); public double getPrice() { return 24000.00; } }

10.
11.Passeio.java 12.package carros; 13.public class Passeio extends Car { // Nota 1 14.public String getColor() { // Nota 2 15.return "red"; 16.}

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.Car Nota 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 private no 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.
1. 2. 3. 4. 5. 6. 7. Car.java package carros; public class Car { public final String getColor() { return "red"; } }

// Nota 1

8.
9. class Mazda extends Car { 10.public String getColor() { // Nota 2 11.return "yellow"; 12.} 13.}

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()in carros.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.
1. 2. 3. 4. 5. 6. 7. 1. 2. 3. 4. 5. 6. 7. 8. Car.java package carros; public class Car { public static String getColor() { return "red"; } }

// Nota 1

Oficina.java package oficina; import carros.*; class Oficina { public static void main(String[] args) { System.out.println("a cor e "+Car.getColor()); // Nota 2 } }

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 executado por 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 que no 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.
1. 2. 3. 4. 5. Car.java package carros; public class Car { double preco; // Nota 1 }

6.
7. Oficina.java 8. package carros; 9. class Oficina { 10.public static void main(String[] args) { 11.Car c = new Car(); 12.c.preco = 13990.00; // Nota 2 13.} 14.}

Nota 1: No foi definido nenhum modificado, portanto assume o modificador padro Nota 2: Acesso a varivel de instncia (VI) de uma classe dentro do mesmo pacote Observe agora:
1. 2. 3. 4. 5. Car.java package carros; public class Car { double preco; // Nota 1 }

6.
7. Oficina.java 8. package oficina; 9. import carros.*; 10.class Oficina { 11.public static void main(String[] args) { 12.Car c = new Car(); 13.c.preco = 13990.00; // Nota 2 14.} 15.}

Nota 1: No foi definido nenhum modificado, portanto assume o modificador padro Nota 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 from outside 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.
1. 2. 3. 4. 5. Car.java package carros; public class Car { public double preco; // Nota 1 }

6.
7. Oficina.java 8. package oficina;

9. import carros.*; 10.class Oficina { 11.public static void main(String[] args) { 12.Car c = new Car(); 13.c.preco = 13990.00; // Nota 2 14.} 15.}

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.
1. 2. 3. 4. 5. Car.java package carros; class Oficina { private String endereco; }

// Nota 1

6.
7. public class Car { 8. public static void main(String[] args) { 9. Oficina o = new Oficina(); 10.System.out.println("o endereco "+o.endereco); // Nota 2 11.} 12.}

Nota 1: Varivel definida como private, acesso somente dentro da prpria classe Nota 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 para implementao 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.
1. 2. 3. 4. 5. Pessoa.java package p1; public class Pessoa { protected String nome = "Kuesley"; }

// nota 1

6.
7. Diretor.java 8. package p2; 9. import p1.*; 10.public class Diretor extends Pessoa { // subclasse de Pessoa 11.public String getNome() { 12.return nome; // nota 2 13.} 14.}

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:
1. Diretor.java 2. package p2;

3. 4. 5. 6. 7. 8. 9.

import public public Pessoa return } }

p1.*; class Diretor { // classe sem herana String getNome() { p = new Pessoa(); p.nome; // nota 1

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 resolva arbitrariamente 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. Talvez no tenha sido muito feliz no exemplo, mas vamos v-lo na prtica.
1. 2. 3. 4. 5. 6. Modelo.java package p1; public class Modelo { public final int ALTURA_IDEAL_CM = 175; public final int PESO_IDEAL_KG = 75; }

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 final resultar em alerta do compilador. O cdigo abaixo resultar em um erro de compilao:
1. 2. 3. 4. 5. 6. 7. 8. package p2; import p1.*; public class Diretor { public static void main(String[] args) { Pessoa p = new Pessoa(); p.PESO_IDEAL_KG = 100; } }

[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 ser inicializada 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:
1. 2. 3. 4. 5. 6. package p1; public class Pessoa { public final int ALTURA_IDEAL_CM = 175; public final int PESO_IDEAL_KG = 75; public Pessoa() { ... } // mtodo construtor }

7.

8. Segunda Forma:

9.
10.package p1; 11.public class Pessoa { 12.public final int ALTURA_IDEAL_CM; 13.public final int PESO_IDEAL_KG; 14.public Pessoa() { 15.ALTURA_IDEAL_CM = 75; // definido no mtodo construtor 16.PESO_IDEAL_KG = 75; 17.} 18.}

O compilador paciente e aguarda que voc inicialize at que o mtodo construtor seja concludo, caso voc tenta esquecido ou tentado engan-lo, aguente as conseqencias.
1. 2. 3. 4. 5. 6. 7. 8. package p1; public class Pessoa { public final int ALTURA_IDEAL_CM; public final int PESO_IDEAL_KG; public Pessoa() { ALTURA_IDEAL_CM = 75; // Nota 1 } }

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 na declarao, 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!
1. 2. 3. 4. 5. 1. 2. 3. 4. 5. 6. 7. 8. FuncionarioPublico.java package p1; public interface FuncionarioPublico { int tempoEstabilidade = 2; // Nota 1 } ProcuradorEstado.java package p2; import p1.*; public class ProcuradorEstado implements FuncionarioPublico { public ProcuradorEstado() { tempoEstabilidade = 10; // Nota 2 } }

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 em outro 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 value to 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, procure saber antes de prosseguir!) Uma varivel de instncia com esse modificador compartilhada com todas as instncias (objetos) dessa classe, ou seja, se voc tiver uma classe 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 atributo em 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!
1. 2. 3. 4. 5. Pessoa.java package p1; public class Pessoa { public static int count = 0; // Nota 1 private String nome; // Nota 2

6.
7. public Pessoa(String n) { // Nota 3 8. nome = n; // Nota 4 9. count += 1; // Nota 5 10.} 11.public static int getCount() { // Nota 6 12.return count; 13.} 14.}

1. Clientes.java 2. package p2; 3. import p1.*; 4. public class Clientes { 5. public static void 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.}

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 objeto Nota 5: Cada vez que o construtor chamado, acrescentado 1 variavel count Nota 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 mtodo getCount 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 no haveria 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:
1. 2. 3. 4. 5. Pessoa.java package p1; public class Pessoa { public static int count = 0; private String nome;

6.
7. public Pessoa(String n) { 8. nome = n; 9. count += 1; 10.} 11.public int getCount() { 12.return count; 13.} 14.}

// Removido o modificador static

15.
16.Clientes.java 17.package p2; 18.import p1.*;

19.public class Clientes { 20.public static void 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 2 25.System.out.println("Depois Pessoa: "+Pessoa.getCount()); // Nota 3 26.} 27.}

// 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 dos mtodos 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:
1. 2. 3. 4. 5. 6. 7. package p1; public class Clientes { int count = 0; public static void main(String[] args) { System.out.println(""+count); } }

[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:
1. package p1; 2. public class Clientes { 3. int count = 0; 4. public void imprimirLista() { 5. System.out.println(""+count); 6. } 7. public static void main(String[] args) { 8. imprimirLista(); // Nota 1 9. } 10.}

Nota 1: O compilador saber que est tentando ser enganado e xingar: [color=red:0fc8cb2b92] Erro: nonstatic 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 no sabe 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 mais brilhantes 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 continue o 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 na informtica!!!

1. 2. 3. 4. 5.

public class Pessoa { public String nome; public String endereco. transient public Image Foto; }

// Nota 1

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 no ser 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 isso funciona, 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 membros da 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 ! Uma interface uma espcie de contrato que uma classe deve fazer e cumprir para que todos fiquem felizes! Veja como a implementao de uma interface:
1. 2. 3. 4. public interface FuncoesPublicas { void assinarPonto(); void executarResponsabilidade(); }

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:
1. 2. 3. 4. public interface FuncoesPublicas { public abstract void assinarPonto(); public abstract void executarResponsabilidade(); }

Apesar de no existir herana mltipla em Java para classe em Java, as interfaces podem herdar de multiplas interface, veja o cdigo a seguir:
1. public interface 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 { 14.} // Nota 1

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:
1. class CobraViva implements FuncaoAnimal, Runnable { ... }

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


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

Apesar de no estar explcitamente definido mas a varivel tempoServico : public final static O equivalente a:
1. public interface FuncoesPublicas { 2. public static final int tempoServico = 0; 3. }

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 - 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 !!!

Respostas dos exerccios propostos:

1) b

You might also like