Embora os métodos sejam executados em resposta a
chamadas de objetos, isto nem sempre é verdade
▪ Eventualmente, um método pode executar ações que não
são dependentes do conteúdo de um determinado objeto;
▪ Tais métodos devem ser declarados static.
Métodos static podem ser invocados utilizando-se o
nome da classe seguido de . e o nome do método
[Link](argumentos);
De fato, esta é uma boa prática, para indicar que o
método é static.
1
2
A classe Math está definida no pacote [Link]
▪ Fornece uma coleção de métodos static que realizam
cálculos matemáticos comuns;
▪ Não é necessário instanciar um objeto da classe para
poder utilizar seus métodos;
▪ Por exemplo:
[Link](900.00);
Os argumentos destes métodos podem ser
constantes, variáveis ou expressões.
3
Método Descrição Exemplo
abs( 23.7 ) é 23.7
abs(x) Valor absoluto de x abs( 0.0 ) é 0.0
abs( -23.7 ) é 23.7
Arredonda x para o menor inteiro maior ceil( 9.2 ) é 10.0
ceil(x)
que x ceil( -9.8 ) é -9.0
cos(x) Cosseno de x (x em radianos) cos( 0.0 ) é 1.0
exp( 1.0 ) é 2.71828
exp(x) Exponencial ex
exp( 2.0 ) é 7.38906
Arredonda x para o menor inteiro não floor( 9.2 ) é 9.0
floor(x)
maior que x floor( -9.8 ) é -10.0
log( Math.E ) é 1.0
log(x) Logaritmo natural de x (base e)
log( Math.E * Math.E ) é 2.0
4
Método Descrição Exemplo
max( 2.3, 12.7 ) é 12.7
max(x,y) Maior valor entre x e y
max( -2.3, -12.7 ) é -2.3
min( 2.3, 12.7 ) é 2.3
min(x,y) Menor valor entre x e y
min( -2.3, -12.7 ) é -12.7
pow( 2.0, 7.0 ) é 128.0
pow(x,y) x elevado a y (xy)
pow( 9.0, 0.5 ) é 3.0
sin(x) Seno de x (x em radianos) sin( 0.0 ) é 0.0
sqrt(x) Raiz quadrada de x sqrt( 900.0 ) é 30.0
tan(x) Tangente de x (x em radianos) tan( 0.0 ) é 0.0
5
Declaradas public final
static
▪ Todas as classes podem
Constante Valor
utilizar;
[Link] 3.14159265358979323846 ▪ São constantes;
Math.E 2.7182818284590452354 ▪ Podem ser acessadas
pelo nome da classe;
▪ Somente uma cópia.
6
7
A promoção de argumentos consistem em
converter o tipo de um argumento
▪ Por exemplo, o método [Link] espera um double, mas
pode ser invocado passando-se um int como argumento;
▪ A promoção é realizada automaticamente, desde que se
respeite as regras de promoção
▪ Especifica quais conversões podem ser realizadas sem a perda de
dados.
▪ Em uma expressão com dois ou mais tipos primitivos
diferentes, cada valor é promovido ao tipo “mais
abrangente”.
8
Tipo Promoções Válidas
double Nenhuma
float double
long float ou double
int long, float ou double
char int, long, float ou double
short int, long, float ou double (mas não char)
byte short, int, long, float ou double (mas não char)
boolean Nenhuma (valores booleanos não são considerados números em Java)
9
Considerando a tabela anterior, não é possível
realizar a promoção de argumentos de tipos “mais
altos” para tipos “mais baixos”;
No entanto, é possível realizar o cast explícito
▪ Assumindo o risco de erros de truncamento.
Suponha que o método abaixo só aceita valores
inteiros:
raizQuadrada((int) valorDouble);
10
11
Métodos com o mesmo nome podem ser declarados
dentro de uma mesma classe
▪ Desde que possuam um conjunto diferente de
parâmetros;
▪ Sobrecarga de métodos.
Quando um método sobrecarregado é invocado, o
compilador Java seleciona o método apropriado
▪ De acordo com o número, tipo e ordem dos argumentos
passados para o método.
Desta forma, podemos ter um conjunto de métodos
com o mesmo nome que realizam o mesmo tipo de
operação sobre argumentos diferentes.
12
Por exemplo, os métodos abs(), min() e max() da
classe Math são sobrecarregados, cada um com
quatro versões:
▪ Uma com dois argumentos double;
▪ Uma com dois argumentos float;
▪ Uma com dois argumentos int;
▪ Uma com dois argumentos long.
Vejamos um exemplo de métodos que calculam
o quadrado de um número int ou double.
13
public class Sobrecarga
{
int quadrado(int num)
{
return num*num;
}
double quadrado(double num)
{
return num*num;
}
public void print()
{
[Link]("Quadrado de 7.5 e: %f", quadrado(7.5));
[Link]("\nQuadrado de 7 e: %d", quadrado(7));
}
}
14
public class TesteSobrecarga
{
public static void main(String args[])
{
Sobrecarga teste = new Sobrecarga();
[Link]();
}
}
15
Note que somente o tipo de retorno de um método
não é suficiente para que o compilador o diferencie
de outro com assinatura parecida
▪ Erro de compilação.
▪ Exemplo:
int quadrado(int num)
long quadrado(int num)
16
Java permite que objetos de uma mesma
classe sejam inicializados de formas
diferentes
▪ Através da sobrecarga de construtores;
▪ Basta definir múltiplos construtores com
assinaturas diferentes
▪ Número e tipo de argumentos.
17
public class Tempo
{
private int h, m, s;
public Tempo(int hora, int minuto, int segundo)
public Tempo() {
{ h = hora;
h = m = s = 0; m = minuto;
} s = segundo;
}
public Tempo(int hora)
{ public static void main(String args[])
h = hora; {
m = s = 0; Tempo t = new Tempo();
} Tempo t2 = new Tempo(12);
Tempo t3 = new Tempo(12, 30);
public Tempo(int hora, int minuto) Tempo t4 = new Tempo(12, 30, 00);
{ }
h = hora; }
m = minuto;
s = 0;
}
18
Java permite que outros métodos possuam o
mesmo nome que a classe
▪ Embora não se tratem de construtores;
▪ Não são chamados quando um objeto da classe é criado;
▪ Possuem tipo de retorno.
Um erro comum é colocar um tipo de retorno em
um método com o mesmo nome da classe e
confundi-lo com um construtor.
19
public class ConstrutorFalso
{
public int ConstrutorFalso()
{
[Link]("Um objeto foi criado?");
return 1;
}
public ConstrutorFalso()
{
[Link]("Um objeto foi criado!");
}
public static void main(String args[])
{
ConstrutorFalso obj = new ConstrutorFalso();
}
}
20
21
Uma classe Java pode ter referências a
objetos de outras classes como membros
▪ Composição, ou relacionamento tem-um.
Por exemplo, um despertador precisa saber o
horário atual
▪ É razoável embutir duas referências a objetos de
uma classe Hora como membros da classe
Despertador.
22
public class Hora
{
public void setH(int valor)
private int h, m, s;
{
h = valor;
public int getH()
}
{
return h;
public void setM(int valor)
}
{
m = valor;
public int getM()
}
{
return m;
public void setS(int valor)
}
{
s = valor;
public int getS()
}
{
}
return s;
}
23
public class Despertador
{
boolean ligado;
Hora despertador, horarioAtual;
public void setDespertador (int h, int m, int s, boolean valor)
{
[Link](h);
[Link](m);
[Link](s);
ligado = valor;
}
public void setHorarioAtual (int h, int m, int s)
{
[Link](h);
[Link](m);
[Link](s);
}
}
24
public class TesteDespertador
{
public static void main(String args[])
{
Despertador d = new Despertador();
[Link](11, 30, 05);
[Link](07, 0, 0, true);
}
}
25
26
Uma enumeração, em sua forma mais
simples, declara um conjunto de constantes
representadas por um identificador
▪ É um tipo especial de classe, definida pela palavra
enum e um identificador;
▪ Como em classes, { e } delimitam o corpo de uma
declaração;
▪ Entre as chaves, fica uma lista de constantes de
enumeração, separadas por vírgula
▪ Cada uma representando um valor único.
27
import [Link];
public class Baralho
{
private enum Naipe {COPAS, PAUS, OUROS, ESPADAS};
private enum Valor {A, DOIS, TRES, QUATRO, CINCO, SEIS, SETE, OITO, NOVE, DEZ, J, Q, K};
public void sorteiaCarta()
{
//pode conter COPAS, PAUS, OUROS ou ESPADAS
Naipe cartaNaipe;
//pode conter uma das constantes do enum Valor
Valor cartaValor;
int numero;
Random aleatorio = new Random();
switch([Link](4))
{
case 0: cartaNaipe = [Link]; break;
case 1: cartaNaipe = [Link]; break;
case 2: cartaNaipe = [Link]; break;
case 3: cartaNaipe = [Link];
}
28
int temp = 1+[Link](13);
switch (temp)
{
case 1: cartaValor = Valor.A; break;
case 2: cartaValor = [Link]; break;
case 3: cartaValor = [Link]; break;
case 4: cartaValor = [Link]; break;
case 5: cartaValor = [Link]; break;
case 6: cartaValor = [Link]; break;
case 7: cartaValor = [Link]; break;
case 8: cartaValor = [Link]; break;
case 9: cartaValor = [Link]; break;
case 10: cartaValor = [Link]; break;
case 11: cartaValor = Valor.J; break;
case 12: cartaValor = Valor.Q; break;
case 13: cartaValor = Valor.K; break;
}
}
}
29
Variáveis do tipo Naipe só podem receber valores
definidos na enumeração
▪ Caso contrário, ocorrerá erro de compilação.
Cada valor é acessado como um membro, separado
do nome da enumeração pelo operador .;
Por padrão, utiliza-se apenas letras maiúsculas para
denotar as constantes de uma enumeração;
Uma constante de enumeração
▪ Não pode ser impressa (sem cast);
▪ Não pode ser comparada (a princípio) com tipos
primitivos.
30
Um enum é implicitamente declarado como final
▪ Também são implicitamente declarados como static;
▪ Qualquer tentativa de criar um objeto de um enum com o
operador new resulta em erro de compilação.
Um enum pode ser utilizado em qualquer situação
em que constantes possam ser utilizadas
▪ Rótulos de case;
▪ For aprimorado.
31
32
Um enum pode ser mais do que um simples
conjunto de constantes
▪ De fato, um enum pode ter atributos, construtores e
métodos;
▪ Cada constante é na verdade um objeto, com suas
próprias cópias dos atributos;
▪ Como em uma classe.
33
public enum Book
{
//declara as constantes do enum
JHTP6( "Java How to Program 6e", "2005" ),
CHTP4( "C How to Program 4e", "2004" ),
IW3HTP3( "Internet & World Wide Web How to Program 3e", "2004" ),
CPPHTP4( "C++ How to Program 4e", "2003" ),
VBHTP2( "Visual Basic .NET How to Program 2e", "2002" ),
CSHARPHTP( "C# How to Program", "2002" );
//atributos
private final String title;
private final String copyrightYear;
// construtor
Book( String bookTitle, String year )
{
title = bookTitle;
copyrightYear = year;
}
34
//getter
public String getTitle()
{
return title;
}
//getter
public String getCopyrightYear()
{
return copyrightYear;
}
}
35
//importado por causa do método range
import [Link];
public class EnumTest
{
public static void main( String args[] )
{
[Link]( "Todos os livros:\n" );
// imprime todos os livros do enum Book
for (Book book: [Link]())
[Link]( "%-10s%-45s%s\n", book, [Link](),
[Link]());
[Link]( "\nImprimindo um intervalo de constantes:\n" );
// imprime os quatro primeiros livros
for (Book book : [Link](Book.JHTP6, Book.CPPHTP4))
[Link]( "%-10s%-45s%s\n", book, [Link](),
[Link]());
}
}
36
Todos os livros:
JHTP6 Java How to Program 6e
2005
CHTP4 C How to Program 4e 2004
IW3HTP3 Internet & World Wide Web How to Program 3e 2004
CPPHTP4 C++ How to Program 4e 2003
VBHTP2 Visual Basic .NET How to Program 2e 2002
CSHARPHTP C# How to Program 2002
Exibindo um intervalo de constantes do enum:
JHTP6 Java How to Program 6e
2005
CHTP4 C How to Program 4e 2004
IW3HTP3 Internet & World Wide Web How to Program 3e 2004
CPPHTP4 C++ How to Program 4e
2003
37
O método estático values() retorna um vetor de constantes
do enum
▪ Na ordem em que foram declaradas;
▪ Criado automaticamente para cada enum.
Quando uma constante é convertida para String, o próprio
identificador é o conteúdo da string.
O método range() da classe EnumSet é utilizado para
determinar um intervalo dentro de um enum
▪ Retorna um EnumSet que contém as constantes do intervalo,
incluindo os limites;
▪ Também pode ser percorrido por um for aprimorado.
38
Continua na
próxima aula...
39
40
Uma declaração static import permite que
referenciemos membros static importados como
se fossem declarados na classe em que os usa
▪ O nome da classe e o operador . não são necessários.
Existem duas sintaxes para um static import
▪ Uma que importa apenas um membro static em
particular (single static import);
▪ Uma que importa todos os membros static de uma
classe (static import on demand).
41
Single static import
import static [Link];
Static import on demand
import static [Link].*;
42
//static import on demand
import static [Link].*;
public class StaticImportTest
{
public static void main( String args[] )
{
[Link]( "sqrt( 900.0 ) = %.1f\n", sqrt(900.0));
[Link]( "ceil( -9.8 ) = %.1f\n", ceil(-9.8));
[Link]( "log( E ) = %.1f\n", log(E));
[Link]( "cos( 0.0 ) = %.1f\n", cos(0));
}
}
43
Note que não é necessário utilizar o nome da
classe Math para invocar os métodos sqrt,
ceil, log e cos.
44
45
À medida em que as aplicações se tornam
mais complexas, pacotes nos ajudam a
gerenciar nossos componentes
▪ Também facilitam o reuso de software ao permitir
que nossos programas importem classes de
outros pacotes;
▪ Adicionalmente, ajudam a resolver problemas de
conflito de nomes, fornecendo uma padronização.
46
Para criar um pacote, é necessário:
▪ Declare uma classe pública
▪ Se não for pública, só poderá ser utilizada por outras
classes do mesmo pacote.
▪ Defina um nome para o pacote e adicione a
declaração de pacote ao código fonte
▪ Só pode haver uma declaração de pacote por código-
fonte, e deve preceder todas as outras declarações no
arquivo.
▪ Compilar a classe
▪ Ela será armazenada no diretório adequado.
47
//define a criação do pacote
package [Link];
public class Classe
{
//método de exemplo
public void print()
{
[Link]("Este é um pacote de exemplo!");
}
}
48
As classes que definem o pacote devem ser
compiladas apropriadamente para que seja gerada a
estrutura de diretórios
javac –d . [Link]
O . indica que a estrutura de diretórios deve ser criada
a partir do diretório atual
▪ Cada nome separado por . no nome do pacote define um
diretório;
br
ufop
decom
[Link]
49
//importa a classe criada no pacote
import [Link];
public class TestePacote
{
public static void main(String args[])
{
//instancia um objeto da classe de exemplo
Classe obj = new Classe();
//invoca o método estático da classe
//definida no pacote
[Link]();
}
}
50
Uma vez que a classe foi compilada e armazenada
em seu pacote, ela pode ser importada em outros
programas;
Quando a classe que importa é compilada, o class
loader procura os arquivos .class importados:
▪ Nas classes padrão do JDK;
▪ No pacotes opcionais;
▪ No classpath
▪ Lista de diretórios em que as classes estão localizadas.
51
Por padrão, o classpath consiste apenas do diretório
atual, porém, pode ser modificado:
▪ Através da opção –classpath no compilador javac;
▪ Ajustando a variável de ambiente CLASSPATH
▪ Uma variável especial mantida pelo sistema operacional para que as
aplicações procurem pelas classes em locais especificados.
Para maiores informações sobre como ajustar o
classpath em Linux e Windows
[Link]/javase/6/docs/technotes/tools/[Link]
52
Para o nosso exemplo:
javac –d . [Link]
javac [Link] –classpath ./br/ufop/decom/pacote
53
54
Se um modificador de acesso não for especificado
para um método ou atributo de uma classe, ele terá
acesso de pacote
▪ Em um programa de uma única classe, não há efeito;
▪ Caso contrário, qualquer classe do pacote poderá acessar
os membros de outra classe através de uma referência a
um objeto dela.
Classes armazenadas e compiladas em um mesmo
diretório são consideradas como pertencentes a um
mesmo pacote
▪ O pacote default.
55
public class PackageDataTest
{
public static void main( String args[] )
{
PackageData packageData = new PackageData();
//imprime a representação em String
[Link]( "Depois de instanciado:\n%s\n", packageData );
//altera os atributos do objeto diretamente
[Link] = 77;
[Link] = "Goodbye";
//imprime a representação em String
[Link]( "\nDepois de alterar os valores:\n%s\n", packageData );
}
}
56
class PackageData
{
//atributos com acesso de pacote
int number;
String string;
//construtor
public PackageData()
{
number = 0;
string = "Hello";
}
//converte e retorna a representação em String
public String toString()
{
return [Link]( "numero: %d; string: %s", number, string );
}
}
57
Depois de instanciado:
numero: 0; string: Hello
Depois de alterar os valores: numero: 77;
string: Goodbye
58
Perguntas?
59
Herança
Especificadores de Acesso
Classe Object
Exemplo
Construtores em Subclasses
Compilação
Redefinição de Métodos
Engenharia de Software com Herança
60
FIM
61