• Olá Visitante, se gosta do forum e pretende contribuir com um donativo para auxiliar nos encargos financeiros inerentes ao alojamento desta plataforma, pode encontrar mais informações sobre os várias formas disponíveis para o fazer no seguinte tópico: leia mais... O seu contributo é importante! Obrigado.

Manual de Java

helldanger1

GForum VIP
Entrou
Ago 1, 2007
Mensagens
29,631
Gostos Recebidos
1
Classes em Java



Vemos o que são as classes, como cria-las e alguns detalhes adicionais de seu uso.

Por Victorino Blanco González





Como comentamos anteriormente no Manual de Java, as classes marcam a estrutura básica de um programa tanto em Java como na programação orientada a objetos em geral.

Uma classe é o produto de enfocar a programação aos dados mais que as funções. Portanto, uma classe é uma coleção de dados e, além disso, para operar com eles uma série de funções próprias da classe. Vejamos por exemplo, a classe "Fichas" definida anteriormente, seu único dado é "a cor" e a única operação que permite é saber a cor da ficha em qualquer momento. Isso permite um acesso restritivo aos dados segundo a função dos mesmos. Neste caso a classe é assim baseando-se na própria vida: Não acredito que ninguém tenha mudado a cor de uma ficha jogando "quatro em linha" e no caso positivo não teria muito boas intenções ao faze-lo.

Além deste método básico de proteção dos dados, Java permite alguns mais que veremos agora.

Quando declaramos uma classe o primeiro que colocamos é o cabeçalho:

public class Fichas { (corpo da classe) }

A primeira palavra nos proporciona a possibilidade de dar permissões de acessos a nossa classe, as permissões são as seguintes:
"Public": Uma classe "public" é acessível desde qualquer outra classe, não obstante para que isto aconteça deve ser primeiro acessível o "package" dessa classe "public". Para que um "package" seja acessível deve de estar no diretório que assinala a variável "CLASSPATH" que definimos ao instalar nosso ambiente Java e claro, ter permissão de leitura nesse diretório.
"Package": Usar este identificador no cabeçalho da classe é opcional, pois é a opção por padrão em java, ou seja, se escrevermos:
class Fichas {(Corpo da classe)}
 

helldanger1

GForum VIP
Entrou
Ago 1, 2007
Mensagens
29,631
Gostos Recebidos
1
É o mesmo que se escrevermos:

package class Fichas {(Corpo da classe)}

As classes "package" ( que podemos entender como as que não são "public" ) são acessíveis somente pelo seu próprio package.

Isto é relativo à acessibilidade das classes. Mais conceitos relativos à acessibilidade fazem referência às variáveis internas de uma classe que já comentamos em um capítulo anterior, e a seus métodos.

Quanto ao nome da classe consideraremos várias coisas. Deve obedecer ao convênio de nomes de Java e coincidir com o nome do arquivo ".java" no qual se salvará a classe.

O normal é que cada classe vá incluída em um único arquivo, porém claro, pode nos interessar por algum motivo colocar várias classes em um único arquivo. Neste caso só pode haver uma classe public que é a que dará o nome a tal arquivo. Neste caso de que não houvesse uma classe public o compilador entenderá que a classe "principal" desse arquivo é a que concorda com o nome do mesmo, portanto evidentemente duas classes com um mesmo nome não são permitidos em um mesmo arquivo.

Por último, para explicar a estrutura de uma classe falarei sobre os elementos habituais na definição de seu corpo.

Primeiro costuma-se declarar, pelo menos, as variáveis internas dessa classe e posteriormente se definem os construtores e os métodos que irá dispor a classe. Entenderemos melhor isso mais adiante.

Na definição de construtores e métodos temos que ter em conta um novo conceito da programação orientada a objetos. A sobrecarga. A sobrecarga consiste em poder ter vários métodos ou construtores com o mesmo nome dentro de uma mesma classe e que não façam as mesmas coisas.

Isto se consegue de uma maneira muito simples, diferenciam-se entre eles mediante o número e tipo de parâmetros que recebem. Vejamos um exemplo:

/*temos dois métodos que podem, por exemplo, obter a área de uma figura geométrica em concreto, poderiam ser:*/

float obterAreaCirculo(Circulo ci){
/* ... */
}

