Vous êtes sur la page 1sur 9

Teoria de Classes

O que uma Classe? Imagine que uma construtora de imveis tivesse que construir um prdio de apartamentos em que todos os apartamentos fossem rigorosamente iguais, baseados em uma planta que esclarecesse o nmero de dormitrios, portas e outros detalhes. Pois bem, a planta dos apartamentos a classe. Os apartamentos so os objetos baseados naquela classe. Poderamos fazer ainda uma outra analogia para compreender um pouco mais sobre esse conceito. Existem vrios tipos de veculos como carros de passeio, caminhes, patins, motocicletas, bicicletas, alm de outros. Podemos afirmar, portanto, que veculo a classe e cada um dos tipos de veculos citados correspondem aos objetos baseados nessa classe. Instncia O processo de criar um objeto, baseado em uma classe, recebe o nome de instncia. Assim, quando instanciamos objetos de uma classe, criamos esses objetos na memria do computador. Nas linguagens de programao orientadas a objeto, uma funo especial chamada de construtora a responsvel por cuidar da instncia dos objetos, fazendo as inicializaes necessrias assim que um objeto instanciado, ou seja, criado na memria. De modo semelhante, uma funo denominada destrutora a responsvel por realizar uma limpeza, retirando um objeto da memria.

A linguagem Java, tecnologia utilizada em nossa disciplina para o estudo de orientao a objetos, no possui uma funo destrutora, porque isso feito de forma automtica (coleta de lixo). Mesmo assim, possvel criar, em Java, uma funo com o nome finalize, que tenta realizar a limpeza da memria. Isto ser estudado mais adiante.

Classe e Objeto Um objeto uma instncia de uma classe. Um objeto possui seus limites bem definidos como, por exemplo, uma mesa, uma porta, um monitor de vdeo, um televisor, um apartamento, etc. Uma classe no tem seus limites bem definidos. Faamos novamente uma analogia classe veculo. Existem vrios tipos de veculos como carros de passeio, avies, trens, caminhes, etc. Alguns veculos, por exemplo, no possuem volante e outros sim. Portanto, essa uma caracterstica que no pode ser bem definida na classe veculo. Quanto um objeto instanciado, ele contm os atributos da classe, pois cada objeto ter seus valores para cada atributo. Desta forma, o que reside no objeto, quando este instanciado so seus atributos. Os objetos possuem atributos (por exemplo, tamanho, forma, cor, peso, etc.) e todos exibem comportamentos (por exemplo, um carro acelera, uma bola rola, um humano anda, etc.). Diferentes objetos podem ter atributos semelhantes e podem exibir comportamentos semelhantes. Assim, podemos fazer comparaes entre, por exemplo, crianas e adultos, entre humanos e macacos. O projeto orientado a objetos (OOD object-oriented design) modela software em termos semelhantes queles que as pessoas utilizam para descrever objetos do mundo real. Podemos, atravs do OOD analisar os relacionamentos de classe, em que os objetos de uma classe, como a classe veculos citada anteriormente, tm as mesmas caractersticas como, por exemplo, carros, patins, caminhes, etc. Da mesma forma, podemos analisar tambm os relacionamentos de herana, onde novas classes de objetos podem ser derivadas de classes j existentes e adicionando-se caractersticas nicas dessas mesmas classes. O objetivo deste projeto, portanto, modelar objetos por seus atributos e comportamentos da maneira como descrevemos objetos do mundo real, modelando ainda a comunicao entre os objetos, via mensagens. O OOD encapsula atributos e comportamentos em objetos. Os objetos tm, portanto, a propriedade chamada de ocultamento de informaes. Assim, objetos podem se comunicar com outros por meio de interfaces bem definidas, porm sem saber como os outros objetos so implementados (encapsulamento), pois os detalhes de implementao so ocultados dentro dos prprios objetos. Fazendo uma analogia com um carro, podemos, por Pgina 1 de 9
E-mail professor: sandrotc@anhanguera.edu.br Arquivo: ADS-POO01 Teoria de classes.doc

exemplo, dirigir um carro sem conhecer os detalhes de como o motor, a transmisso, o sistema eletrnico, os freios funcionam internamente para que o carro nos leve de um local para outro. Diagrama de Classe UML UML Unified Modeling Language uma linguagem grfica que nos permite projetar sistemas de software utilizando uma notao-padro da indstria para represent-las. A UML ser estudada de forma introdutria na disciplina Programao Orientada a Objetos. A figura seguinte mostra-nos como uma classe representada. A parte superior reservada ao nome da classe, a segunda aos atributos da classe e a terceira parte, s suas funes.

