Você está na página 1de 46

Programação OO

3ª parte

Jobson Massollar
jobson.silva@uva.br
Métodos Estáticos

 Nos exemplos e exercícios implementados até agora, sempre


executamos métodos a partir de objetos da classe. Exemplos:

r1.mover(10, 20); // move o objeto r1


r2.deslocar(-5, 10); // desloca o objeto r2

 Em alguns casos precisamos implementar alguns métodos que


independem dos objetos de uma classe.

 Normalmente esses métodos implementam serviços que estão


associados à classe e não a um objeto específico.

2 Programação OO
Métodos Estáticos

 Se pensarmos na implementação do método para calcular a raiz


quadrada, qual seria o objeto sobre o qual aplicaríamos esse método ?

 Pense, nas demais funções matemáticas: seno, coseno, tangente,


exponenciação, valor absoluto, logaritmo, arredondamento, etc.

 Nesse caso, o que queremos na realidade é implementar um conjunto


de funções matemáticas que independem de um objeto específico.

 Nesse caso, chamamos esses métodos de métodos da classe, que são


implementados usando a palavra static.

3 Programação OO
Métodos Estáticos

 No Java existe uma classe bastante usada que implementa funções


matemáticas chamada Math.

 Todos os métodos dessa classe são estáticos, isto é não dependem de


nenhum objeto para serem executados.

public class Math {


public static double sqrt(double x) { ... }
public static long round(double x) { ... }
public static double pow(double x, double y) { ... }
}

4 Programação OO
Métodos Estáticos

 A principal diferença entre os métodos estáticos e os métodos de


instância está na sua chamada.

 Nos métodos estáticos não precisamos do objeto para chamar o


método.

 Ao invés disso, usamos o próprio nome da classe para chamá-los.

 Exemplos:

double x = 12.2;
double y = Math.sqrt(x); // calcula a raiz quadrada de x
long z = Math.round(y); // arredonda o valor de y

5 Programação OO
Métodos Estáticos – Classe Math
Método Descrição

abs(x) Retorna o valor absoluto de x. x pode ser do tipo int, long, float ou double.
double acos(double x) Retorna o arco coseno do parâmetro x
double asin(double x) Retorna o arco seno do parâmetro x
double atan(double x) Retorna o arco tangente do parâmetro x
double ceil(double x) Retorna o menor inteiro maior que x
double cos(double x) Retorna o coseno de x
double exp(double x) Retorna a constante de Euller e elevada a x
double floor(double x) Retorna o maior inteiro menor que x
double log(double x) Retorna o logaritmo natural de x
max(x, y) Retorna o maior valor entre x e y. x e y podem ser do tipo int, long, float ou double.
min(x, y) Retorna o menor valor entre x e y. x e y podem ser do tipo int, long, float ou double.
double pow(double x, double y) Retorna xy
double random() Retorna um número aleatório maior ou igual a ZERO e menor que UM
long round(double x) Retorna o inteiro mais próximo de x
double sin(double x) Retorna o seno de x

double tan(double x) Retorna a tangente de x


double sqrt(double x) Retorna a raiz quadrada de x

6 Programação OO
Exercícios

 Exercício 23: implemente na classe Circulo o método:

float distancia(Circulo outroCirculo)

que calcula a distância de um círculo a outro.

Dica: a distância entre dois pontos é dada pela fórmula:

d xb  xa 2   yb  ya 2

7 Programação OO
Atributos Estáticos

 Vimos anteriormente que métodos estáticos são métodos acessados


diretamente pela classe e não por um objeto específico.

 Na classe Math, os métodos estáticos foram usados para criar uma


biblioteca de métodos que implementam funções matemáticas.

 Entretanto, também é possível definir atributos estáticos.

 No caso de atributos estáticos só existe UMA cópia desse atributo na


memória que é COMPARTILHADA por todos os objetos da classe.

 Assim como os métodos estáticos, os atributos estáticos são chamados


atributos da classe, ou seja, podem ser acessados diretamente a partir
da classe.

8 Programação OO
Atributos Estáticos

 Exemplo: Independentemente de quantos


