segunda-feira, 21 de janeiro de 2008

[8] Criando o primeiro objeto


No Post anterior tivemos nosso primeiro contato formal com a Programação Orientada a Objetos. Aprendemos um pouco sobre abstração de classes a partir de uma entidade do mundo real ou uma entidade criada por nós baseada em conceitos do mundo real. Neste Post aprenderemos a como implementar classes e a como criar objetos em Java.


Criando a primeira classe em código

Se você não percebeu ainda, desde o primeiro código-fonte do nosso tutorial que já trabalhamos com, no mínimo, uma classe. Se não te recordas, o arquivo HelloWorld.java tem o seguinte conteúdo:

public class HelloWorld{

public static void main(String[] args){
System.out.println("Hello World");
}

}

HelloWorld é uma classe, você a declarou. A classe HelloWorld não tem atributos, e tem apenas um método: main. O método main é um método especial, reservado pela JVM para que um programa Java possa ser executado. Falaremos sobre ele adiante.

Para escrevermos, ou melhor, para declararmos nossa primeira classe pós-HelloWorld vamos resolver o exercício do Post anterior, que seria modelar uma classe baseada em uma janela do Windows. Chamaremos nossa classe de "Window":

Window

Atributos:

- largura
- altura
- posicaoX
- posicaoY
- estaMaximizada


Métodos:

- abrir
- fechar
- minimizar
- restaurar
- mover

A próxima fase de nossa abstração será adaptar a modelagem à linguagem Java. Devemos prosseguir com as seguintes premissas:

* todo atributo tem um tipo
* todo método tem um retorno.

Os tipos dividem-se em: tipos primitivos e tipos de referência. Para o exemplo da classe Window, faremos uso apenas de tipos primitivos, ou seja, tipos que não são classes. São exemplos de tipos primitivos: números inteiros, números reais e valores booleanos - true ou false. Os tipos primitivos são representados por palavras-chaves específicas. Por exemplo, para indicar que um atributo armazenará um valor que seja um número inteiro, utilizamos a palavra chave int.

Vamos começar a implementar a classe Window:

public class Window{

int largura;
int altura;
int posicaoAncoramentoX;
int posicaoAncoramentoY;
int posicaoX;
int posicaoY;
boolean estado;

}


Note que apenas os atributos da classe Window foram declarados, restando ainda a implementação de seus métodos.

Métodos são declarados para executarem ações referentes à classe em questão.
Após executar todas suas linhas de comando um método é finalizado.

Um método é executado a partir do momento em que ele é chamado, e todo método retorna algum valor, seja ele um tipo primitivo, um tipo de referência ou até mesmo void.
Tenha em mente que void representa um valor vazio, mas é um valor, o que é diferente de não ter um valor.


Nesta classe especificaremos que cada um dos métodos da classe Window retornará "vazio", usando a palavra-chave void. Faremos uma melhor explanação sobre métodos em Posts posteriores.

Observe como a classe Window será implementada com a inclusão de seus métodos:



Teoricamente a classe Window, até o momento, não possui funcionalidade alguma, pois seus métodos não possuem códigos a serem executados.


Criando um objeto do tipo Window

Antes de criar um objeto do tipo Window você precisa fazer o que se pede:

* Crie uma nova classe chamada Window no seu ambiente de programação e cole nela o conteúdo do código da classe Window exibido acima
* Codifique os 5 métodos da classe Window com comandos System.out.println(). Escreva mensagens como "A JANELA FOI MINIMIZADA" para o método minimizar(); "A JANELA FOI RESTAURADA" para o método restaurar(), e assim por diante. Observe como ficaria com o método mover():
public void mover(){
System.out.println("A Janela teve sua posição modificada");
}

Por fim, sem método main nossa classe não pode ser testada. Para provar que a classe Window não necessariamente precisa ser composta por um método main para ser testada, vamos criar outra classe chamada WindowTest:

public class WindowTest{

public static void main(String[] args){

}

}
Agora temos duas classes: Window e WindowTest. A classe WindowTest não tem nenhum atributo e apenas um método, que é o método main. Como já foi dito, o método main é a porta de entrada para que seu programa seja executado. Porém, precisamos codificar algo dentro dele, caso contrário a JVM não terá o que executar no nosso programa. Criaremos então nosso primeiro objeto em Java. Como já sabemos que todo objeto tem um tipo, criaremos um objeto do tipo Window.