Por uma questo de nomenclatura, uma classe apartamento se chamaria clsApartamento, de forma que o nome de uma classe deve descrever, em portugus bem claro, o que ela representa. Os atributos, como j mencionado, so as caractersticas que uma classe tem. Digamos que a classe apartamento possua dez portas. Essa caracterstica ser descrita em um atributo que guardar esse nmero, por exemplo, iNumeroPortasApto. Seguindo uma nomenclatura, a primeira letra i em iNumeroPortasApto, corresponde ao tipo de dado que ser utilizado para armazenar o nmero de portas, ou seja, um inteiro. Da mesma forma, teramos tambm os atributos dDataEntregaApto, sCorParedeSala, etc. Mtodos No terceiro compartimento da classe (parte inferior) indicamos as responsabilidades da classe, como obter, ajustar. Enfim, vamos entender como o que a classe deve fazer. O exemplo a seguir ilustra um mtodo da classe clsApartamento que obtm o nmero de portas de um apartamento.
iObterNumeroPortasApto ( iCodigoApto: int ): int

A primeira letra i indica que o mtodo adquire o nmero de portas por meio de um inteiro, de acordo com a nossa nomenclatura. Entre os parnteses encontramos o que chamamos parmetro. A funo precisa saber o cdigo do apartamento para que retorne o seu nmero de portas. Aps o dois pontos temos int para indicar que a funo retornar um inteiro.

Existem diferenas entre os termos mtodo, funo e operao. Funo e mtodo tm o mesmo significado e constituem a implementao de uma operao. Uma operao corresponde a apenas a casca da funo, ou seja, o seu prottipo. A operao pensada pelo Analista de Sistemas e o mtodo criado pelo Programador.

Declarando uma Classe em Java


/* Arquivo: clsNotas.java */ public class clsNotas { public void Mensagem() { System.out.println("Bem-vindo ao boletim de notas!"); } }

Pgina 2 de 9
E-mail professor: sandrotc@anhanguera.edu.br Arquivo: ADS-POO01 Teoria de classes.doc

Instanciando uma Classe em Java


/* Arquivo: Teste.java - instanciando a classe clsNotas */ public class Teste { public static void main(String args[]) { clsNotas x = new clsNotas(); x.Mensagem(); } }

Diagrama de Classe UML Vejamos a notao de classe UML referente classe clsNotas definida no programa clsNotas.java acima. O caractere + indica a visibilidade da classe, que do tipo pblica (public), que ser estudada mais adiante em detalhes. Como a classe clsNotas no possui atributos, a regio central do diagrama fica vazia. clsNotas

+ Mensagem( )

Mtodos com Parmetros Um mtodo pode exigir um ou mais parmetros que representam informaes adicionais necessrias para a realizao de uma tarefa. Uma chamada de mtodo fornece valores (argumentos) para cada um dos parmetros do mtodo. Como exemplo, para que um mtodo denominado RealizaDeposito efetue uma operao de depsito de um valor monetrio em uma conta corrente, ser necessrio um parmetro indicando o valor a ser depositado para que o mtodo realize a sua tarefa. O exemplo seguinte ilustra a classe do exemplo anterior utilizando a parametrizao.
/* Arquivo: clsNotas.java */ public class clsNotas { public void Mensagem(String sCurso) { System.out.println("Bem-vindo ao boletim de notas do curso " + sCurso); } }

/* Arquivo: Teste.java

- instanciando a classe clsNotas */

import java.util.Scanner; public class Teste { public static void main(String args[]) { Scanner input = new Scanner(System.in); clsNotas x = new clsNotas(); System.out.println("Curso: "); String y = input.nextLine(); x.Mensagem(y); } }

Normalmente na linguagem Java os objetos so criados com new. Uma exceo essa regra um literal de string que est entre aspas, como Sandro. Os literais de string so referncias a objetos String que so criados implicitamente pelo Java.

Pgina 3 de 9
E-mail professor: sandrotc@anhanguera.edu.br Arquivo: ADS-POO01 Teoria de classes.doc

Diagrama de Classe UML Vejamos a notao de classe UML referente classe clsNotas definida no programa clsNotas.java acima. Note a presena do argumento sCurso. clsNotas

+ Mensagem( sCurso: String )