float obterAreaQuadrado(Quadrado qu){
/* ... */
}

/*em Java isto pode se abreviar tendo dois métodos sobrecarregados, por exemplo: */

float obterArea(Circulo ci){
/* ... */
}

float obterArea(Quadrado qu){
/* ... */
}

/*Na hora de executar o método obterArea se utilizará o que corresponder ao parâmetro que for passado pelo cabeçalho*/
 

helldanger1

GForum VIP
Entrou
Ago 1, 2007
Mensagens
29,631
Gostos Recebidos
1
Organização das classes e uso de packages




Java permite organizar as classes mediante agrupamentos ou packages.

Por Victorino Blanco González





Efetivamente necessitaremos organizar nossas classes em algum momento porque nosso desenvolvimento pode ir crescendo, e ter um acúmulo de classes todas juntas em um diretório, sem nenhum tipo de organização física nem lógica, não nos ajudará muito.

Java nos permite com os "Packages" evitar esta situação de um modo bastante elegante e ordenado. Um "Package" é basicamente um agrupamento de classe, vemos por exemplo, que a versão 1.2 de Java inclui um total de 59 "Packages" para organizar todo seu API.

Qualquer grupo de classes pode se organizar dentro de um "package" porém, evidentemente o mais normal é que você organize as suas classes por algum motivo. As classes costumam se organizar segundo a relação entre elas. Por exemplo, se tivéssemos um grupo de classes que permitissem fazer uma ordenação de elementos em um array poderíamos organiza-las deste modo:

Quicksort.class; // Classe para ordenar arrays com o método quicksort
Bolha.class; // Classe para ordenar arrays com o método da bolha
Selecao.class; // Classe para ordenar arrays com o método de seleção
Insercao.class; // Classe para ordenar arrays com o método de inserção direta

/* Podemos englobar estas classes em um package visto que todas estão relacionadas em sua obrigação. Criaremos portanto o "package ordenações" para que possamos acessa-las deste modo: */

ordenacao.Quicksort.class; // Exemplo acesso a quicksort no package ordenação

/* Igualmente poderíamos ter também classes para a busca de um elemento em um array em tal caso repetiríamos o processo e por exemplo, teríamos o "package tratamentoArrays" deste modo: */

tratamentoArrays.ordenacao.Quicksort.class; // Exemplo acesso a quicksort dentro do // package ordenacao que por sua vez está // dentro do package tratamentoArrays.

O uso de "Packages" não só nos permite organizar nossas classes, como também nos permite diferenciar classes que sendo distintas tenham que ter o mesmo nome, ou seja, ajuda a Java com a resolução de nomes.

Também como vimos por alto anteriormente nos permite certas normas para controlar acesso a classes.
 

helldanger1

GForum VIP
Entrou
Ago 1, 2007
Mensagens
29,631
Gostos Recebidos
1
Vejamos agora como utilizar os "packages" para nossas classes. O primeiro que temos que ter em conta é que todas as classes que vão pertencer a um mesmo "package" têm que estar em um mesmo diretório que deve coincidir em nome com o nome do "package". Vemos que portanto, o nome completo de uma classe de um "package" equivale a sua rota desde o diretório que tomemos de base para nossas classes.

O diretório de base para nossas classes é o definido pela variável de ambiente CLASSPATH que introduzimos no segundo capítulo deste manual. Vejamos o exemplo:

tratamentoArrays.ordenacao.Quicksort.class
/* Equivale ao acesso a classe que se encontra no diretorio:
$CLASSPATH/tratamentoArrays/ordenacao/Quicksort.class */

O convênio de nomes de Java estabelece também que os nomes dos "packages" comecem por minúsculas.

Em segundo lugar para utilizar os "packages" em nossas classes temos que incluir no início do arquivo da classe (antes de qualquer outra sentença) a linha:

Package nomeDoPackage;
 

helldanger1

GForum VIP
Entrou
Ago 1, 2007
Mensagens
29,631
Gostos Recebidos
1
Por último vejamos a sentença "import". "import" permite importar um "package" a nossa classe Java. Isto nos permite acessar (no caso de que sejam acessíveis) sem usar todo o nome do "package" a qualquer classe dentro dele. Vejamos no seguinte exemplo:

Import tratamentoArrays.ordenacao.*; //Importamos todas as classes
//do "Package" de ordenação de
//arrays que tínhamos organizado.

