Você está na página 1de 22

Programação

Orientada pelos
Objectos

Primeira aula: Classes em Java


Nesta aula vamos…

• Recordar as classes em Java.


• Recordar o Eclipse.
• Começar a estudar a classe Point.

21-02-2007 Programação Orientada pelos Objectos-1 © Pedro Guerreiro 2


Nesta aula não vamos…

• Perder tempo com a apresentação da


cadeira. Para isso temos a página, no
Moodle: http://ctp.di.fct.unl.pt/lei/poo/.
• Escrever nenhum programa completo
interessante, ou talvez sim.

21-02-2007 Programação Orientada pelos Objectos-1 © Pedro Guerreiro 3


O que é uma classe?
• Em programação, uma classe é uma
estrutura que agrupa dados e funções.
• As funções de uma classe operam
sobre os dados da classe e sobre os
seus (da função) argumentos.
• Em Java, chamamos métodos às
funções e campos aos dados.
• Tipicamente, os campos são privados e
os métodos são públicos.
21-02-2007 Programação Orientada pelos Objectos-1 © Pedro Guerreiro 4
Para que servem as classes?
• Para com elas criarmos objectos.
• Cada objecto de uma classe contém
uma instância dos dados da classe.
• Cada chamada de uma função de uma
classe diz respeito a um objecto dessa
classe e actua sobre os dados desse
objecto.
• O importante são as classes; os
objectos nem por isso. Com as funções estáticas
não é bem assim…
21-02-2007 Programação Orientada pelos Objectos-1 © Pedro Guerreiro 5
Trabalhamos
no pacote poo
Exemplo: classe Point
package poo; public Point(double x, double y)
{
import java.awt.Graphics; this.x = x;
this.y = y; Construtor rural
public class Point }
{
private double x; public Point()
Construtor por
private double y; {
this.x = 0.0; defeito
this.y = 0.0; (ou defectivo)
}

Campos public Point(Point other)


{
this.x = other.x; Construtor
this.y = other.y; de cópia
}
Construtores

21-02-2007 Programação Orientada pelos Objectos-1 © Pedro Guerreiro 6


Classe Point (2)
public double getX()
{
return x; Setters
}
public void setX(double x)
{
this.x = x;
}
public double getY()
{
return y;
}
public void setY(double y)
{
this.y = y;
}
public void set(double x, double y)
Getters {
this.x = x;
this.y = y;
}
21-02-2007 Programação Orientada pelos Objectos-1 © Pedro Guerreiro 7
Classe Point (3)
public void translate(double dx, double dy)
{
x += dx;
y += dy; Primitivas gráficas
}

public void scale(double fx, double fy)


{
x *= fx;
y *= fy;
}

public void rotate(double angle) Ângulo em


{ radianos
double x0 = x;
double y0 = y;
x = x0 * Math.cos(angle) - y0 * Math.sin(angle);
y = x0 * Math.sin(angle) + y0 * Math.cos(angle);
}

21-02-2007 Programação Orientada pelos Objectos-1 © Pedro Guerreiro 8


Classe Point (4)
public double distanceTo(Point other)
{
return Math.sqrt(Math.pow(x-other.x, 2) + Math.pow(y-other.y, 2));
}

public double angle()


{
Operações geométricas
return Math.atan2(y, x);
}

public double modulus()


{
return Math.sqrt(x*x + y*y);
}

public String toString()


{ Conversão para String
return "Point " + x + " " + y;
}

21-02-2007 Programação Orientada pelos Objectos-1 © Pedro Guerreiro 9


Classe Point (5)
public void draw(Graphics g)
{
g.fillOval((int)Math.round(x) - 1, (int)Math.round(y) - 1, 3, 3);
}

Operação gráfica: desenha o ponto na


superfície representada pelo argumento.

• E agora, que fazemos com isto?


21-02-2007 Programação Orientada pelos Objectos-1 © Pedro Guerreiro 10
Eclipse

21-02-2007 Programação Orientada pelos Objectos-1 © Pedro Guerreiro 11


Classe de teste

21-02-2007 Programação Orientada pelos Objectos-1 © Pedro Guerreiro 12


As funções têm objecto
• Cada função de uma classe é chamada
para um objecto da classe:
Point p = new Point(3.0, 4.0);
Point q = new Point(p);
System.out.println(p);
p.scale(2.0, -2.0); Todas as funções têm
System.out.println(p); objecto; algumas têm
double d = p.distanceTo(q); argumentos.
System.out.println(d);
p.rotate(Math.PI/2);
Todas excepto as
System.out.println(p); funções estáticas…
double m = p.modulus();
double a = p.angle();
System.out.println(m + " " + Math.toDegrees(a));
21-02-2007 Programação Orientada pelos Objectos-1 © Pedro Guerreiro 13
Testando no Eclipse

21-02-2007 Programação Orientada pelos Objectos-1 © Pedro Guerreiro 14


Testando na consola

21-02-2007 Programação Orientada pelos Objectos-1 © Pedro Guerreiro 15


Testando interactivamente as
primitivas gráficas
• Queremos um programa interactivo que
aceite comandos na consola para transladar,
escalar ou rodar um ponto e mostre o ponto
após cada operação.
• Os comandos são, por exemplo:
– “t 2.0 -3.5”, para transladar.
– “s 1.5 1.0”, para escalar.
– “r 45” para rodar, com o ângulo em graus.
• Termina com Ctrl-Z.
21-02-2007 Programação Orientada pelos Objectos-1 © Pedro Guerreiro 16
testInteractive (1)
public static void testInteractive()
{ Paramos quando
Point p = new Point();
Scanner in = new Scanner(System.in); não houver mais
for (;;) dados.
try
{
System.out.print(">"); Lemos linha a
if (!in.hasNext()) linha e toqueni-
break;
String line = in.nextLine(); zamos com split.
String[] tokens = line.split(" ");
switch (tokens[0].charAt(0)) {
… Se o comando for
} inválido, lança uma
System.out.println(p); excepção que é
} catch (Exception e)
{ tratada aqui
System.out.println("Comando inválido: " + e);
}
System.out.println("Fim.");
21-02-2007 }
Programação Orientada pelos Objectos-1 © Pedro Guerreiro 17
testInteractive (2)
switch (tokens[0].charAt(0)) {
case 't': Descriminamos
double dx = new Double(tokens[1]); segundo a
double dy = new Double(tokens[2]);
p.translate(dx, dy);
primeira letra.
break;
case 's':
double fx = new Double(tokens[1]);
double fy = new Double(tokens[2]); Convertemos de
p.scale(fx, fy);
break;
String
String para
para double.
double
case 'r':
double degrees = new Double(tokens[1]);
p.rotate(Math.toRadians(degrees));
break; Aqui se lança a
default: excepção, se o
throw new Exception(tokens[0]);
comando não for “t”,
}
“s” ou “r”.
21-02-2007 Programação Orientada pelos Objectos-1 © Pedro Guerreiro 18
Experimentando

21-02-2007 Programação Orientada pelos Objectos-1 © Pedro Guerreiro 19


Exercícios
• Programe uma função que indique em que quadrante
fica um ponto. O resultado é 1, 2, 3, 4 ou 0. O
resultado 0 indica que o ponto é a origem. O semi-
eixo positivo dos x pertence ao primeiro quadrante, o
dos y ao segundo, etc.
• Programe uma função para reflectir o ponto em
relação à diagonal principal.
• Programe uma função para calcular o ponto médio
do segmento definido pelo objecto e pelo ponto
indicado no argumento.
• Programe uma função para rodar o ponto para o
semi-eixo mais próximo. E outra para rodar para o
semi-eixo ou para a semidiagonal mais próxima.
21-02-2007 Programação Orientada pelos Objectos-1 © Pedro Guerreiro 20
Controlo
• Se nos esquecermos de indicar private para os campos, eles
ficam públicos?
• Qual é o número máximo de construtores que uma classe pode
ter?
• Qual é a regra de estilo para os nomes das classes em Java? E
para os nomes dos métodos?
• Qual é o tipo dos números reais em Java?
• Que expressão usamos para obter o primeiro carácter de uma
String s?
• Como se chama o pacote onde trabalharemos?
• Se rodarmos um ponto de 360 graus, ele fica na mesma?
• Para converter de graus para radianos, usamos que função?
• Escalar e depois transladar é o mesmo que transladar e depois
escalar?

21-02-2007 Programação Orientada pelos Objectos-1 © Pedro Guerreiro 21


Na próxima aula…
• Veremos como programar uma função
de teste interactiva com saída gráfica,
de maneira a observar visualmente o
comportamento do ponto.
• De passagem, recordaremos a
programação de campos estáticos e de
métodos estáticos.

21-02-2007 Programação Orientada pelos Objectos-1 © Pedro Guerreiro 22

Você também pode gostar