A princípio você deve seguir a seguinte sintaxe para a criação de objetos em Java:

public void mover(){
System.out.println("A Janela teve sua posição modificada");
}


TIPO_DO_OBJETO NOME_DO_OBJETO = new TIPO_DO_OBJETO ( ) ;


O parâmetro TIPO_DO_OBJETO nada mais é que a classe que você queira criar objetos derivados dela. Em outras palavras, de que tipo será seu objeto. No nosso caso o objeto será do tipo Window.

O parâmetro NOME_DO_OBJETO depende apenas de você. Você nomeará o objeto que está sendo criado como desejar - com algumas exceções que veremos em Posts posteriores, claro.

= é nada mais que um operador binário utilizado para atribuições. Ele é um operador binário por precisar de dois operandos: um à sua esquerda, outro à sua direita. Seu funcionamento consiste em atribuir o valor do operando à direita para o operando à esquerda.

new é uma palavra-chave da linguagem Java que criará o objeto de fato. Na vida real é mais comum que você encontre o termo instanciar uma classe do que "criar um objeto".

TIPO_DO_OBJETO ( ) é o que chamamos de construtor
. Falaremos melhor sobre construtores em Posts posteriores.

Nosso código dentro do método main ficará da seguinte maneira:

Window objetoWindow = new Window();

Já que agora temos um objeto "concreto", podemos manipulá-lo sem problemas. Lembre-se que dentro de métodos os comandos são lidos da esquerda para a direita e de cima para baixo. Então logo após a criação do objeto objetoWindow vamos fazer algumas modificações nos seus atributos:

objetoWindow.largura = 300;
objetoWindow.altura = 300;
objetoWindow.posicaoX = 25;
objetoWindow.posicaoY = 100;
objetoWindow.estaMaximizada = true;

Logo em seguida insira os comandos:

System.out.println(objetoWindow.largura);
System.out.println(objetoWindow.altura);
System.out.println(objetoWindow.posicaoX);
System.out.println(objetoWindow.posicaoY);
System.out.println(objetoWindow.estaMaximizada);

Execute seu programa e você verá no console os seguintes resultados impressos na tela:

300
300
25
100
true

Observe que os valores exibidos são os mesmos que você atribuiu no início do código. Esta é uma das funções de um atributo: armazenar valores.

Já que conseguimos testar uma das funcionalidades dos atributos de uma classe, vamos testar agora os métodos do objeto objetoWindow:

objetoWindow.mover();
objetoWindow.restaurar();

O console deverá exibir algo como - dependendo do que você escreveu:

A Janela teve sua posição modificada
A Janela foi restaurada



Parabéns, você criou seu primeiro objeto em Java e até o manipulou alterando e exibindo os valores de seus atributos e chamou seus métodos. Para fixar sua compreensão faça os exercícios abaixo:


EXERCÍCIOS

1. Ainda no objeto objetoWindow, escolha um de seus atributos e codifique uma seqüência de comandos como:

* alterar o valor do atributo
* imprimir valor do atributo
* alterar o valor do atributo
* imprimir valor do atributo
* alterar o valor do atributo
* imprimir valor do atributo

2. Crie um segundo objeto, e manipule e imprima os valores de seus atributos.


Ficamos por aqui. Um abraço e até a próxima



domingo, 13 de janeiro de 2008

[7] Introdução à Programação Orientada a Objetos

Do que se trata a POO - Programação Orientada a Objetos

A Programação Orientada a Objetos é um paradigma de programação em que os problemas computacionais são resolvidos através da modelagem e a criação de objetos, e a troca de mensagens entre eles. Através da abstração de objetos e problemas do mundo real é possível modelar classes de forma com que complexos sistemas possam ser construídos de forma mais robusta e confiável do que outros paradigmas de programação.

Se você ainda não compreende o que são classes e objetos, não se preocupe. Leia este Post e mostre a si mesmo que você sabe mais sobre classes e objetos do que imagina.


Objetos são a chave da POO