/*tiramos linhas de código em Java até que... */

Quicksort arrayQuick= new Quicksort(); //... Em qualquer momento de nossa classe // podemos fazer uso da classe Quicksort sem
// utilizar toda a rota do package.

Também há que ter em conta que importando um "package" não importamos todos seus "subpackages" e sim somente todas as classes desse "package". Também podemos simplesmente importar somente uma classe dentro desse "package" colocando ao invés de um asterisco o nome da classe a importar.

Para acabar com este ponto queria fazer mais um comentário sobre API de Java. Já disse que as classes do API de Java estão organizadas em "packages" segundo sua função. Existem "packages" preparados para acometer as mais variadas tarefas. É um dever do leitor se informar de que "packages" lhe interessam em seu desenvolvimento e do funcionamento das classes incluídas nestes. Nós veremos certos "packages" de uso habitual durante o manual.

Como já foi comentado, em Java não se começa desde zero, temos um conjunto de classes que podemos incluir em nosso programa sem a necessidade de importar nenhum "package". Essas classes são as que pertencem ao "package" Java.lang. este "package" inclui as classes básicas de Java como por exemplo a classe "Array" que utilizaremos muito habitualmente
 

helldanger1

GForum VIP
Entrou
Ago 1, 2007
Mensagens
29,631
Gostos Recebidos
1
As classes em funcionamento



Descrição das classes, dos objetos e como se relacionam.

Por Victorino Blanco González






Como dita o título deste ponto um objeto é precisamente isso: "Uma classe em movimento". Podemos ver a relação entre classe e objeto deste modo.

Suponhamos por exemplo uma classe chamada "Mamífero". Como na "vida real" você pode encontrar pela rua com "Pessoas", "Cachorros", "Gatos" ... que evidentemente pertencem a essa classe "Mamífero", mas você não vai encontrar com um "Mamífero" por si só.

Mais ou menos essa é a relação entre classe e objeto. Uma classe é uma especificação de como deve ser um objeto para pertencer a essa classe e por conseguinte, um objeto é um exemplar individual de uma classe.

Tomando como exemplo nossa classe "Fichas" vemos que todas as fichas têm que ter uma cor como característica que a defina. Ou seja, nossos objetos "ficha" serão fichas brancas, pretas, etc.

Na hora de "agir" portanto será feito sobre um objeto em concreto. Em um objeto pode se acessar a seus métodos e às variáveis membros que tiver, sempre claro que sejam ambos declarados na classe como acessíveis.

A acessibilidade para métodos e variáveis depende em primeira instância da acessibilidade à classe a qual pertencem. Se a classe for acessível então depende em segunda instância destas normas:

Acessibilidade de variáveis e métodos: depende dos seguintes modificadores de acesso que se coloca (ou não) diante da variável em sua declaração ou do método em sua definição.
"public": Dá acessibilidade completa à variável, pode-se ver desde a própria classe, dentro e fora do mesmo "package" e em qualquer "subclasse" da classe na que se declara, estando no mesmo ou em diferente "package".
"protected": Pode-se acessar desde a própria classe, desde o mesmo "package" e desde qualquer "subclasse", porém não se pode ver desde uma classe de outro "package".
"private": Só se pode acessar desde a própria classe.
"package": É a opção por padrão (como se não fosse colocado nada). Proporciona acessibilidade desde o próprio "package" e portanto, logicamente desde a própria classe e ademais desde qualquer subclasse que esteja dentro do mesmo "package".

Uma vez tendo claras as normas sobre a acessibilidade em Java, veremos alguns exemplos de utilização dos objetos em Java.
 

helldanger1

GForum VIP
Entrou
Ago 1, 2007
Mensagens
29,631
Gostos Recebidos
1
Utilização dos objetos em Java




Descrição dos objetos. Como cria-los ou instancia-los a partir das classes e de sua utilização.

Por Victorino Blanco González






O primeiro que há que fazer para utilizar um objeto é tê-lo, não é? Portanto, vamos entender primeiro como se criam os objetos para depois utiliza-los.

Instanciação de objetos:

Para instanciar um objeto o método que se utiliza é "new". "New" cria um objeto da classe que lhe especificarmos, porém, antes disso temos que declarar a variável que conterá esse novo objeto. Vejamos em nossa classe Tabuleiro vista anteriormente.

