Académique Documents
Professionnel Documents
Culture Documents
Identificadores legais
Regras:
Comear com letra, cifro ou caracter de conexo (_). No podem comear com
numero!
Aps primeiro caracter, pode conter qualquer combinao de letras, caracteres de
moedas, caracteres de conexo ou nmeros;
No h limite de numero de caracteres;
No pode usar palavra reservada java;
So case sensitiva, portanto, foo no igual a Foo;
Convenes de cdigo java da SUN
Classes e Interfaces: primeira letra maiscula, o resto em camelCase; Ex: Dog, Cachorro,
NomeClasse;
Mtodos: primeira letra minscula, demais camelCase. Ex: getBalance, doCalculation;
Variveis: primeira letra minscula, demais camelCase. Ex: buttonWidth, myString;
Constantes: tudo em letra maiscula. Ex: MIN_HEIGHT;
Declarao de classes Modificadores de acesso
Classes utilizam apenas os modificadores default e public:
Acesso defaul: Apenas classes do mesmo pacote podero acessar
Exemplo declarao:
class NomeClasse {
}
Acesso public: Todas as classes acessam
Exemplo declarao:
public class NomeClasse {
}
Capitulo 2
Benefcios do Encapsulamento
Principio do encapsulamento definir variveis de instancia private e mtodos com acesso
public acessando a estas variveis.
Herana, -UM (IS-A), TEM-UM(HAS-A)
-UM: Ocorre quando uma classe herda ou implementa de alguma outra classe. Exemplos:
public classe Vehicle {}
public class Car
extends Vehicle {}
public class Subaru extends Car {}
Portanto:
Car -UM Vehicle;
Subaru -UM Car;
Subaru -UM Vehicle;
TEM-UM: Ocorre se o cdigo da classe A apresentar uma referncia a uma instncia da classe
B. Exemplos:
public class Animal {}
public class Horse extends Animal {
private Halter myHalter;
}
Portanto:
Horse -UM Animal;
Horse TEM-UM Halter;
Polimorfismo
Todo o objeto aceito no teste -UM polimrfico.
Coisas importantes sobre variveis de referncia:
S pode ser de um tipo e, uma vez declarado, esse tipo nunca pode ser mudado;
O tipo de varivel de refncia determina os mtodos que podem ser chamados no
objeto o qual a varivel esta refernciando;
Uma varivel de referncia pode apontar para qualquer objeto do mesmo tipo que a
referncia declarada ou a qualquer subtipo do tipo declarado.
Uma varivel pode ser declarada com um tipo de classe ou tipo de interface. Se for
declarada por um tipo que seja uma interface, poder referenciar qualquer objeto que
implemente esta interface;
IMPORTANTE: Uma classe no pode estender mais do que uma classe.
Sobrescrevendo / Sobrecarregando
Mtodos Sobrescritos
Exemplo de sobrescrita de mtodo:
public class Animal {
public void eat() {
System.out.println(Animal genrico comendo de forma genrica);
}
}
Exemplo interessante:
Assumindo-se que temos uma interface Bounceable com dois mtodos: bounce() e
setBounceFactor();
abstract class Ball implements Bounceable {} // A classe de implementao
abstract, portanto, no precise implementar os mtodos da interface! At aqui,
ok...
class BeachBall extends Ball { //embora no esteja explcito, BeachBall
implementa Bounceable, uma vez que extende a classe Ball, portanto, dever
declarar os mtodos bounce() e setBounceFactor();
public void setBounceFactor() {
}
public void bounce() {
}
}
ATENO: No exemplo acima, caso a classe abstrata Ball tivesse implementado um mtodo
(bounce() por exemplo) da interface Bounceable, ento, a classe BeachBall precisaria
implementar apenas o outro (setBounceFactor por exemplo), pois o outro mtodo j foi
implementado pela classe abstrata Ball.
Tipos de Retornos Vlidos
Veja exemplo abaixo:
public classe Foo {
Void go() {}
}
Public classe Bar extends Foo {
String go(int x) {
return null;
}
}
A verso do mtodo go da classe Bar usa um tipo de retorno diferente. Isso perfeitamente
adequado, uma vez que na sobrecarga a lista de argumentos do mtodo que precisa ser
diferente!
IMPORTANTE: Se na classe Bar o mtodo go estivesse da seguinte forma:
String go() {
}
Essa seria uma sobrecarga invlida, uma vez que no possvel modificar apenas o tipo de
retorno na sobrecarga.
Aspectos bsicos
Um contrutor tem o mesmo nome da classe, sem tipo de retorno. Exemplo:
class Foo {
int size;
String name;
Foo(String name, int size) {
this.name = name;
this.size = size;
}
}
Neste caso, se tentarmos instanciar um objeto Foo da seguinte forma: Foo f = new
Foo();...dar erro, pois no h um construtor sem argumentos declarado. Se no houver
nenhum construtor declarado, por default haver um, no seguinte formado (a exemplo da
classe Foo acima).. Foo() {}
Cadeia de Construtores
Os construtores so chamados em tempo de execuo, ao digitar new em alguma classe. Ex:
Horse h = new Horse();
IMPORTANTE:
Considerando que Horse estende Animal e que Anima estende Objetc. Ao digitar new Horse,
ocorrer o seguinte:
O construtor de Horse ser chamado e far uma chamada ao construtor de Animal
(Implcitamente);
O construtor de Animal far uma chamada ao construtor de Object (Implicitamente);
Object a ltima classe na hierarquia de classes, portanto, a ponta da pilha. Agora as
variveis de instancia de Object recebero seus valores explcitos (Valores atribudos na
declarao das variveis int x = 210; por exemplo);
A execuo do construtor de object ser concluda, voltando para o construtor de
animal onde as variveis de instncia de Animal recebero seus valores explcitos (se
houver). Isto feito, a executao do construtor de Animal ser concluda, voltando para
o construtor de Horse onde as variveis de instncia recebero seus valores (se
houver) e a execuo do construtor de Horse ser concluda;
Regras dos Construtores
Podem usar qualquer modificador de acesso, inclundo private (permitindo que apenas
o cdigo dentro da propria classe instancie este objeto);
O nome do construtor deve coincidir com o da classe;
Os construtores no devem ter um tipo de retorno. Se tiver um tipo de retorno ser um
mtodo normal e no um construtor;
Se vc no inserir, o compilador ir inserir um padro sem argumentos;
Se vc inserir um construtor com argumentos, o construtor default do compilador no
existir, portanto, dever inserir um sem argumento caso seja do seu interesse;
Todo construtor deve ter como sua primeira instruo a chamada a um construtor
sobrecarregado (this()) ou ao construtor da superclasse (super()), mas lembre-se de
que essa chamada pode ser inserida pelo compilador;
Se voc inserir um construtor e no digitar super() ou this(), o compilador ir inserir
automticamente uma chamada a super() sem argumentos, como a primeira instruo
do construtor.
A chamada a super() pode ser sem argumentos ou incluir os argumentos passados para
o construtor da superclasse;
IMPORTANTE: Veja o exemplo a seguir:
public class SuperClasseTesteConstrutor {
int valor;
SuperClasseTesteConstrutor(int umValor) {//O construtor aqui DEVE receber um parmetro;
this.valor = umValor;
}
As classes abstract tem construtores e eles so chamados sempre que uma subclasse
concreta instanciada;
As interfaces NO tem construtores. Elas NO fazem parte da rvore de herana de um
objeto;
A nica maneira de chamar um construtor dentro de um construtor. NUNCA de dentro
de um mtodo normal;
classe Foo {
Foo() { //O que o compilador insere...
super();
}
}
O Que Acontecer se o Construtor da Superclasse Tiver Argumentos?
Esta sesso fala exatamente do problema que informei a pouco, descrita no exemplo abaixo:
public class SuperClasseTesteConstrutor {
int valor;
SuperClasseTesteConstrutor(int umValor) {//O construtor aqui DEVE receber um parmetro;
this.valor = umValor;
}
}
public class TesteConstrutor extends SuperClasseTesteConstrutor {
public int numero = 10;
private TesteConstrutor() {
super(1);//Se remover a chamada a super(1), ocorre ERRO, pois a chamada default do
compilador a super() ir falhar, uma vez que a superclasse tem um construtor que declara
um parmetro!
}
public static void main(String [] args) {
TesteConstrutor testeConstrutor = new TesteConstrutor();
System.out.println(testeConstrutor.numero);
}
}
Construtores Sobrecarregados
A nica coisa importante a observar nessa sesso:
Quando usamos a chamada this(), ou this(valor)...estamos chamando alguma construtor da
mesma classe. Esta chamada retarda a chamada ao mtodo super() que ser feita por
alguma construtor desta mesma classe. Exemplo:
public class Pg82_ArrayString {
String name;
String makeRandomName() {
int x = (int) (Math.random() * 5);
String name = new String[] {"Ab","cd","ef","gh"} [x]; /**Esta linha equivalente ao
seguinte cdigo:
String [] nameList = {"Ab","cd","ef","gh"};
String name = nameList[x];
**/
return name;
}
Pg82_ArrayString () {
this("aa");
}
Pg82_ArrayString (String aa) {
}
O construtor sem argumentos esta fazendo uma chamada para o construtor com argumentos
utilizando this(aa).
IMPORTANTE! A primeira linha de um construtor deve ser uma chamada a super() ou a this().
Se no houver nenhuma dessas chamadas, o compilaor inserir a chamada sem argumentos
a super(). Portanto, se a primeira linha de um construtor for this(), o compilador saber que
no ser este construtor que chamar super(). Um mtodo no pode ter uma chamada a
this() e a super(). Onde houver um, no haver o outro, regra padro!
Variveis e Mtodos Estticos
Um membro static (variavel ou mtodo) no pode chamar um membro no static (varivel ou
mtodo). Isto o que dito nesta sesso!
public Foo {
int x = 3; float y = 4.3g;
public static void main(String [] args) {
for (int z = x; z < ++x; z-, y = y+z) { //ATENO! As variveis x e z no podem
ser chamadas de um mtodo esttico!
}
}
Acessando Variveis e Mtodos Static
Exemplo:
public class Frog {
int frogSize = 0;
static int frogCount = 0;
public int getFrogSize() {
return this.frogSize;
}
public Frog(int s) {
frogSize = s;
}
public Frog() {
frogCount =+ 1;
}
public static void main(String[] args) {
Frog f = new Frog(25);
System.out.println(f.getFrogSize());
new Frog();
new Frog();
new Frog();
System.out.println("frogCount: "+Frog.frogCount); //Acessando um membro static atravs
do nome da classe.
System.out.println(f.frogCount); //Acessando um membro static atravs de uma instncia
da classe. Aqui, o que importa o tipo da varivel f, onde neste caso, o
//tipo Frot, portanto, possvel acessar os membros estticos de Frog.
}
}
Acoplamento e Coeso
Acoplamento: Grau em que uma classe conhece outra classe. Tem a ver com a forma como as
classes interagem umas com as outras. Se o nico conhecimento que a classe A tem sobre a
classe B o que a classe B exps atravs da sua interface, ento diz-se das classes A e B que
elas possuem baixo acoplamento. Isso bom!
Exemplo de acoplamento forte:
public class DoTaxes {
float rate;
float doColorado() {
SalesTaxRates str = new SalesTaxRates();
rate = str.salesRate; //Deveria ser uma chamada a mtodo:
str.getSalesRate("CO");
return rate;
}
}
public class SalesTaxRates {
public float salesRate; //deveria ser private
public float adjustedSalesRate; //deveria ser private
public float getSalesRate(String region) {
salesRate = new DoTaxes().doColorado();
//Faz calculos com base na regio
return adjustedSalesRate;
}
}
Variveis publicas, sem encapsulamento, permitem que a classe DoTaxes saiba o valor da
varivel salesRate na classe SalesTaxRates. Portanto, DoTaxes sabe demais sobre
SalesTaxRates, portanto, tem um forte acoplamento.
Coeso
Tem a ver com o grau em que uma classe tem um nico e bem-focado propsito. Quanto
mais focada for uma classe, maior a coeso. Isso bom!