Você está neste exato momento olhando para a tela do seu monitor. Observe todos os detalhes que nele existem: botões, letras e adesivos; e logo em seguida retome sua leitura.

Tenho certeza que seu monitor possui características próprias e nele podemos fazer algumas ações. São algumas características do monitor: cor, largura, altura, marca, modelo, etc. E são algumas ações: ligar, desligar, reajustar tamanho de tela, desmagnetizar, etc. Desde já o seu monitor é um objeto que possui as características e ações descritas acima.

Agora vamos analisar uma lâmpada: ela possui basicamente uma voltagem específica e um estado - que pode ser "ligado" ou "desligado". Através dela as seguintes ações podem ser feitas: ligar e desligar. A lâmpada também é um objeto. Se imaginarmos ela acesa, seu estado será "ligado". E caso ela esteja apagada, seu estado será "desligado". Então note que a voltagem específica e o estado da lâmpada também são características - como no exemplo anterior, mas essas características também podem ser chamadas de estados.

Entendemos até agora que um objeto possui características/estados e ações.




Em termos de Orientação a Objetos não há diferenças técnicas entre os termos característica e estado. Porém, entre os programadores o termo atributo é o mais comumente utilizado.

Em termos de Orientação a Objetos, para designar as ações de um objeto é comum também que se utilize o termo comportamento, mas o termo método é mais freqüentemente utilizado.




Então aprendemos até agora que:

* Um objeto é composto por características e ações;
* característica = estado = atributo
* ação = comportamento = método

Logo, a seguinte sentença também é verdadeira:

* Um objeto é composto por atributos e métodos



Java é uma linguagem Orientada a Objetos

Como uma boa linguagem moderna, Java é uma linguagem Orientada a Objetos. Isto significa dizer que todo nosso ciclo de programação nesta linguagem envolverá manipulação de objetos. Como já dito anteriormente, um objeto Java é composto por atributos e métodos. Posteriormente aprenderemos a criar e manipular objetos em código Java.


Entendendo o que são Classes

Cada objeto presente em sua volta teve sua origem através de um modelo específico. No caso de uma caneta de marca, por exemplo, existem várias canetas iguais a ela. Outras da mesma marca são quase idênticas, mudando apenas a cor de sua tinta. Então, você já parou para pensar sobre como inúmeras canetas da mesma marca podem ser tão semelhantes? Elas seguem um modelo de criação em comum que especifica quantos centímetros as canetas terão; a moldagem e a cor da tampa; se a tinta será azul, vermelha ou preta, etc.
Em Orientação a Objetos, este "modelo de criação" se chama classe, e os modelos que são concretizados chamam-se objetos.


Imagine uma classe como um molde, um projeto. Uma classe não possui uma forma "concreta", digamos assim. Os objetos sim são concretos. Não existe objeto sem classe, pois uma classe é um modelo para a criação de um ou vários objetos.


Entendendo atributos e métodos com 3 classes:

CLASSE 1 - Mouse

É sempre um ótimo exercício abstrair atributos e métodos de objetos do "mundo real". Neste primeiro exemplo escolhemos o objeto Mouse. Obviamente não especificaremos absolutamente todos os seus atributos e métodos, mas apenas os principais, sem detalhes aprofundados.


Atributos:

* marca
* cor
* modelo
* botão esquerdo
* botão direito
* botão central

Métodos:

* mover cursor
* clicar com botão esquerdo
* clicar com botão direito
* clicar com botão central
* segurar botão esquerdo
* segurar botão direito
* soltar botão esquerdo
* soltar botão direito

-- comentário --

Agora, vários objetos derivados da classe Mouse podem ser criados. Todos os objetos derivados de Mouse terão: uma marca, uma cor, um modelo, um botão esquerdo, um botão direito e um botão central, sem exceções.

Todas as operações básicas que um mouse faria estão listadas como métodos da classe Mouse. Você precisa ter em mente que, na lógica orientada a objetos você precisa pensar da seguinte maneira: o que acontece quando o método "mover cursor" for chamado? Se o usuário mover o mouse para frente, o cursor do mouse deve ir para cima. Se o usuário mover o mouse para esquerda, o cursor do mouse deve ir para esquerda. O mesmo tipo de pensamento deve ocorrer não só com os métodos de movimento e clique do mouse, mas com qualquer método de qualquer classe.