Fichas estadoTabuleiro[][];
public Tabuleiro(){estadoTabuleiro=new Fichas [6][7];};

Nessas duas linhas se engloba todo o mecanismo de criação de um objeto. Na primeira linha se declara uma variável "estadoTabuleiro" da classe "array". A classe "array" é uma classe utilitária de Java que está incluída em "Java.lang" e portanto, como já comentei uma vez e explicarei melhor mais adiante, se encontra disponível desde qualquer programa em Java.

À princípio esta variável está vazia, não contém nenhum objeto, porém está "preparada" para conter um objeto da classe "array".

Na segunda linha desse código há mais o que comentar: Trata-se da definição de um construtor simples para a classe "Tabuleiro".

Quando se executa uma sentença "new" para criar um objeto de uma classe, o que realmente se faz é chamar ao método construtor correspondente a essa classe. Por exemplo, se executamos esta sentença:

Tabuleiro meuTabuleiro = New Tabuleiro();
 

helldanger1

GForum VIP
Entrou
Ago 1, 2007
Mensagens
29,631
Gostos Recebidos
1
Estamos chamando ao método anterior:

public Tabuleiro(){estadoTabuleiro=new Fichas [6][7];};

Portanto o que conseguimos é criar a variável interna de "Tabuleiro", que chamamos "estadoTabuleiro" como um objeto "array" de dimensões 6x7 que são as dimensões de um tabuleiro de "quatro em linha". Como vemos, igual que com nossa classe tabuleiro e qualquer outra classe, também usamos "new" para criar o "array".

Por último, e como se pode compravar, para definir um construtor para nossa classe simplesmente definimos um método que como peculiaridade tem o mesmo nome da classe na qual se define. Enquanto ao seu modificador de acesso o normal é que seja "public", porém, pode ser também "private" em cujo caso só será acessível através de um método "static" da mesma classe. Já explicaremos este último melhor, por agora simplesmente temos só que saber que existe.

Passo de mensagens:

Como "passo de mensagens" entende-se em programação orientada a objetos o que sempre chamamos em programação tradicional: "chamada a uma função". No fundo se pensamos vemos basicamente que:
Em primeiro lugar: Os programas "sobre o papel" são as classes.
Em segundo lugar: As classes "sobre papel" se relacionam com outras classes. Por exemplo, nossa classe Ficha utiliza para definir seu parâmetro "cor" à classe "String" própria de Java.
Em terceiro lugar: Na "vida real", ou seja, em funcionamento, as classes mostram-se como "objetos".
Como conclusão: São os objetos os que colaboram e se relacionam com outros objetos, e o fazem mediante o "passo de mensagens".
Para executar um método de uma classe se utiliza esta sintaxe:

NomeDaClasse.nomeDoMetodo(parâmetros do método);

Os passos de mensagens têm uma vantagem com respeito Às chamadas à função das linguagens tradicionais. A vantagem é que sempre levam um parâmetro implícito: O objeto ao que pertence o próprio método. Veremos com um exemplo muito simples.

Imaginamos um método e uma função que simplificam uma fração passada como parâmetro. A diferença seria a seguinte ao utilizar tanto o método como a função.
 

helldanger1

GForum VIP
Entrou
Ago 1, 2007
Mensagens
29,631
Gostos Recebidos
1
Programação tradicional:

fracao_simp = simplifica_fracao(fracao);
/*fracao_simp salva o resultado
de aplicar a funcao simplifica_fracao
ao parametro fracao*/

Programação orientada a objetos:


ObjetoFracao.simplificaFracao();
/*este caso poderiamos entender como que
simplemente decimos a fracao que se
simplifique a ela mesma "como ela sabe" */

Como vemos em Programação orientada a objetos não se passa como parâmetro a fração a simplificar visto que é o mesmo objeto que é a fração e o que por sua vez possui o método para simplifica-la de acordo com seus atributos internos.

Acesso às variáveis internas de um objeto:

Para acessar a uma variável interna de um objeto esta tem que ser acessível segundo as normas vistas anteriormente. No caso de que simplesmente podamos acessá-la com a seguinte sintaxe:

NomeDaClasse.nomeDaVariavelInterna;
 
Topo