objetos sejam criados, só existe uma
public class Carro { área de memória para o atributo
qtdeCarros.
private int anoFabricacao;
static private int qtdeCarros = 0; Essa área de memória é
compartilhada por todos os objetos.
public Carro(int ano) {
anoFabricacao = ano;
// Cada vez que eu crio um objeto Carro, eu incremento o contador
qtdeCarros ++;
}
Esse método só pode ser chamado pelo
public int getAnoFabricacao() { objeto.
return anoFabricacao;
}

public static int getQtdeCarros() { Esse método é estático e deve ser


return qtdeCarros; chamado pela classe.
}
}
9 Programação OO
Atributos Estáticos

 Exemplo (continuação):
Será impresso:
public class Concessionaria { Ano de c1 = 2008
public static void main(String args[]) { Ano de c2 = 2011
Carro c1 = new Carro(2008); Ano de c3 = 2012
Carro c2 = new Carro(2011); Ano de c4 = 2010
Qtde de carros = 4
Carro c3 = new Carro(2012);
Carro c4 = new Carro(2010);

System.out.println("Ano de c1 = " + c1.getAnoFabricacao());


System.out.println("Ano de c2 = " + c2.getAnoFabricacao());
System.out.println("Ano de c3 = " + c3.getAnoFabricacao());
System.out.println("Ano de c4 = " + c4.getAnoFabricacao());

System.out.println("Qtde de carros = " + Carro.getQtdeCarros());


}
}

10 Programação OO
Atributos Estáticos

 Exemplo (continuação): o que acontece na memória nesse caso ?

public class Concessionaria {


public static void main(String args[]) { anoFabricacao = 2008

Carro c1 = new Carro(2008);


anoFabricacao = 2011
Carro c2 = new Carro(2011);
qtdeCarros= 4
Carro c3 = new Carro(2012); anoFabricacao = 2012

Carro c4 = new Carro(2010);


anoFabricacao = 2010

System.out.println("Ano de c1 = " + c1.getAnoFabricacao());


System.out.println("Ano de c2 = " + c2.getAnoFabricacao()); Memória compartilhada
System.out.println("Ano de c3 = " + c3.getAnoFabricacao()); pelos objetos !
System.out.println("Ano de c4 = " + c4.getAnoFabricacao());
Qualquer alteração nesse
atributo realizado por um
System.out.println("Qtde de carros = " + Carro.getQtdeCarros()); objeto é "enxergado" por
} todos os objetos dessa
} classe.

11 Programação OO
Métodos e Atributos Estáticos

 Algumas diferenças importantes:

Métodos de Instância Métodos Estáticos


Só podem ser chamados a partir de São chamados a partir da própria classe.
objetos da classe.
Podem acessar (ler ou alterar) atributos da Só podem acessar (ler ou alterar)
instância ou atributos da classe atributos da classe (estáticos).
(estáticos).

12 Programação OO
Atributos Estáticos

 Podemos definir atributos estáticos públicos junto com a palavra final


para criar constantes que pertencem a uma classe.

 Um exemplo é a constante PI que está definida na classe Math:

public class Math {


public static final double PI = 3.14159;
}

 Assim, para usar PI usamos a classe Math:

double raio = 7.5;


double area = Math.PI * Math.pow(raio, 2); // R2

13 Programação OO
Strings

 Java não possui um tipo primitivo string como em algumas outras linguagens
(VB, Delphi).

 A biblioteca de classes do Java possui uma classe pré-definida chamada


String.

 Logo, em Java, strings não são tipos primitivos e sim objetos.

 A declaração de um objeto String segue o mesmo padrão de declaração das


variáveis de tipos básicos:
A concatenação de strings
String mensagem; é feita com o operador +
String nome = "Joao da Silva";
String saudacao = "Olá " + nome;
String vazia = "";

 Entretanto, por ser um objeto não precisaríamos do operador new e de um


construtor ?
14 Programação OO
Strings

 Na realidade, por ser muito usado, o Java simplifica a chamada do construtor


da classe String.

 Exemplo:

String str = "abc";

É equivalente a:

char[] data = { 'a', 'b', 'c' };


"abc"
String str = new String(data);

15 Programação OO
Strings

 A classe String possui mais de 60 métodos para manipulação de strings.

 Alguns dos métodos mais usados são definidos a seguir:

16 Programação OO
Strings
Método Descrição

char charAt(int n) Retorna o caracter na n-ésima posição (começa a partir do ZERO)


int compareTo(String outra) Compara a string com outra. Retorna –1, 0 ou 1 caso a string seja menor, igual ou
maior que a outra, respectivamente
boolean endsWith(String sufixo) Verifica se a string termina com o sufixo
boolean equals(String outra) Compara a string com o objeto (case-sensitive)
boolean equalsIgnoreCase(String outra) Compara a string com o objeto ignorando maiúsculas e minúsculas
int indexOf(char ch) Retorna a primeira ocorrência de ch na string ou -1 se não existir
int indexOf(String str) Retorna a primeira ocorrência de str na string ou -1 se não existir
int indexOf(String str, int n) Retorna a primeira ocorrência de str na string começando a busca na posição n
int lastIndexOf(String str) Retorna a última ocorrência de str na string ou -1 se não existir
int lastIndexOf(String str, int n) Retorna a última ocorrência de str na string começando a busca na posição n
int length() Retorna o tamanho da string em caracteres
String replace(char velho, char novo) Substitui todas as ocorrências do caracter velho pelo novo
Boolean startsWith(String prefixo) Verifica se a string inicia com o prefixo
String substring(int inicio) Retorna a substring que começa na posição início até o fim da string
String substring(int inicio, int fim) Retorna a substring da posição inicio até fim-1
String toLowerCase() Retorna a string convertida para letras minúsculas

String toUpperCase() Retorna a string convertida para letras maiúsculas


String trim() Retira os espaços em branco no início e no fim da string
17 Programação OO
Strings

 String, em Java, são imutáveis.

 Isso significa dizer que, uma vez criadas, não podemos alterar o conteúdo de
uma string.

 Quando usamos um método que "altera" a string, na realidade estamos


gerando uma cópia alterada da string.

 Exemplo: "Linguagem de Programação II"

String disciplina = "Linguagem de Programação II";


"LINGUAGEM DE PROGRAMAÇÃO II"
String maiuscula = disciplina.toUpperCase();

String inicio = disciplina.substring(0, 9); "Linguagem"

String outra = maiuscula.replace(' ', '-');


"LINGUAGEM-DE-PROGRAMAÇÃO-II"

18 Programação OO
Strings

 Outro exemplo: "Linguagem"

String disciplina = "Linguagem";

disciplina = disciplina + " de ";

disciplina = disciplina + "Programação";

disciplina = disciplina + " II";

19 Programação OO
Strings

 Outro exemplo: "Linguagem"

String disciplina = "Linguagem";


"Linguagem de"

disciplina = disciplina + " de ";

disciplina = disciplina + "Programação";

disciplina = disciplina + " II";

20 Programação OO
Strings

 Outro exemplo: "Linguagem"

String disciplina = "Linguagem";


"Linguagem de "

disciplina = disciplina + " de ";


"Linguagem de Programação"
disciplina = disciplina + "Programação";

disciplina = disciplina + " II";

21 Programação OO
Strings

 Outro exemplo: "Linguagem" O Java irá descartar


automaticamente
esses objetos
String disciplina = "Linguagem"; quando necessário.
"Linguagem de "

disciplina = disciplina + " de ";


"Linguagem de Programação"
disciplina = disciplina + "Programação";

disciplina = disciplina + " II"; "Linguagem de Programação II"

 Ou seja, se alteramos com muita frequência uma string, temos uma perda de
desempenho relacionada à cópia dessa string para um novo objeto. E quanto
maior a string, pior o desempenho.

 Por isso, para programas que trabalham intensamente com strings use a classe
StringBuilder.

22 Programação OO
Strings

 Um detalhe muito importante da manipulação de strings é em relação à