Para que um método de uma classe seja executado, ele precisa ser chamado/invocado. No nosso caso, que temos um objeto do tipo Mouse, ao usuário clicar no botão esquerdo do mouse, por exemplo, um sinal elétrico pode ser disparado para o programa em questão, e desde então o método "clicar com botão esquerdo" deve ser chamado, logo o código que estiver dentro do método "clicar com botão esquerdo" será executado.


CLASSE 2 - Usuário

Tenho certeza absoluta que ao menos uma vez você se cadastrou em algum site, seja ele um fórum, um servidor de e-mails, ou qualquer outra coisa. No formulário de cadastro você encontra alguns campos a serem preenchidos como: nickname, login, senha, etc. Preenchidos esses dados - que são um molde para um usuário do site - um novo objeto do tipo Usuário será criado. Analisemos então, em um site qualquer, os atributos e métodos da classe Usuário, melhor dizendo, qual as características de cada usuário cadastrado no site e o que cada um deles pode fazer.

Atributos:

* nome completo
* nickname
* login
* password
* e-mail

Métodos:

* alterar nome
* alterar password


-- comentário --

Talvez você tenha se surpreendido com o pouco número de métodos existentes na classe Usuário. Você pode se questionar também sobre a ausência de métodos como: postar no fórum, deletar conta e convidar um amigo. Mas será que realmente a funcionalidade de postar de fórum, por exemplo, pertence a um usuário, ou será que o usuário apenas usa conta para usufruir da funcionalidade de postar no fórum, que na realidade pertence ao sistema do site em si?

A modelagem de classes varia de caso para caso, de modelador para modelador. Não há regras fixas quanto ao seu planejamento.




CLASSE 3 - Ball

Se você estiver programando um jogo onde uma pequena bola se movimenta em uma posição aleatória na tela em uma determinada velocidade, e que ao colidir com qualquer borda da tela ela é rebatida para outra direção como no vídeo abaixo:

video

Logo, a classe Ball será composta por:

Atributos:

* imagem
* posicaoX
* posicaoY
* velocidade

Métodos:

* mover
* parar
* rebater

-- comentário --

Talvez este exemplo seja o mais próximo da prática real da POO, pois se trata de uma abstração de um objeto que não existe fisicamente, mas que é composto por conceitos existentes do mundo real que são aplicados para se obter um objeto virtual perfeitamente manipulável com características e comportamentos próprios.

Analisemos a justificativa de seus atributos: cada objeto do tipo Ball move-se pela tela nos eixos X e Y. Logo, um objeto Ball tem os atributos posicaoX e posicaoY, para armazenar sua posição atual nos eixos X e Y, respectivamente. Um objeto Ball também tem uma velocidade, que pode ser reajustada quando necessário - hora pode se movimentar mais lentamente pelos eixos X e Y, hora pode se movimentar de forma mais rápida. Um objeto do tipo Ball também possui uma imagem, para que este possa ser visualizado pelo jogador.

Na modelagem da classe Ball decidimos criar 3 métodos: mover, parar e rebater; que na verdade são as ações do objeto. Ao invocar o método mover, o objeto Ball se movimentará pela tela. Já ao método "parar" ser chamado, o objeto Ball parará de se deslocar. E quando o método rebater foi invocado, o objeto Ball mudará sua direção de movimento.



RESUMO:

* Você aprendeu que uma classe é composta por atributos e métodos
* Você aprendeu que uma classe é um modelo para a criação de um ou vários objetos
* Se um objeto é derivado de uma classe X, pode-se dizer que este objeto é do tipo X
* Os métodos geralmente são nomeados com verbos, pois representam ações do objeto


ATENÇÃO

Você deve se manter atento no momento de modelagem de suas classes, pois elas devem ser moldadas de forma com que um determinado problema computacional seja resolvido. Independente de os exemplos citados neste Post, que são baseados em objetos do mundo real, serem úteis para resolver problemas reais de programação, eles são mais do que tudo uma boa forma de exercitar sua capacidade de abstração, sua forma de pensar orientada a objetos.