Variveis de Instncia e Mtodos set e get As variveis declaradas no corpo de um mtodo so conhecidas como variveis locais e s podem ser referenciadas por esse mtodo. Quando esse mtodo terminar sua execuo, os valores de suas variveis locais so perdidos. Uma classe geralmente consiste em um ou mais mtodos que acessam/modificam os atributos que pertencem a um objeto da classe. Os atributos so representados como variveis em uma declarao de classe e essas variveis so chamadas de campos e so declaradas dentro de uma declarao de classe, fora dos corpos dos mtodos da classe. Quando cada objeto de uma classe mantm sua prpria cpia de um atributo, o campo que representa o atributo tambm conhecido como uma varivel de instncia. Cada instncia de uma classe (objeto) tem uma instncia separada da varivel na memria.

O exemplo seguinte ilustra nossa classe clsNotas de modo que o nome do curso definido como uma varivel de instncia (campo) para que seja acessado ou modificado pelo aplicativo quando necessrio. Note que a classe agora possui trs mtodos. O mtodo setNomeCurso armazena o nome de um curso em um clsNotas atravs de um argumento. O mtodo getNomeCurso devolve o nome de um curso de um clsNotas e o mtodo Mensagem mostra a mensagem de boas vindas ao curso passado como parmetro para o objeto atravs do parmetro sNome, que por sua vez atribudo ao campo sNomeCurso. Note a presena do modificador de acesso private na declarao da varivel de instncia sNomeCurso. A maioria das declaraes de campos feita com private. Variveis declaradas como private s podem ser referenciadas por mtodos da classe em que so declaradas (ocultamento de dados). A visibilidade ser estudada com detalhes em breve.

/* Arquivo: clsNotas.java */ public class clsNotas { private String sNomeCurso; public void setNomeCurso(String sNome) { sNomeCurso = sNome; } public String getNomeCurso() { return sNomeCurso; } public void Mensagem() { System.out.println("Bem-vindo ao boletim de notas do curso " + getNomeCurso()); } }

Pgina 4 de 9
E-mail professor: sandrotc@anhanguera.edu.br Arquivo: ADS-POO01 Teoria de classes.doc

Vamos ao cdigo-fonte que instancia a classe clsNotas do exemplo anterior:


/* Arquivo: Teste.java - instanciando a classe clsNotas */

import java.util.Scanner; public class Teste { public static void main(String args[]) { Scanner input = new Scanner(System.in); clsNotas x = new clsNotas(); System.out.println("Curso inicial: " + x.getNomeCurso()); System.out.println("Informe novo curso:"); String y = input.nextLine(); x.setNomeCurso(y); x.Mensagem(); } }

Ao executar o programa acima, ser impresso como curso inicial o texto null. As variveis locais (declaradas dentro dos mtodos) no so inicializadas automaticamente pelo Java. J os campos so inicializados com um valor chamado valor-padro (um valor fornecido pelo Java quando o programador no especifica um valor inicial do campo). No programa acima, o valor-padro para o campo sNomeCurso, que do tipo String, null. Os campos private de uma classe s podem ser manipulados por mtodos dessa classe. comum implementarmos classes que forneam mtodos com visibilidade pblica (public) para permitir que os clientes dessa classe possam modificar (set = configurar = ajustar) os valores dos atributos e/ou ler (get = obter) os valores dos atributos (variveis de instncia) private da classe. No necessrio que os mtodos set e get de uma classe iniciem por set ou get, mas constitui em boa prtica de programao atribuir essas palavras iniciais aos mtodos de uma classe que permitem alterar e ler os campos da classe, respectivamente. Isto facilita a legibilidade e a compreenso do cdigo de uma classe. Uma questo de nomenclatura. Diagrama de Classe UML Vejamos a notao de classe UML referente classe clsNotas definida no programa clsNotas.java acima. Esse diagrama modela a varivel de instncia sNomeCurso da classe clsNotas como um atributo no compartimento central da classe. Como a varivel de instncia sNomeCurso private, ento o diagrama mostra um sinal de subtrao (-) antes do nome da varivel. A classe possui trs mtodos e, portanto, suas operaes esto includas no diagrama. Como os mtodos setNomeCurso e Mensagem no retornam valores (void), o diagrama no especifica um tipo de dado de retorno aps os parnteses dessas operaes. clsNotas - sNomeCurso: String + setNomeCurso( sNome: String ) + getNomeCurso( ): String + Mensagem( )

Tipos Primitivos e Tipos por Referncia Os tipos de dados em Java esto divididos em tipos primitivos (boolean, byte, char, short, int, long, float e double) e tipos por referncia (as classes, j que elas especificam os tipos dos objetos). Uma varivel de tipo primitivo armazena somente um valor de seu tipo por vez. So tambm chamadas de variveis escalares. As variveis de instncia de tipo primitivo so inicializadas por padro (os tipos numricos so inicializados com zero e o tipo booleano com false).