comparação de strings.

 Como strings são objetos, se usarmos os operadores relacionais (==, !=, >, <,
>= ou <=) estaremos comparando as referências para as strings e não o
conteúdo das strings.

 Por isso não podemos usar os operadores relacionais (==, !=, >, <, >= ou
<=) para comparar strings.

 Para realizar a comparação do conteúdo devemos usar os métodos:


equals()
equalsIgnoreCase()
compareTo()
compareToIgnoreCase()

23 Programação OO
Strings

 Exemplo 1:

Scanner t = new Scanner(System.in); nome1


"Joao" nome1 == nome3
String nome1 = t.nextLine(); nome3

String nome2 = t.nextLine();


"Joao" nome1 != nome2
nome2
String nome3 = nome1;

Quando comparamos
if (nome1 == nome2) nome1 == nome2
System.out.println("Igual"); estamos comparando se a área de
else memória referenciada é a mesma e
System.out.println("Diferente"); não se o conteúdo é o mesmo.
Nesse caso vai imprimir "Diferente"

24 Programação OO
Strings

 Exemplo 2:

Scanner t = new Scanner(System.in); nome1


"Joao" nome1 == nome3
String nome1 = t.nextLine(); nome3

String nome2 = t.nextLine();


"Joao" nome1 != nome2
nome2
String nome3 = nome1;

if (nome1.equals(nome2)) Com o método equals() estamos


System.out.println("Igual"); comparando os conteúdos.
else Nesse caso vai imprimir "Igual"
System.out.println("Diferente");

25 Programação OO
Strings

 Exemplo 3:

Scanner t = new Scanner(System.in); nome1


"Joao" nome1 == nome3
String nome1 = t.nextLine(); nome3

String nome2 = t.nextLine();


"Joao" nome1 != nome2
nome2
String nome3 = nome1;

if (nome1.compareTo(nome2) == 0)
System.out.println("Igual"); O método compareTo() retorna:
else
• um valor < 0 se nome1 < nome2
System.out.println("Diferente");
• um valor > 0 se nome1 > nome2
• um valor = 0 se nome1 = nome2

A comparação é feita usando a ordem


do dicionário.

26 Programação OO
Strings

 Exemplos de resultados de s1.compareTo(s2):

S1 S2 Resultado Descrição
"a" "b" <0 "a" < "b"
"A" "a" <0 "A" < "a"
Letras maiúsculas vem ANTES de letras minúsculas
"JOAO" "joao" <0 "JOAO" < "joao"
Letras maiúsculas vem ANTES de letras minúsculas
"joao" "ana" >0 "joao" > "ana"
"joao" "Pedro" >0 "joao" > "Pedro"
P maiúsculo vem ANTES do j minúsculo
"123" "joao" <0 "123" < "joao"
Dígitos vem ANTES de letras maiúsculas ou
minúsculas
"11" "2" <0 "11" < "2"
A comparação é feita como string e não como
número

27 Programação OO
Strings

 Também é possível usar literais nas comparações de strings:

Scanner t = new Scanner(System.in);


String nome1 = t.nextLine();
String nome2 = t.nextLine();
String nome3 = nome1;

if (nome1.compareTo("Jose") < 0)
System.out.println(nome1 + " vem antes de Jose");
else if (nome1.compareTo("Jose") > 0)
System.out.println(nome1 + " vem depois de Jose");

if (nome2.equalsIgnoreCase("JOAO"))
System.out.println("Igual");
else
System.out.println("Diferente");

28 Programação OO
Strings

 Exercício 24: implemente a classe CadeiaDeCaracteres com um construtor que


recebe uma string como parâmetro. Em seguida implemente os métodos:

a) public int contaVogais(): que retorna a quantidade de vogais da string


b) public String semVogais(): que retorna a string sem vogais
c) public String alfabeto(): que retorna uma string com as letras que fazem
parte da string (sem repetições)
d) public String intersecao(String outra): que retorna uma string com as letras
em comum entre a string str e a string outra.
e) public String vogais(): que retorna uma string com as vogais que fazem
parte da string (sem repetições)