EXERCÍCIOS:

1. Abstraia uma classe a partir de uma porta, que é um objeto do mundo real. Não se prenda a detalhes profundos, apenas molde suas características e comportamentos básicos.

2. Abstraia uma classe a partir de uma janela comum do Windows, independente do programa que nela estiver sendo rodado.


3. Abstraia uma classe a partir de um personagem de um simples jogo 2D de plataforma.




Bem, ficamos por aqui. Um abraço e até a próxima

terça-feira, 8 de janeiro de 2008

[6] Hello World no Eclipse

Já que aprendemos a executar o Hello World manualmente, vamos aprender a executar o Hello World no IDE Eclipse, cujo processo é relativamente mais simples. Acompanhando esta seção, também faremos um rápido Tour pelo Eclipse para que possamos se situar melhor sobre o que iremos fazer.


Primeiro contato com o Eclipse

A primeira tela que você verá do Eclipse será esta:




O que o Eclipse lhe requisita é o diretório que você deseja trabalhar, isto é, o diretório que você armazenará seu(s) projeto(s). Clicando em "Browse..." você vê uma tela semelhante a essa:


Nesta janela você deve especificar o caminho onde ficarão armazenados o(s) seu(s) projeto(s). Se você deseja criar uma nova pasta para isto, clique no botão "Criar nova pasta".


Tendo escolhido seu diretório de trabalho, vá adiante clicando em OK. Você deve ser recepcionado pelo Eclipse com uma tela como esta:


Feche esta janela e você se deparará com a face do Eclipse - que a princípio pode chegar a assustar um pouco por ser aparentemente carregada:



Criando um novo projeto

No Eclipse, antes de criar um arquivo .java - que posteriormente chamaremos de Classe - devemos criar um projeto. Para isto percorreremos o seguinte caminho no menu principal: File->New->Java Project., como na figura abaixo:


Se preferir outra maneira, em vez de selecionar diretamente "Java Project", selecione a opção "Other" e em seguida opte por "Java Project":


Ambos os passos levam ao mesmo caminho: a criação de um novo projeto. Um janela com título "New Java Project" deve ser exibida e a única coisa que você precisa especificar no momento é o nome do seu projeto, como na imagem a seguir:



Logo, seu projeto será criado:




Criando uma classe

Agora que temos um projeto poderemos criar uma classe. Para isto você deve seguir o caminho no menu principal: File -> New -> Class. Observe a imagem adiante:



O nome da classe deve ser HelloWorld, do mesmo jeito que fizemos no Post anterior quando criamos o arquivo chamado HelloWorld.java:


Após clicar em "Finish" a estrutura do projeto deverá ficar da seguinte maneira:




A primeira facilidade que o Eclipse nos oferece ao criar uma classe é fornecer seu cabeçalho. Desde já precisamos apenas criar o conteúdo da classe HelloWorld. Então digite o código a seguir entre as chaves - "{" e "}":


public static void main(String[] args) {
System.out.println("Hello World");
System.out.println("Estou no Eclipse");
}



O código completo da classe deve ser o seguinte:

public class HelloWorld {

public static void main(String[] args) {

System.out.println("Hello World");
System.out.println("Estou no Eclipse");

}

}

Para executar o código no Eclipse não precisamos mais acionar diretamente os comandos javac e java. O próprio Eclipse se encarrega disso. No tópico Entendendo como o Java funciona - Parte 2 entendemos que antes de gerar os bytecodes, o compilador verifica se o código é compilável, isto é, o código não deve conter erros sintáticos ou semânticos, caso contrário a compilação falhará e a causa do erro deve ser exibida pelo javac. Pois bem, de tempos em tempos o Eclipse se encarrega de chamar o javac enquanto você digita seu código. Você entendeu corretamente: enquanto você digita seu código, seu código está sendo compilado. Isto é permitido porque o javac é um compilador JIT - Just-In-Time. Experimente digitar seu nome em qualquer trecho do código - exceto entre aspas dentro do comando System.out.println(). O compilador o sublinhará com cor vermelha, informando que há um erro sintático no código ao você pôr o cursor do mouse sobre ele.