Pgina 5 de 9
E-mail professor: sandrotc@anhanguera.edu.br Arquivo: ADS-POO01 Teoria de classes.doc

O programador pode atribuir seus prprios valores iniciais para as variveis de tipo primitivo, notoriamente. Mas lembre-se, as variveis locais no so inicializadas por padro. As variveis de instncia de tipo por referncia so inicializadas por padro com o valor null. Visibilidade de uma Classe Uma classe pode possuir visibilidade pblica, privada ou em pacote. bom saber que as ferramentas de modelagem UML disponveis no mercado podem apresentar simbologias diferentes para a visibilidade de uma classe, algumas s vezes no mostram. A documentao da OMG (Object Management Group, Inc.) deixa aberturas para essa notao. Classe Pblica Uma classe pblica indica que qualquer outra classe poder acessar os atributos e operaes dessa classe. raro ter atributos pblicos, mas comum ter mtodos pblicos. Veja a sintaxe de declarao deste tipo de visibilidade em Java: public class clsPredio {
}

Classe Privada Uma classe privada pode ser uma classe que foi declarada como parte de outra. Isso depende do domnio da aplicao. A linguagem Java permite a declarao de classes como se fossem atributos de outras, o que chamamos de inner class. Como sabemos, membros private no so acessveis fora da classe. A inteno permitir que apenas voc que escreve a classe possa usar esse membro. Veja um exemplo: public class clsApartamentoCobertura {
private class clsProprietario { } }

A classe clsProprietario conhecida como inner class, como j mencionado, pois ela , alm de uma classe, tambm um atributo de clsApartamentoCobertura. Classe em Pacote Uma classe em pacote ter sua visibilidade restrita ao pacote em que reside. Classes fora daquele pacote no podero sequer saber de sua existncia. Uma classe sem visibilidade nenhuma tem a visibilidade-padro, que a de pacote. Veja um exemplo:

/* Arquivo: clsApartamento.java */ package pctPredio; public class clsApartamento { }

/* Arquivo: clsDeposito.java */ package pctPredio; class clsDeposito extends clsApartamento { }

Pgina 6 de 9
E-mail professor: sandrotc@anhanguera.edu.br Arquivo: ADS-POO01 Teoria de classes.doc

No exemplo acima, a classe clsApartamento pblica, ou seja, qualquer classe de fora do pacote pctPredio pode v-la. J a classe clsDeposito est com a visibilidade padro, somente classes pertencentes ao pacote pctPredio podem acess-la. Portanto, colocar nenhuma visibilidade significa colocar a visibilidade padro (ou visibilidade de pacote) em uma classe. Ainda no conclumos o estudo de herana, mas, adiantando a explicao para o exemplo acima, notamos que a classe clsDeposito herda diretamente de clsApartamento, ou seja, clsApartamento uma classe chamada de SuperClasse. A herana implementada em Java com o uso da palavra-reservada extends. Mtodos Construtores Quando um objeto da classe clsNotas criado (instanciado), sua varivel de instncia sNomeCurso inicializada com null por padro. Poderamos modificar nosso cdigo para que, assim que um objeto dessa classe fosse criado, essa varivel recebesse um valor inicial, ou seja, fosse inicializada com um valor diferente do valor padro null. Isto possvel implementando um mtodo chamado de construtor, que pode ser utilizado para inicializar um objeto de uma classe quando o objeto for criado. A palavra-chave new a responsvel por chamar automaticamente o mtodo construtor de uma classe. A chamada do construtor indicada pelo nome da classe seguido por parnteses. Exemplo:
clsNotas x = new clsNotas();

Por padro, o compilador fornece um construtor-padro sem parmetros para as classes que no possuem explicitamente um construtor. Assim, o programador pode implementar seu prprio mtodo construtor para especificar uma inicializao personalizada para objetos de sua classe. Vamos a um exemplo mais completo.

/* Arquivo: clsNotas.java */ public class clsNotas { private String sNomeCurso; public clsNotas(String sNome) { sNomeCurso = sNome; } public void setNomeCurso(String sNome) { sNomeCurso = sNome; } public String getNomeCurso() { return sNomeCurso; } public void Mensagem() { System.out.println("Bem-vindo ao boletim de notas do curso " + getNomeCurso()); } }