29 Programação OO
Vetores

 Semelhante ao C/C++, o Java também dá suporte à vetores e matrizes


multidimensionais.

 Entretanto, existem algumas diferenças importantes. A primeira delas é que,


em Java, vetores são objetos.

 Para declarar um vetor, usamos o operador [] imediatamente após o tipo


desejado:

int[] v;
float[] notas;

 Outra diferença importante é que, ao declarar um vetor, NÃO definimos o seu


tamanho.

 Isso significa dizer que, ao declarar um vetor, o Java NÃO aloca espaço na
memória para o vetor.
30 Programação OO
Vetores

 Em C/C++:

float nota[10];

0 1 2 3 4 5 6 7 8 9

 Em Java:

float[] nota;

NULO

31 Programação OO
Vetores

 Como vetor é um objeto, precisamos criá-lo com o operador new.


Nesse momento definimos o seu tamanho.
Aqui definimos o
float[] nota; tamanho do vetor !
nota = new float[10];

0 1 2 3 4 5 6 7 8 9

0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

O índice inicial é Os elementos do vetor são O índice final é


sempre ZERO inicializados automaticamente sempre o tamanho
da mesma forma que os do vetor - 1
atributos das classes

32 Programação OO
Vetores

 Diferentemente do C/C++, o tamanho do vetor pode ser definido


usando uma variável ou uma expressão.

public class TesteVetor {


public static void main(String[] args) {
Scanner t = Scanner(System.in);
int tam;
float[] v;

System.out.print("Qual o tamanho do vetor ? ");


tam = t.nextInt();

v = new float[tam]; Cria o vetor v usando como


} tamanho a variável tam.
}

33 Programação OO
Vetores

 Atenção: uma vez definido o tamanho do vetor com o operador new


não podemos mais alterar esse tamanho.

public class TesteVetor {


public static void main(String[] args) {
Scanner t = Scanner(System.in);
int tam;
float[] v;

System.out.print("Qual o tamanho do vetor ? ");


tam = t.nextInt();

Nesse caso NÃO estamos


v = new float[tam]; aumentando o vetor v.
No primeiro new criamos um vetor
v = new float[2 * tam]; com tamanho tam.
} No segundo new criamos outro
} vetor com tamanho 2*tam.

34 Programação OO
Vetores

 Cuidado: se você acessar uma área fora do intervalo do vetor, ocorrerá


uma exceção (ArrayIndexOutOfBoundsException) e a execução do
programa será interrompida.

float[] nota;
nota = new float[10];

Erro de execução:
nota[-1] = 7.5;
ArrayIndexOutOfBoundsException
nota[10] = 8.0;

35 Programação OO
Vetores

 Assim como fazemos com variáveis comuns, também podemos


inicializar vetores.

tipo[] nome = { lista de valores };

 onde:
lista de valores é uma lista cujos elementos são separados por vírgula.
Cria automaticamente um
 Exemplos: vetor de 5 posições

float[] nota = { 5.5, 6.5, 7.0, 9.0, 8.0 };


int[] idade = { 30, 22, 45, 12, 65, 48, 72 };

Cria automaticamente um
vetor de 7 posições

36 Programação OO
Vetores

 Para percorrer individualmente cada elemento do vetor usamos o


comando for.

 O atributo length do vetor pode ser usado para recuperar o tamanho


do vetor.

public class Vetor {


public static void main(String[] args) {
int[] v = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

for (int i = 0; i < v.length; i++)


System.out.println(v[i]);
}
Recupera o tamanho
}
do vetor, que é 9
nesse caso.

38 Programação OO
Vetores

 Existe uma outra sintaxe do comando for para percorrer vetores. Essa
forma é usada apenas para ler os dados do vetor, mas não serve para
alterar o vetor.

 Usando essa nova sintaxe, o programa anterior poderia ser reescrito


como:

public class Vetor {


public static void main(String[] args) {
int[] v = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

for (int n : v)
System.out.println(n);
}
}

39 Programação OO
Vetores

 Usando essa nova sintaxe, o programa anterior poderia ser reescrito


