Identificadores permitidos
Devem ser compostos apenas de caracteres Unicode,
números, sÃmbolos de moedas e caracteres de ligação (como
os _underscores_ ). As regras que você precisa saber sobre
identificadors são:
Devem começar com uma letra, cifrão ($), ou underscores
(_).
Números não são permitidos no inÃcio do identificador
apenas.
Na prática, não há limite no tamanho do identificador.
Não se pode usar palavras reservadas de Java como
identificadores
São case-sensitive . FOO, Foo, fOO, FoO, foo são
identificadores diferentes
Identificadores permitidos e não
permitidos
Permitidos Não Permitidos
int _a; int :b;
int $c; int a-d;
int _____2_w; int e#;
int _$; int .f;
int $; int 7g;
int $$$$2$$$; int a$%b;
int meu_identif_3; int void;
int repeat; int do;
int void2; int volatile;
int strictfp;
Convenções de código
Há um documento chamado "Java Code Conventions" que
especifica as convenções de código que devem ser usadas em
programas Java. Mas somente algumas se aplicam aos testes
de certificação.
Classes: substantivos
Dog
Account
PrintWriter
Interfaces: adjetivos
Runnable
Serializable
Declaração de Classes
A maioria dos programadores acham que conhecem todos os
modificadores, mas num estudo mais profundo encontram sutis
distinções, por isso, devemos ter conhecimentos mais sólidos
nesta seção.
Regras de Declaração
Deve haver apenas uma classe pública por código fonte;
Comentários podem aparecer em qualquer lugar;
Se houver uma classe pública em um arquivo, seu nome
deve ser o nome desta classe;
A declaração package deve estar na primeira linha do
código;
Declarações import devem vir entre as declarações de
pacote e classe;
Import e package se aplicam a todas as classes de um
arquivo;
Um arquivo pode conter mais de uma classe não-pública;
Um arquivo sem nenhuma classe pública pode ter qualquer
nome.
Exemplo
// arquivo Meetup.java
package osum.group.ufcg.jcert;
import ufcg.dsc.ccc.p2.Knowledge;
import ufcg.dsc.ccc.labp2.Exercise;
public class Meetup {
Knowledge k = new Knowlege();
}
class Discussion {
Exercise e = new Exercise();
}
Modificadores e Declaração de Classe
Modificadores de acesso:
public
protected
private
Modificadores não referentes ao acesso:
strictfp
final
abstract
...
Acesso Default
package cert;
class Beverage { }
Não possui modificador de acesso em sua declaração;
A classe Blah só pode ser vista dentro do pacote cert;
package exam.stuff;
import cert.Beverage;
class Tea extends Beverage { } // Erro de
// compilação
Combinação de modificadores
public final strictfp class MyClass{
//OK!
}
public abstract class MyOtherClass{
strictfp void calculate(){
//OK!
}
}
public abstract class ThisHasAProblem{
abstract strictfp myMethod();
//erro de compilação
}
Combinação de Modificadores
No geral, pode-se combinar modificadores na declaração
de uma classe. Por exemplo:
public abstract class Car { ... }
public abstract strictfp class Car { ... }
final class Car { ... }
Mas não se pode misturar alguns modificadores, como:
final abstract class Car { ... } // Erro de
// compilação
Acesso e hierarquia de pacotes
======== osum/ufcg/WholeGroup.java ==========
package osum.ufcg;
class WholeGroup {
JCertGroup jcg = new JCertGroup();
//Este código compila?
}
====== osum/ufcg/jcert/JCertGroup.java =====
package osum.ufcg.jcert;
class JCertGroup {
// ...
}
Acesso e hierarquia de pacotes
======== osum/ufcg/WholeGroup.java ==========
package osum.ufcg;
import osum.ufcg.jcert.*;
class WholeGroup {
JCertGroup jcg = new JCertGroup();
//Agora ele compila!!!
}
====== osum/ufcg/jcert/JCertGroup.java =====
package osum.ufcg.jcert;
public class JCertGroup {
// ...
}
Declaração de Interfaces
Declaração de Interfaces
Uma interface declara um contrato que define o que um
objeto que a implementa deve fazer, mas não como.
Uma interface define um comportamento que não precisa
estar associado a uma hierarquia de objetos. É
semanticamente mais "frouxa". Ex.: interface Bounceable
-> Bounceable <-
Entendendo...
public abstract interface MembroJCert
extends MembroGrupo {
public static final String
listaDeEmail = "jcert@googlegroups";
public abstract int getIdade();
public abstract String getNome();
public abstract List<String> getPerguntas();
}
Os únicos modificadores de acesso permitidos são public e
abstract. Por isso...
Interfaces não podem ser
declaradas strictfp, final ou native
Estas declarações são todas
equivalentes...
int x = 1;
public int x = 1;
static int x = 1;
public static int x = 1;
static final int x = 1;
public final int x = 1;
public static final int x = 1;
//lembre-se de que, implicitamente, todas as
//variáveis em uma interface são public,
//static e final. A omissão desse //identificadores deixa o código mais
limpo.
Atenção com as constantes...
interface Foo {
boolean BAR = true;
void go();
}
class Zip implements Foo {
public void go(){
BAR = false;
//erro de compilação! ;)
}
}
Atenção com as constantes...
interface Quadrupede {
int NUM_PATAS = 4;
}
interface Bipede {
int NUM_PATAS = 2;
}
class Animal implements Quadrupede, Bipede {
int quantasPatas(){
return NUM_PATAS;
//Erro de compilação: valor ambÃguo.
//Alternativa: Bipede.NUM_PATAS
}
}
Declaração de Membros de
Classe
Modificadores de Acesso
public
protected
default
private
Como saber se tenho acesso a um
membro de alguma classe?
Primeiramente, olhe para o nÃvel de acesso da classe;
Se a classe não for acessÃvel, então nenhum membro
estará acessÃvel;
Depois, olhe para o nÃvel de acesso de cada membro,
individualmente.
Esclarecendo protected ...
package pack1;
public class Parent {
protected int x = 10;
}
package pack2;
class Child extends Parent {
// pode acessar 'x'...
public static void main(String[] args){
Child c = new Child();
c.x = 0; //aqui pode! =)
Parent p = new Parent();
p.x = 0; // aqui não! Erro!
}
}
package pack2;
class Cousin {
// não pode acessar 'x'...
}
Tudo junto e misturado...
E quanto a variáveis locais?
Modificadores de acesso podem ser aplicados em variáveis
locais?
private int valor = 0;
while(true){
valor++;
System.out.println(valor);
}
//Vai imprimir valores para sempre?
//Não, isto nem compila! Por quê?
E quanto a variáveis locais?
Modificadores de acesso podem ser aplicados em variáveis
locais? Não
De fato, apenas um modificador pode ser aplicado a variáveis
locais: final
final int valor = 0;
while(true){
valor++;
System.out.println(valor);
}
//Vai imprimir valores para sempre?
//Tb Não, isto nem compila! Por quê?
Exemplificando...
public abstract class Vehicle {
public abstract void goUpHill();
}
public abstract class Car extends Vehicle {
public abstract void goUpHill();
// ainda abstrato
public void doCarThings() { }
}
public class Mini extends Car {
public void goUpHill() { }
}
Declarações de Construtores
class Foo2 {
// legal constructors
Foo2() { }
private Foo2(byte b) { }
Foo2(int x) { }
Foo2(int x, int... y) { }
// ilegal constructors
void Foo2() {}
Foo() { }
Foo2(short s);
static Foo2(float f) { }
final Foo2(long x) { }
abstract Foo2(char c) { }
Foo2(int... x, int t) { }
}
Declaração de Variáveis
Primitivas
char, boolean, byte, short, int, long, double, float;
Variáveis de Referência
acesso a um objeto
Não vamos nos aprofundar, assunto de P2 =)
Números Primitivos
Variável de Instância
Pode usar qualquer um dos nÃveis de acesso;
Pode ser:
final ;
transient ;
Não pode ser:
abstract;
synchronized;
strictfp;
native;
static (seria variável de classe).
Variáveis Locais
Outro caso, conhecido como "shadowing".
class TestServer{
int count = 9;
public void logIn(){
int count = 10;
System.out.println("count is " + count);
}
public void count(){
System.out.println("count is " + count);
}
public static void main (String[] args){
new TestServer().logIn();
new TestServer().count();
}
}
Output: Count is 10
Count is 9
Declaração de Arrays
Arrays são variáveis com múltiplos objetos do mesmo tipo. Ou
múltiplos objetos com subtipos do mesmo tipo.
Quais das declarações abaixo são permitidas?
int[] key;
int numbers[];
Thread [][] myThreads;
Object [][] myObjects [];
Declaração de Arrays
Arrays são variáveis com múltiplos objetos do mesmo tipo. Ou
múltiplos objetos com subtipos do mesmo tipo.
int[] key;
int numbers[];
Thread [][] myThreads;
Object [][] myObjects [];
//As declarações acima são todas permitidas
//Abaixo, uma não permitida
int[5] scores;
//O tamanho não pode ser declarado antes da instanciação
Transientes e Voláteis
Variáveis transientes são ignoradas na serialização dos
objetos. (mais na reunião 6).
Variáveis voláteis serão revisitadas na reunião 9
(concorrência).
Agora, só precisamos saber como podem ser declaradas:
//Certo volatile int v1; transient int t1;
//Errado int volatile v2; int transient t2;
0 comments
Post a comment