Da mesma forma que os mtodos podem receber parmetros, os construtores tambm podem. Porm, construtores no podem retornar valores, logo no podem especificar um tipo de retorno, nem mesmo o tipo void. Normalmente so declarados com a visibilidade pblica (public). Como j estudamos, se uma classe no possuir um construtor explicitamente implementado pelo programador, as variveis de instncia da classe so inicializadas com seus valores-padro. Desta forma, caso o programador no implemente um construtor para uma classe, o compilador Java criar um construtor-padro para essa classe. A seguir, um cdigo-fonte que instancia a classe clsNotas acima.

Pgina 7 de 9
E-mail professor: sandrotc@anhanguera.edu.br Arquivo: ADS-POO01 Teoria de classes.doc

/* Arquivo: Teste.java

- instanciando a classe clsNotas */

public class Teste { public static void main(String args[]) { clsNotas curso1 = new clsNotas("D.S.I."); clsNotas curso2 = new clsNotas("G.T.I."); System.out.println("Curso 1: " + curso1.getNomeCurso()); System.out.println("Curso 2: " + curso2.getNomeCurso()); } }

Diagrama de Classe UML Vejamos a notao de classe UML referente classe clsNotas definida no programa clsNotas.java acima. Esse diagrama modela os dados do exemplo da pgina 4 e inclui o mtodo construtor. Assim como nas operaes, a UML modela construtores no terceiro compartimento de uma classe. Para diferenciar um construtor da operaes de uma classe, a UML coloca a palavra constructor entre aspas francesas. bom costume listar os construtores antes das operaes da classe. A palavra String usada no diagrama chamada de tipo UML String.

clsNotas - sNomeCurso: String


<<

constructor >> clsNotas( sNome: String ) + setNomeCurso( sNome: String ) + getNomeCurso( ): String + Mensagem( )

Pgina 8 de 9
E-mail professor: sandrotc@anhanguera.edu.br Arquivo: ADS-POO01 Teoria de classes.doc

Exerccios
(Envie suas respostas para sandrotc@anhanguera.edu.br)

1) 2) 3) 4) 5) 6) 7) 8) 9) 10) 11) 12) 13) 14) 15) 16)

17)

18) 19) 20)

Uma classe o mesmo que um objeto? Explique. Qual a diferena entre mtodo e operao? Quais as visibilidades de uma classe? O que so modificadores de uma classe? Por que atributos devem ter suas visibilidades marcadas como privadas? Qual a visibilidade que devemos adotar em mtodos, perante a orientao a objetos? Por que separamos classes em pacotes? Como se compe a assinatura de um mtodo? O que significa instanciar uma classe? O que significa o termo ocultamento de dados? Qual o objetivo da palavra-chave new? Explique o que ocorre quando essa palavra usada em um aplicativo. O que um construtor padro? Como as variveis de instncia de um objeto so inicializadas se uma classe tiver somente um construtor-padro? Qual o propsito de uma varivel de instncia? Explique como um programa Java poderia utilizar a classe Scanner sem importar a classe do pacote java.util. Explique por que uma classe pode fornecer um mtodo set e um mtodo get para uma varivel de instncia. Modifique a classe clsNotas apresentada neste documento de acordo com o seguinte: a) Inclua uma segunda varivel de instncia String para representar o nome do professor do curso. b) Implemente um mtodo set para alterar o nome do professor e um mtodo get para obt-lo. c) Altere o construtor para especificar dois parmetros. Um para o nome do curso e outro para o nome do professor. d) Altere o mtodo Mensagem de modo que ele primeiro gere a sada da mensagem de boas-vindas e o nome do curso e depois a sada de Este curso ser lecionado por: seguido pelo nome do professor. Marque cada uma das afirmaes com V para verdadeiro ou F para falso. Se falso, explique por qu. a) Uma declarao import no requerida quando uma classe em um pacote utilizar outra no mesmo pacote. b) As variveis ou mtodos declarados com o modificador de acesso private s so acessveis a mtodos da classe em que so declarados. c) Uma varivel de tipo primitivo pode ser utilizado para invocar um mtodo. d) As variveis declaradas no corpo de um mtodo particular so conhecidas como variveis de instncia e podem ser utilizadas em todos os mtodos da classe. e) As variveis locais de tipo primitivo so inicializadas por padro. f) As variveis de instncia de tipo por referncia so inicializadas por padro para o valor null. g) Qualquer classe que contm public static void main( String args[]) pode ser utilizada para executar um aplicativo. Qual a diferena entre uma varivel local e um campo? Explique o propsito de um parmetro de mtodo. Qual a diferena entre um parmetro e um argumento?

Pgina 9 de 9
E-mail professor: sandrotc@anhanguera.edu.br Arquivo: ADS-POO01 Teoria de classes.doc