como:

public class Vetor {


public static void main(String[] args) {
int[] v = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

Tipo armazenado Variável que


no vetor percorre o vetor
Vetor

for (int n : v)
System.out.println(n);
}
} A cada iteração, a variável n
recebe os valores armazenados
no vetor v, do primeiro até o
último.

40 Programação OO
Exercícios

 Exercício 25: crie um programa para ler as notas de uma turma e


imprimir a média da turma e as notas acima da média. O programa
deverá pedir, inicialmente, o total de notas que serão lidas.

 Exercício 26: crie um programa para ler um número inteiro e imprimi-lo


em notação binária. Assuma que o número terá no máximo 32 bits.

41 Programação OO
Exercícios

 Exercício 27: cria a classe ConjuntoDeReais que deve armazenar um


conjunto de floats usando um vetor. Implemente os métodos:

public ConjuntoDeReais(int qtdMaxima)


public boolean adicionar(float n)
public boolean pertence(float n)
public void imprimir()
public boolean remover(float n)
public int quantidade()
public float media()
public float maior()
public float menor()
public ConjuntoDeReais uniao(ConjuntoDeReais outro)

42 Programação OO
Vetores de Objetos

 Quando usamos um vetor de objetos, ao criar o vetor não estamos


criando os objetos em si, mas apenas referências para os objetos.

 Além do vetor, cada objeto deve ser criado com o operador new.

public class EditorGrafico{


public static void main(String[] args) {
Retangulo[] retangulos;

retangulos = new Retangulo[3];

retangulos[0] = new Retangulo(0, 0, 40, 20);


retangulos[1] = new Retangulo(10, 10, 20, 20);
retangulos[2] = new Retangulo(5, 10, 30);
}
}
43 Programação OO
Vetores de Objetos
public class EditorGrafico{
public static void main(String[] args) {
Retangulo[] retangulos;
Ao declararmos o vetor, a
variável local retangulos tem
retangulos = new Retangulo[3];
um valor indefinido !
retangulos[0] = new Retangulo(0, 0, 40, 20);
retangulos[1] = new Retangulo(10, 10, 20, 20);
retangulos[2] = new Retangulo(5, 10, 30);
}

retangulos
indefinido !

44 Programação OO
Vetores de Objetos
public class EditorGrafico{
Ao criarmos um vetor com
public static void main(String[] args) { 3 posições, alocamos
Retangulo[] retangulos; espaço para referenciar 3
retângulos. Essas
retangulos = new Retangulo[3]; referências são inicializadas
com null.
retangulos[0] = new Retangulo(0, 0, 40, 20);
retangulos[1] = new Retangulo(10, 10, 20, 20);
Atenção: ainda não
retangulos[2] = new Retangulo(5, 10, 30);
temos os retângulos !
}

retangulos
0 1 2

null null null

45 Programação OO
Vetores de Objetos
public class EditorGrafico{
public static void main(String[] args) {
Retangulo[] retangulos;

retangulos = new Retangulo[3];

retangulos[0] = new Retangulo(0, 0, 40, 20);


retangulos[1] = new Retangulo(10, 10, 20, 20); Quando criamos o primeiro
retangulos[2] = new Retangulo(5, 10, 30); retângulo, este passa a ser
} referenciado por retangulos[0].

retangulos
0 1 2

null null

x=0
y=0
largura = 40
altura = 20

46 Programação OO
Vetores de Objetos
public class EditorGrafico{
public static void main(String[] args) {
Retangulo[] retangulos;

retangulos = new Retangulo[3];

retangulos[0] = new Retangulo(0, 0, 40, 20);


Depois o mesmo ocorre com
retangulos[1] = new Retangulo(10, 10, 20, 20);
retangulos[1] e retangulos[2]
retangulos[2] = new Retangulo(5, 10, 30);
}

retangulos
0 1 2

x=5
y = 10
largura = 30
altura = 30
x=0
y=0 x = 10
largura = 40 y = 10
altura = 20 largura = 20
altura = 20

47 Programação OO

Você também pode gostar