·

Cursos Gerais ·

Linguagens de Programação

Envie sua pergunta para a IA e receba a resposta na hora

Fazer Pergunta

Texto de pré-visualização

Capítulo 4 Principais habilidades e conceitos Antes de poder se adiantaar mais em seu estudo de Java você precisa conhecer a classe Classe é a essência de Java Ela é a fundação na qual toda a linguagem Java é estruturada porque define a natureza de um objeto Como tal ela forma a base da programação orientada a objetos em Java Dentro de uma classe são definidos dados e o código que age sobre eles O código fica contido em métodos Já que as classes objetos e métodos são fundamentais para Java eles serão introduzidos neste capítulo Ter um entendimento básico desses recursos permitirá que você escreva programas mais sofisticados e compreenda melhor certos elementoschave de Java descritos no próximo capítulo Forma geral de uma classe Definindo uma classe Para ilustrar as classes desenvolveremos uma classe que encapsula informações sobre veículos como carros furgões e caminhões Essa classe se chama Vehicle e conterá três informações sobre um veículo o número de passageiros que ele pode levar a capacidade de armazenamento de combustível e o consumo médio de combustível em milhas por galão A primeira versão do Vehicle é mostrada a seguir Ela define três variáveis de instância passengers fuelcap e mpg Observe que Vehicle não contém método Logo atualmente é uma classe só de dados Seções subsequentes adicionarão métodos a ela class Vehicle int passengers número de passageiros int fuelcap capacidade de armazenamento de combustível em galões int mpg consumo de combustível em milhas por galão Uma definição class cria um novo tipo de dado Nesse caso ele se chama Vehicle Você usará esse nome para declarar objetos de tipo Vehicle Lembrese de que uma declaração class é só uma descrição de tipo ela não cria um objeto real Logo o código anterior não faz nenhum objeto de tipo Vehicle passar a existir Para criar realmente um objeto Vehicle você usará uma instrução como a mostrada abaixo Vehicle minivan new Vehicle cria um objeto Vehicle chamado minivan Após essa instrução ser executada minivan será uma instância de Vehicle Portanto terá realidade física Por enquanto não se preocupe com os detalhes da instrução Sempre que você criar uma instância de uma classe estará criando um objeto contendo sua própria cópia de cada variável de instância definida pela classe Logo todos os objetos Vehicle conterão suas próprias cópias das variáveis de instância passengers fuelcap e mpg Para acessar essas variáveis você usará o operador ponto O operador ponto vincula o nome de um objeto ao nome de um membro A forma geral do operador ponto é mostrada aqui objetomembro Portanto o objeto é especificado à esquerda e o membro é inserido à direita Por exemplo para atribuir o valor 16 à variável fuelcap de minivan use a instrução a seguir minivanfuelcap 16 Em geral podemos usar o operador ponto para acessar tanto variáveis de instância quanto métodos Este é um programa completo que usa a classe Vehicle Um programa que usa a classe Vehicle Chame este arquivo de VehicleDemojava class Vehicle class nome da classe int passengers número de passageiros int fuelcap capacidade de armazenamento de combustível em galões int mpg consumo de combustível em milhas por galão Essa classe declarou um objeto do tipo Vehicle class VehicleDemo public static void mainString args Vehicle minivan new Vehicle int range atribui valores a campos de minivan minivanpassengers 7 minivanfuelcap 16 minivanmpg 21 calcula a autonomia presumindo um tanque cheio de gasolina range minivanfuelcap minivanmpg SystemoutprintlnMinivan can carry minivanpassengers with a range of range Você deve chamar o arquivo que contém o programa de VehicleDemojava porque o método main está na classe chamada VehicleDemo e não na classe chamada Vehicle Quando compilar esse programa verá dois arquivos class foram criados um para Vehicle e um para VehicleDemo O compilador Java insere automaticamente cada classe em seu próprio arquivo class Não é necessário as classes Vehicle e VehicleDemo estarem no mesmo arquivofonte Você pode inserir cada classe em seu próprio arquivo chamados Vehiclejava e VehicleDemojava respectivamente Para executar o programa você deve executar VehicleDemojava A saída a seguir é exibida Minivan can carry 7 with a range of 336 Antes de avançar examinemos um princípio básico cada objeto tem suas próprias cópias das variáveis de instância definidas por sua classe Logo o conteúdo das variáveis de um objeto pode diferir do conteúdo das variáveis de outro Não há conexão entre os dois objetos exceto pelo fato de serem do mesmo tipo Por exemplo se você tiver dois objetos Vehicle cada um terá sua própria cópia de passengers fuelcap e mpg o conteúdo dessas variáveis será diferente entre os dois objetos O programa abaixo demonstra esse fato Observe que a classe que tem main agora se chama TwoVehicles declara variáveis de instância Este programa cria dois objetos Vehicle class Vehicle int passengers número de passageiros int fuelcap capacidade de armazenamento de combustível em galões int mpg consumo de combustível em milhas por galão Essa classe declara um objeto do tipo Vehicle class TwoVehicles public static void mainString args Vehicle minivan new Vehicle Vehicle sportscar new Vehicle int range1 range2 atribui valores a campos de minivan minivanpassengers 7 minivanfuelcap 16 minivanmpg 21 atribui valores a campos de sportscar sportscarpassengers 2 sportscarfuelcap 14 sportscarmpg 12 calcula a autonomia presumindo um tanque cheio de gasolina range1 minivanfuelcap minivanmpg range2 sportscarfuelcap sportscarmpg SystemoutprintlnMinivan can carry minivanpassengers with a range of range1 SystemoutprintlnSportscar can carry sportscarpassengers with a range of range2 A saída produzida por esse programa é mostrada aqui Minivan can carry 7 with a range of 336 Sportscar can carry 2 with a range of 168 Como você pode ver os dados de minivan são totalmente diferentes dos contidos em sportscar A ilustração a seguir mostra essa situação minivan passengers 7 fuelcap 16 mpg 21 sportscar passengers 2 fuelcap 14 mpg 12 tipo var1 Nos programas anteriores a linha abaixo foi usada para declarar um objeto de tipo Vehicle Vehicle minivan new Vehicle Essa declaração faz duas coisas Em primeiro lugar ela declara uma variável chamada minivan da classe Vehicle Essa variável não define um objeto Em vez disso ela pode apenas referenciar um objeto Em segundo lugar a declaração cria uma cópia física do objeto e atribui a minivan uma referência a ele Isso é feito com o uso do operador new O operador new aloca dinamicamente isto é aloca no tempo de execução memória para um objeto e retorna uma referência a ele Essa referência é mais ou menos o endereço do objeto na memória alocado por new tipo var2 Embora tanto car1 quanto car2 referenciem o mesmo objeto elas não estão vinculadas de nenhuma outra forma Por exemplo uma atribuição subsequente a car2 alteraria apenas o objeto que car2 referencia como mostrado abaixo Vehicle car1 new Vehicle Vehicle car2 car1 Vehicle car3 new Vehicle car2 car3 agora car2 e car3 referenciam o mesmo objeto Após essa sequência ser executada car2 referenciará o mesmo objeto que car3 O objeto referenciado por car1 permanece inalterado Como explicado as variáveis de instância e os métodos são componentes das classes Até agora a classe Vehicle contém dados mas não métodos Embora classes só de dados sejam perfeitamente válidas a maioria das classes terá métodos Os métodos são subrotinas que tratam os dados definidos pela classe e em muitos casos dão acesso a esses dados Quase sempre outras partes do programa interagem com uma classe por seus métodos Um método contém um ou mais instruções Em um código Java bem escrito cada método executa apenas uma tarefa Cada método tem um nome e é esse nome que é usado para chamálo Em geral podemos dar a um método o nome que quisermos tipo varN sportscarrange exibe a autonomia de sportscar declara métodos Em geral há duas condições que fazem um método retornar a primeira como o método range do exemplo anterior mostra é quando a chave de fechamento do método é alcançada A segunda é quando uma instrução return é executada Há duas formas de return uma para uso em métodos void métodos que não retornam valor e outra para o retorno de valores A primeira forma será examinada aqui A próxima seção explicará como retornar valores tipo método1parâmetros Os valores de retorno são usados para vários fins em programação Em alguns casos como em sqrt o valor de retorno contém o resultado de um cálculo Em outros pode simplesmente indicar sucesso ou falha Em outros ainda pode conter um código de status Qualquer que seja a finalidade o uso de valores de retorno é parte integrante da programação Java corpo do método Java para Iniciantes Capítulo 4 Introdução a classes objetos e métodos tipo método2parâmetros Java para Iniciantes corpo do método Retorna a autonomia int range return mpg fuelcap calcula o combustível necessário para cobrir uma determinada distância double fueleneededint miles return double miles mpg class CompFuel public static void mainString args Vehicle minivan new Vehicle Vehicle sportscar new Vehicle double gallons int dist 252 atribui valores a campos de minivan minivanpassengers 7 minivanfuelcap 16 minivanmpg 21 atribui valores a campos de sportscar sportscarpassengers 2 sportscarfuelcap 14 sportscarmpg 12 gallons minivanfuelneededdist SystemoutprintlnTo go dist miles minivan needs gallons gallons of fuel gallons sportscarfuelneededdist SystemoutprintlnTo go dist miles sportscar needs gallons gallons of fuel A saída do programa é a seguinte To go 252 miles minivan needs 120 gallons of fuel To go 252 miles sportscar needs 210 gallons of fuel Se alguém tentasse resumir a essência da classe em uma frase ela poderia ser esta uma classe encapsula funcionalidade É claro que às vezes o truque é saber onde uma funcionalidade termina e outra começa Como regra geral você vai querer que suas classes sejam os blocos de construção do aplicativo final Para que isso ocorra cada classe deve representar uma única unidade funcional executando ações claramente delimitadas Portanto você vai querer que suas classes sejam tão pequenas quanto possível não menor do que isso Ou seja classes que contêm funcionalidade demais confundem e desestruturam o código mas classes que contêm pouca funcionalidade são fragmentadas Qual é o equilíbrio É nesse ponto que a ciência da programação se torna a arte de programar Felizmente a maioria dos programadores descobre que é mais fácil executar esse ato de equilíbrio com a experiência break case 2 SystemoutprintlnThe switch Systemoutprintlnswitchexpression Systemoutprintln statement sequence Systemoutprintln break Systemoutprintln break case 3 SystemoutprintlnThe for Systemoutprintforinit condition iteration Systemoutprintln statement break case 4 SystemoutprintlnThe while Systemoutprintlnwhilecondition statement break case 5 SystemoutprintlnThe dowhile Systemoutprintlndo Systemoutprintln statement Systemoutprintln while condition break case 6 SystemoutprintlnThe break Systemoutprintlnbreak or break label break case 7 SystemoutprintlnThe continue Systemoutprintlncontinue or continue label break Systemoutprintln 4 Em seguida crie o método showMenu void showMenu SystemoutprintlnHelp on Systemoutprintln 1 if Systemoutprintln 2 switch Systemoutprintln 3 for Systemoutprintln 4 while Systemoutprintln 5 dowhile Systemoutprintln 6 break Systemoutprintln 7 continue SystemoutprintChoose one q to quit tipo métodoNparâmetros 118 Java para iniciantes corpo do método Capítulo 4 Introdução a classes objetos e métodos 119 120 Java para Iniciantes choice char Systeminread do ignore char Systeminread whileignore while hlpobjisValidchoice ifchoice q break Systemoutprintln hlpobjhelpOnchoice Quando você testar o programa verá que ele é funcionalmente o mesmo de antes A vantagem dessa abordagem é que agora você tem um componente de sistema de ajuda que pode ser reutilizado sempre que necessário int x MyClass x 10 class ConsDemo public static void mainString args MyClass t1 new MyClass MyClass t2 new MyClass Systemoutprintlnt1x t2x Nesse exemplo o construtor de MyClass é MyClass x 10 Esse construtor atribui o valor 10 à variável de instância x de MyClass Ele é chamado por new quando um objeto é criado Por exemplo na linha MyClass t1 new MyClass o construtor MyClass é chamado no objeto t1 fornecendo o valor 10 a t1x O mesmo ocorre para t2 Após a construção t2x tem o valor 10 Portanto a saída do programa é 10 10 public static void mainString args MyClass t1 new MyClass10 MyClass t2 new MyClass88 Systemoutprintlnt1x t2x A saída desse programa é mostrada abaixo 10 88 Nessa versão do programa o construtor MyClass é chamado i que é usado para inicializar a variável de instância x Logo quando a linha MyClass t1 new MyClass10 é executada o valor 10 é passado para i que é então atribuído a x Adicionando um construtor à classe Vehicle Podemos melhorar a classe Vehicle adicionando um construtor que inicialize automaticamente os campos passengers fuelcap e mpg quando um objeto for construído Preste bastante atenção em como os objetos Vehicle são criados Adiciona um construtor class Vehicle int passengers número de passageiros int fuelcap capacidade de armazenamento de combustível em galões int mpg consumo de combustível em milhas por galão Esse é um construtor para Vehicle Vehicleint p int f int m passengers p fuelcap f mpg m Retorna a autonomia int range return mpg fuelcap Calcula o combustível necessário para cobrir uma determinada distância double fuelneededint miles return double miles mpg constrói veículos completos Vehicle minivan new Vehicle7 16 21 Vehicle sportscar new Vehicle2 14 12 double gallons int dist 252 gallons minivanfuelneededdist SystemoutprintlnTo go dist miles minivan needs gallons gallons of fuel gallons sportscarfuelneededdist SystemoutprintlnTo go dist miles sportscar needs gallons gallons of fuel Tanto minivan quanto sportscar são inicializados pelo construtor Vehicle quando são criadas Cada objeto é inicializado como especificados nos parâmetros de seu construtor Por exemplo na linha a seguir Vehicle minivan new Vehicle7 16 21 os valores 7 16 e 21 são passados para o construtor Vehicle quando new cria o objeto Logo a cópia de passengers fuelcap e mpg de minivan conterá os valores 7 16 e 21 respectivamente A saída desse programa é igual à versão anterior Coleta de lixo Vimos que a alocação de objetos se dá dinamicamente a partir de uma porção de memória livre com o uso do operador new Como explicado a memória não é infinita e o espaço livre pode se extinguir Portanto é possível que new falhe por não haver memória suficiente para a criação do objeto desejado Logo um componentechave de qualquer esquema de alocação dinâmica é a recuperação de memória livre de objetos não usados com a disponibilização dessa memória para realocações subsequentes Em algumas linguagens de programação a liberação de memória já alocada é realizada manualmente No entanto Java usa uma abordagem diferente mais livre de problemas a coleta de lixo O sistema de coleta de lixo de Java reclama objetos automaticamente ocorrendo de maneira transparente em segundo plano sem nenhuma intervenção do programador Funciona assim quando não existe nenhuma referência a um objeto ele não é mais considerado necessário e a memória ocupada é liberada Essa memória reciclada pode então ser usada para uma alocação subsequente O método finalize tem a seguinte forma geral protected void finalize parte onde entra o código de finalização Aqui a palavrachave protected é um especificador que limita o acesso a finalize Esse e outros especificadores de acesso serão explicados no Capítulo 6 É importante entender que finalize é chamado imediatamente antes da coleta de lixo Ele não é chamado quando um objeto sai de escopo por exemplo Ou seja não temos como saber quando ou até mesmo se finalize será executado Por exemplo se o programa terminar antes da coleta de lixo ocorrer finalize não será executado Logo ele deve ser usado como um procedimento reserva para assegurar o tratamento apropriado de algum recurso ou para aplicações de uso especial e não como um artifício para o programa usar em sua operação normal Resumindo finalize é um método especializado raramente necessário na maioria dos programas Capítulo 4 Introdução a classes objetos e métodos 127 2 Crie a classe FDemo mostrada aqui class FDemo int x FDemoint i x i chamada quando o objeto é reciclado protected void finalize SystemoutprintlnFinalizing x gera um objeto que é imediatamente destruído void generatorint i FDemo o new FDemoi O construtor configura a variável de instância x com um valor conhecido Nesse exemplo x é usada como uma identificação de objeto O método finalize exibe o valor de x quando um objeto é reciclado De especial interesse é generator Esse método cria e então descarta imediatamente um objeto FDemo Você verá como ele é usado na próxima etapa 3 Crie a classe Finalize mostrada abaixo class Finalize public static void mainString args int count FDemo ob new FDemo0 Agora gere um grande número de objetos Em algum momento a coleta de lixo ocorrerá Nota você pode ter de aumentar o número de objetos gerados para forçar a coleta de lixo forcount1 count 100000 count obgeneratorcount Essa classe cria um objeto FDemo inicial chamado ob Em seguida usando ob ela cria 100000 objetos chamando generator em ob Como resultado 100000 objetos são criados e descartados Em vários pontos no meio do processo a coleta de lixo ocorrerá Muitos fatores vão influenciar exatamente com que frequência ou quando como a quantidade inicial de memória livre e o sistema operacional No entanto em algum momento você começará a ver 128 Java para Iniciantes as mensagens geradas por finalize Se não conseguir vêlas tente aumentar o número de objetos que estão sendo gerados elevando a contagem no laço for 4 Aqui está o programa Finalizejava inteiro Tente Isto 42 Demonstra a coleta de lixo e o método finalize class FDemo int x FDemoint i x i chamada quando o objeto é reciclado protected void finalize SystemoutprintlnFinalizing x gera um objeto que é imediatamente destruído void generatorint i FDemo o new FDemoi class Finalize public static void mainString args int count FDemo ob new FDemo0 Agora gere um grande número de objetos Em algum momento a coleta de lixo ocorrerá Nota você pode ter de aumentar o número de objetos gerados para forçar a coleta de lixo forcount1 count 100000 count obgeneratorcount Capítulo 4 Introdução a classes objetos e métodos 129 A palavrachave this Antes de concluirmos este capítulo é necessário introduzir this Quando um método é chamado ele recebe automaticamente um argumento implícito que é uma referência ao objeto chamador isto é o objeto em que o método é chamado Essa referência se chama this Para entender this primeiro considere um programa que cria uma classe chamada Pwr para calcular o resultado de um número elevado a alguma potência inteira class Pwr double b int e double val Pwrdouble base int exp b base e exp val 1 ifexp0 return for exp0 exp val val base double getpwr return val class DemoPwr public static void mainString args Pwr x new Pwr40 2 Pwr y new Pwr25 1 Pwr z new Pwr57 0 Systemoutprintlnxb raised to the xe power is xgetpwr Systemoutprintlnyb raised to the ye power is ygetpwr Systemoutprintlnzb raised to the ze power is zgetpwr Como você sabe dentro de um método os outros membros de uma classe podem ser acessados diretamente sem qualquer qualificação de objeto ou classe Logo dentro de getpwr a instrução return val significa que a cópia de val associada ao objeto chamador será retornada No entanto essa instrução também pode ser escrita assim return thisval Aqui this referencia o objeto em que getpwr foi chamado Portanto thisval referese a cópia de val pertencente a esse objeto Por exemplo se na instrução anterior getpwr tivesse sido chamado em x this referenciaria x Escrever a instrução sem usar this é apenas uma forma de abreviar Esta é a classe Pwr inteira escrita com o uso da referência this class Pwr double b int e double val Pwrdouble base int exp thisb base thise exp thisval 1 ifexp0 return for exp0 exp thisval thisval base double getpwr return thisval Na verdade nenhum programador de Java criaria Pwr como acabei de mostrar porque nada é ganho e a forma padrão é mais fácil No entanto this tem algumas aplicações importantes Por exemplo a sintaxe Java permite que o nome de um parâmetro ou de uma variável local seja igual ao nome de uma variável de instância Quando isso ocorre o nome local oculta a variável de instância Você pode ganhar acesso à variável de instância oculta referenciandoa com this O código a seguir é uma maneira sintaticamente válida de escrever o construtor Pwr Pwrdouble b int e thisb b thise e val 1 ife0 return for e0 e val val b Nessa versão os nomes dos parâmetros são iguais aos nomes das variáveis de instância ocultandoas No entanto this é usada para expor as variáveis de instância Capítulo 4 Introdução a classes objetos e métodos Teste do Capítulo 4 1 Qual é a diferença entre uma classe e um objeto 2 Como uma classe é definida 3 Cada objeto tem sua própria cópia de quê 4 Usando duas instruções separadas mostre como declarar um objeto de nome counter de uma classe chamada MyCounter 5 Mostre como um método chamado myMeth será declarado se tiver um tipo de retorno double e dois parâmetros int chamados a e b 6 Como um método deve retornar seu valor retornado 7 Que nome tem um construtor 8 O que new faz 9 O que é coleta de lixo e como ela funciona O que é finalize 10 O que é this 11 Um construtor pode ter um ou mais parâmetros 12 Se um método não retornar um valor qual deve ser seu tipo de retorno