Para executar seu programa, vá até o arquivo HelloWorld.java através do Eclipse, clique com o botão direito do mouse e siga o caminho: Run As -> Java Application.





Em vez de usar a "tela preta" do Prompt do MS-DOS, agora você pode enxergar seu programa rodando através do console, dentro do próprio Eclipse.





Hello World em outros IDEs

Se você não estiver usando o Eclipse, por favor, tente um dos links abaixo:

NetBeans IDE - Clique aqui

JCreator - Clique aqui (em inglês)



Missão cumprida!

Espero que a execução do seu programa no Eclipse tenha obtido sucesso. Em Post posteriores certamente veremos mais dicas e particularidades do Eclipse, e do próprio Java, é claro.


Um abraço.

Até a próxima

quinta-feira, 3 de janeiro de 2008

[5] Hora do Hello World

Hello World

Agora podemos escrever nosso primeiro programa em Java: o tradicional Hello World. O código é bastante simples, mas se você não o entende não se preocupe, pois breve breve isso será possível. Copie o código abaixo, ele será útil:

public class HelloWorld {

public static void main(String[] args) {
System.out.println("Hello World");
}

}
Este é nosso primeiro programa. Como você já deve ter percebido, ele fará com que a mensagem "Hello World" apareça na tela do computador. Aprenderemos a executar este código de forma manual, isto é, sem auxílio de um IDE como Eclipse.

Executando o programa Hello World manualmente

Siga os passos abaixo:
  1. Escolha um diretório no seu computador para escrever seu primeiro programa - neste exemplo usaremos C:\PrimeiroPrograma;
  2. Dentro de C:\PrimeiroPrograma crie um arquivo de texto com o nome HelloWorld que conterá o código do programa HelloWorld mostrado anteriormente;
  3. Converta a extensão do seu arquivo de texto para extensão .java;
  4. Abra o Prompt do MS-DOS;
  5. Vá até o diretório C:\PrimeiroPrograma;
  6. Agora você vai compilar seu código, como discutido no Post anterior. Para isto você deverá invocar o javac - o compilador padrão do Java, e a sintaxe básica que precisamos para compilar nosso primeiro programa é a seguinte: javac . Logo entraremos com o seguinte comando no Prompt: javac HelloWorld.java;
  7. Note que no diretório C:\PrimeiroPrograma foi gerado um novo arquivo: HelloWorld.class. Um arquivo de extensão .class contém os bytecodes gerados pelo compilador, que permitem que seu programa seja executado em diversas plataformas. Logo, para executarmos nosso programa, ainda no mesmo diretório, invocaremos o comando java para executarmos o programa. Portanto entraremos com o comando: java HelloWorld, para que o arquivo HelloWorld.class seja executado.
  8. A mensagem "Hello World" deve ser exibida com sucesso como na imagem abaixo:

Já que aprendemos a compilar e a executar nosso primeiro programa manualmente e termos aprendido melhor sobre como funcionam as etapas para execução de um programa Java - discutidas no Post anterior, de agora por diante executaremos nossos códigos com base no IDE Eclipse.


RESUMO:

* Você aprendeu a executar seu primeiro programa em Java manualmente
* Você aprendeu que o código fonte deve ser digitado em um arquivo de extensão .java
* Você também aprendeu que os bytecodes são armazenados em u
m arquivo de extensão .class, e é o arquivo de extensão .class que deve ser executado pela JVM



EXERCÍCIOS:

1. Exibir mais de uma frase na execução do programa;
2. Compilar e executar mais de um programa Java, ou seja, não se prender somente ao arquivo HelloWorld.java;


DICA DO EXERCÍCIO:

Se você criar um novo arquivo de extensão .java com o nome Programa, por exemplo, você deve modificar seu código. No caso do código HelloWorld exibido no início do Post precisaríamos modificar o código

public class HelloWorld {

public static void main(String[] args) {
System.out.println("Hello World");
}

}

para
public class Programa {

public static void main(String[] args) {
System.out.println("Uma outra mensagem qualquer");
}

}


Este Post fica por aqui. Parabéns pelo seu primeiro programa, resolva os exercícios e fique atento aos próximos Posts do Java Imediato.

Um abraço