Classes o Objetos Um recurso comum de cada aplicativo feito até agora é que todas as instruções que realizavam tarefas localizavam-se no método main. Se você tornar parte de uma equipe de desenvolvimento na indústria, poderá trabalhar em aplicativos com centenas, ou até milhares, de classes. Classes, objetos, métodos e variáveis de instância Para realizar uma tarefa em um programa é necessário um método. O método descreve os mecanismos que realmente realizam suas tarefas. O método oculta de seu usuário as tarefas complexas que ele realiza. Em Java, primeiro criamos uma unidade de programa chamada classe para abrigar um método. Em uma classe, você fornece um ou mais métodos que são projetados para realizar as tarefas da classe. Por exemplo, uma classe que representa uma conta bancária poderia conter um método para fazer depósitos de dinheiro em uma conta, outro para fazer saques e um terceiro para perguntar qual é o saldo atual. Você deve construir um objeto de uma classe antes de fazer um programa realizar as tarefas que a classe descreve como fazer. Essa é a razão de o Java ser conhecido como uma linguagem de programação orientada a objetos. Você envia mensagem para um objeto cada mensagem é conhecida como uma chamada de método e instrui um método do objeto a realizar sua tarefa. Um objeto tem atributos que são portados com o objeto quando ele é utilizado em um programa. Esses atributos são especificados como parte da classe do objeto. Por exemplo, um objeto conta bancária tem um atributo saldo que representa a quantidade de dinheiro na conta. Cada objeto conta bancária sabe o saldo que ele representa, mas não sabe os saldos de outras contas no banco. Os atributos são especificados pelas variáveis de instância da classe. Exemplo 1: Apresenta uma classe LivroNotas com um método que simplesmente exibe uma mensagem de boas-vindas quando é chamado. A declaração da classe LivroNotas contém um método mostramensagem que exibe uma mensagem na tela. A linha 5 da classe realiza o trabalho de exibir a mensagem. A declaração da classe inicia na linha 3. Cada declaração de classe contém a palavra-chave class seguida imediatamente do nome da classe. A declaração de método começa com a palavra-chave public para indicar que o método está disponível para o público isto é, pode ser chamado de fora do corpo da declaração de classe por métodos de outras classes. A palavra-chave void indica que esse método realizará uma tarefa, mas não retornará nenhuma informação para seu método de chamada ao completar a tarefa. Os parênteses depois do nome do método
indicam que isso é um método. Um conjunto vaio de parênteses indica que esse método não requer informações adicionais para realizar sua tarefa. Uma classe que contém um método main é um aplicativo Java. Essa classe é especial porque a JVM pode utilizar o main para iniciar a execução. A classe LivroNotas não é um aplicativo porque não contém o main. Para utilizar a classe LivroNotas em um aplicativo é necessário declarar uma classe separada que contenha um método main ou colocar um método main na classe LivroNotas. Na indústria, utiliza-se uma classe separada que contém o método main para cada classe nova criada. A declaração da classe TestaLivroNotas contém o método main que controlará a execução do nosso aplicativo. Qualquer classe que contém o main declarado pode ser utilizada para executar um aplicativo. A palavra-chave static indica que o main é um método especial que pode ser chamado sem primeiro criar um objeto da classe em que o método é declarado. A declaração da variável meulivronotas é do tipo LivroNotas. Cada nova classe que você cria torna-se um novo tipo em Java que pode ser utilizado para declarar variáveis e criar objetos. A variável meulivronotas é inicializada com o resultado da expressão de criação da instância de classe new LivroNotas(). A palavrachave new cria um novo objeto da classe especificada à direita da palavra-chave. Os parênteses em combinação com um nome de classe representam uma chamada para um construtor, que é semelhante a um método, mas é utilizado no momento em que um objeto é criado para inicializar os dados do objeto. Agora podemos utilizar meulivronotas para chamar o método mostramensagem. Você pode compilar as classes criadas antes de executar o aplicativo. No diretório que contém os arquivos de código-fonte do aplicativo, digite o comando javac LivroNotas.java TestaLivroNotas.java Se o diretório que contém o aplicativo incluir somente os arquivos desse aplicativo, você pode compilar todas as classes no diretório com o comando java *.java Um diagrama de classe UML para a classe LivroNotas. Na UML cada classe é modelada em um diagrama de classes como um retângulo com três compartimentos. O compartimento superior contém o nome da classe. O compartimento do meio contém os atributos da classes, que correspondem às variáveis de instância em Java. O compartimento do meio está vazio porque a versão de classe LivroNotas não tem nenhum atributo. O compartimento inferior contém as operações da classe, que correspondem aos métodos em Java.
Exemplo 2: Modifica o primeiro para permitir ao método receber um nome do curso como um argumento e exibir o nome como parte da mensagem de boas-vindas. A classe LivroNotas2 declara um método mostramensagem que exibe o nome do curso como parte da mensagem de boas-vindas. O novo método mostramensagem requer um parâmetros que representa o nome do curso a ser enviado para a saída. A nova classe é utilizada a partir do método main da classe TesteLivroNotas2. A linha 5 cria um Scanner chamado leia para ler o nome do curso fornecido pelo usuário. A linha 6 cria um objeto da classe LivroNotas e o atribui à variável meulivronotas. A linha 7 exibe um prompt que pede ao usuário digitar o nome de um curso. A linha 8 atribui o nome digitado à variável NomeCurso, utilizando o medo Scanner nextline() para realizar a entrada. O método nextline lê os caracteres digitados pelo usuário até o carectere de nova linha ser encontrado. O caractere nova linha é descartado. O método next lê palavras individuais, até achar um espaço em branco (espaço, tabulação ou nova linha). O caractere de espaço em branco é descartado. A linha 10 chama o método mostramensagem do meulivronotas. A variável NomeCurso entre parênteses é o argumento que é passado ao método mostramensagem para o método poder realizar sua tarefa. O diagrama de classe UML abaixo modela a classe LivroNotas. Essa classe contém a operação public mostramensagem. Entretanto, essa versão ter um parâmetro. A UML modela um parâmetro de modo um pouco diferente do Java listando o nome do parâmetro, dois-pontos e o tipo de parâmetro nos parênteses que seguem o nome da operação. A UML tem seus próprios tipos de dados semelhantes àqueles do Java. Exemplo 3: Armazena o nome do curso em um objeto LivroNotas. As variáveis declaradas no corpo de um método particular são conhecidas como variáveis locais e só podem ser utilizadas nesse método. Quando esse método terminar, os valores de suas variáveis locais são perdidos.
Uma classe normalmente consiste em um ou mais métodos que manipulam os atributos que pertencem a um objeto particular da classe. Os atributos são representados como variáveis em uma declaração de classe. Essas variáveis são chamadas de campos e são declaradas dentro de uma declaração de classe, mas fora dos corpos das declarações de método da classe. Quando cada objeto de uma classe mantém sua própria cópia de um atributo, o campo que representa o atributo também é conhecido como uma variável de instância cada objeto (instância) da classe tem uma instância separada da variável na memória. O exemplo abaixo demonstra uma classe LivroNotas que contém uma variável de instância nomecurso para representar o nome do curso de um objeto LivroNotas particular. A classe contém três métodos setnomecurso, getnomecurso e mostramensagem. O método setnomecurso armazena o nome de um curso em um LivroNotas. O método getnomecurso obtém o nome de um curso de um LivroNotas. O método mostramensagem exibe uma mensagem de boas vindas que inclui o nome do curso método obtém o nome do curso chamando o método getnomecurso na mesma classe. A linha 3 declara que nomecurso é uma variável de tipo String, declarada no corpo da classe, mas fora dos corpos dos métodos da classe. A linha 3 é uma declaração para uma variável de instância. A maioria das declarações de variável de instância é precedida pela palavrachave private, que é um modificador de acesso. As variáveis ou métodos declarados com o modificador de acesso private só são acessíveis a métodos da classe em que são declarados. O método setnomecurso (linhas 4 6) não retorna quaisquer dados quando ele completa sua tarefa, portanto seu tipo de retorno é void. O método recebe um parâmetro nome que presenta o nome do curso que será passado para o método como um argumento. A linha 5 atribui nome à variável de instância nomecurso. O método getnomecurso (linhas 7 9) retorna um nomecurso do objeto LivroNotas particular. O método tem uma lista vazia de parâmetros, então não exige informações adicionais para realizar sua tarefa. O método especifica que ele retorna uma String. Quando um método que especifica um tipo de retorno for chamado e completar sua tarefa, o método retornará um resultado para seu método chamador. O método mostrarmensagem (linhas 11 14) não retorna quaisquer dados quando ele completa sua tarefa, portanto seu tipo de retorno é void. As linhas 12 e 13
geram a saída de uma mensagem de boas-vindas que inclui o valor de variável de instância nomecurso. Precisamos criar um objeto de classe LivroNotas e chamar seus métodos antes que a mensagem de boas-vindas possa ser exibida. A classe TestaLivroNotas3 cria um objeto da classe LivroNotas3 e demonstra seus métodos. Um diagrama de classe UML do LivroNotas com uma variável de instância e os métodos set e get. O diagrama de classe UML indica que a classe LivroNotas3 tem um atributo nomecurso do tipo UML String e três operações setnomecurso (com um parâmetro de nome de tipo UML String), getnomecurso (retorna o tipo UML String) e mostrarmensagem. Os tipos de dados em Java estão divididos em duas categorias tipos primitivos e tipos por referência (tipos não-primitivos). Os tipos primitivos são boolean, byte, char, short, int, long, float e double. Todos os tipos não-primitivos são tipos por referência, então as classes, que especificam os tipos de objetos, são tipos por referência. Uma variável de tipo primitivo pode armazenar exatamente um valor de seu tipo declarado por vez. Os programas utilizam as variáveis de tipo por referência para armazenar as localizações de objetos nas memória do computador. Essas variáveis referenciam objetos no programa. Os objetos que são referenciados podem conter muitas variáveis de instância e métodos. Exemplo 4: Demonstra como os dados em um objeto LivroNotas podem ser inicializados quando o objeto é criado. Cada classe que você declara pode fornecer um construtor que pode ser utilizado para inicializar um objeto de uma classe quando o objeto for criado. A palavra chave new chama o construtor da classe para realizar a inicialização. A chamada de construtor é indicada pelo nome da classe seguido por parênteses. Ao declarar uma classe, você pode fornecer seu próprio construtor a fim de especificar a inicialização personalizada para objetos de sua classe.
As linhas 4 a 6 declaram o construtor para a classe LivroNotas4. Um construtor deve ter o mesmo nome da sua classe. Como um método, um construtor especifica em sua lista de parâmetros os dados que ele requer para realizar sua tarefa. A linha 4 indica que o construtor da classe LivroNotas4 tem um parâmetro chamado nome do tipo String. Na linha 5 do corpo do construtor, o nome passado para o construtor é atribuído à variável de instância nomecurso. As linhas 4 e 5 criam e inicializam um objeto LivroNotas4. As linhas 6 e 7 repetem o processo para outro objeto LivroNotas4. Um diagrama de classe UML que modele a classe LivroNotas4, que tem um construtor com um parâmetro nome de tipo String. Assim como nas operações, a UML modela construtores no terceiro compartimento de uma classe em um diagrama da classe. É habitual listar construtores antes de outras operações no terceiro compartimento. Exemplo 5: Procedimento para realizar a operação de adição entre dois valores, sem a passagem de parâmetros.
Exemplo 6: procedimento para realizar a operação de adição entre dois valores com a passagem de parâmetros.