Baixe o app para aproveitar ainda mais
Prévia do material em texto
PROGRAMAÇÃO ORIENTADA A OBJETOS I PROGRAMAÇÃO ORIENTADA A OBJETOS I R343 Rego, Angela História da língua portuguesa no Brasil [livro eletrônico] / Angela Rego. – Rio de Janeiro: UVA, 2019. 727 KB. ISBN 978-85-5459-044-4 1. Língua portuguesa - Brasil - História. 2. Sociolinguística - Brasil - História. I. Universidade Veiga de Almeida. II. Título. CDD – 469.800981 Copyright © UVA 2019 Nenhuma parte desta publicação pode ser reproduzida por qualquer meio sem a prévia autorização desta instituição. Texto de acordo com as normas do Novo Acordo Ortográfico da Língua Portuguesa. AUTORIA DO CONTEÚDO Adriana Aparicio Sicsú Ayres do Nascimento REVISÃO Theo Cavalcanti Lydianna Lima PROJETO GRÁFICO UVA DIAGRAMAÇÃO UVA Bibliotecária Katia Cavalheiro CRB 7 - 4826. Ficha Catalográfica elaborada pela Biblioteca Central da UVA. SUMÁRIO Apresentação Autor 6 7 Os conceitos básicos da programação orientada a objetos utilizando o Java 49 • Classes, objetos, atributos e métodos; métodos de acesso • Polimorfismo de sobrecarga de operadores e de métodos • Métodos construtores e sobrecarga de métodos construtores UNIDADE 2 8 • Histórico da linguagem Java • Características • Ambientes de desenvolvimento A linguagem Java e o paradigma da orientação a objetos UNIDADE 1 SUMÁRIO Estruturas homogêneas com Java e o tratamento de exceções 133 • Estruturas estáticas: vetores e matrizes de tipos básicos • Criação de vetores de objetos e a organização em memória • Aplicação do tratamento de exceções em vetores e matrizes UNIDADE 4 83 • A herança de classes, o reaproveitamento de membros das classes e o polimorfismo de sobrescrita • Encapsulamento de métodos e atributos e a organização de classes em pacotes • Os conceitos de classes abstratas e interfaces Os conceitos avançados da programação orientada a objetos utilizando o Java UNIDADE 3 6 O desenvolvimento de sistemas tem se expandido muito ao longo dos anos. Inicialmen- te, foram as aplicações científicas e militares, passando pelas comerciais de empresas, e, posteriormente, cresceu muito com o advento da computação pessoal. A partir desta e do uso de computadores para o entretenimento, novamente o mercado de desenvolvi- mento se expandiu. Os computadores pessoais passaram a ser ferramentas importan- tíssimas nas empresas para a execução de tarefas diárias, e as pessoas, a usar muito as redes sociais e os aplicativos. Atualmente, estamos vivendo uma nova expansão com a popularização dos smartphones e tablets, quando aplicações para dispositivos móveis têm sido muito solicitadas e as empresas têm investido no desenvolvimento de aplicativos capazes de facilitar a vida de seus usuários, aumentando assim suas opor- tunidades de negócios. Nesse contexto, o desenvolvimento de sistemas e aplicações tem sido sempre requisitado a contribuir com esse crescimento. O paradigma de pro- gramação orientada a objetos permite o desenvolvimento tanto de aplicações simples como complexas e com grande possibilidade de reaproveitamento de códigos, além de facilitar a manutenção desses sistemas. A linguagem Java é uma linguagem orientada a objetos muito versátil, pois permite o desenvolvimento de sistemas complexos com emprego da arquitetura cliente × servidor, além da criação de aplicações para desktops e dispositivos móveis. APRESENTAÇÃO 7 ADRIANA APARICIO SICSÚ AYRES DO NAS- CIMENTO Doutora em Computação de Alto Desempenho pelo Instituto Alberto Luiz Coimbra de Pós-Graduação e Pesquisa de Engenharia da Universidade Federal do Rio de Janeiro – Coppe/UFRJ. Mestre em Engenharia da Computação pela Universidade do Estado do Rio de Janeiro – Uerj. Bacharel e licenciada em Informática. Professora concursada do Centro Universitário Estadual da Zona Oeste – Uezo. Professora da Universidade Veiga de Almeida – UVA e da Universidade Estácio de Sá – Unesa. Possui experiência na área de ciência da computação, com ênfase em engenharia de software, atuando principal- mente nos seguintes temas: modelagem e desenvolvimento de sistemas, bancos de da- dos e mineração de dados e textos. AUTOR A linguagem Java e o paradigma da orientação a objetos UNIDADE 1 9 O conhecimento das técnicas de desenvolvimento de sistemas baseados no paradigma de programação orientada a objetos é fundamental para o desenvolvimento de sistemas complexos, facilitando a divisão de tarefas em partes mais simples e fáceis de serem desenvolvidas, permitindo que posteriormente essas partes sejam agrupadas de forma a resolver problemas que envolvam grandes e complexos sistemas. A prática exige o co- nhecimento e o uso de uma linguagem de programação com suporte aos conceitos de orientação a objetos. Dessa forma, é importante conhecer uma linguagem de programa- ção orientada a objetos, tal como a linguagem Java, para poder desenvolver aplicações segundo esse paradigma. INTRODUÇÃO Nesta unidade, você será capaz de: • Conhecer o paradigma da programação orientada objetos e o histórico e a es- trutura da linguagem Java. OBJETIVO 10 Histórico da linguagem Java Desenvolvida na década de 1990 por James Gosling, da Sun Microsystems, foi inicial- mente um pequeno trabalho anônimo, que, após a divulgação de suas ideias, foi apoiado pela empresa Sun Microsystems, muito conhecida e forte no mercado de desenvolvi- mento de estações de trabalho e de computação de alto desempenho. A Sun, então, criou um grupo de trabalho para o projeto, que foi batizado de “The Green Project”, em 1991. Esse grupo foi separado das operações cotidianas da Sun, e uma equipe com 13 desenvolvedores trabalhou em um conjunto de escritórios próprios em Menlo Park, du- rante 18 meses e sem comunicação com a matriz, para a criação de uma linguagem de programação que fosse independente de plataforma, com a ideia de criar uma aplicação em uma plataforma (write once) que pudesse ser executada em outras plataformas dife- rentes, sem a necessidade de qualquer tipo de alteração (run anywhere). Ainda naquela época, eles já previam a convergência entre dispositivos controlados di- gitalmente e computadores. Podemos analisar um exemplo com os dispositivos eletro- domésticos inteligentes ou ainda os smartphones, que se tornaram verdadeiros compu- tadores pessoais, com sistema operacional próprio, diversos componentes e inúmeros aplicativos. Inicialmente, a linguagem criada foi bati- zada de “Oak” (em referência ao carvalho que existia em frente às janelas dos es- critórios), para posteriormente ganhar o nome de “Java”, que atualmente se tornou uma referência no desenvolvimento de aplicações e é uma homenagem ao tipo de café muito apreciado pela equipe. Por isso, a linguagem tem como marca o desenho de uma xícara de café com a fumaça ca- racterística da bebida. A equipe, ainda naquela época, criou um controlador portátil direcionado ao entreteni- mento doméstico (setup box) voltado à televisão digital, mas estava muito além de seu tempo, uma vez que nessa época a televisão digital não estava tão desenvolvida, mas todo esse esforço foi recompensado ao se incluir a linguagem Java ao Netscape Navi- gator (navegador de internet muito utilizado na época), que foi lançado em 1995. A partir desse momento, a linguagem começou a ser conhecida e passou a ter milhares de adep- tos e desenvolvedores,sendo usada em todo o mundo até hoje. 11 A tecnologia Java é encontrada em equipamentos de redes, dispositivos voltados à inter- net, sistemas de controle, supercomputadores, notebooks, desktops, smartphones, tablets, dispositivos de jogos, máquinas de cartões de crédito, controles de robôs, entre outros. A plataforma Java A tecnologia Java se divide entre: • Uma linguagem de programação, com estrutura e sintaxe, além de empregar o paradigma de programação orientada a objetos. • Um ambiente de desenvolvimento, com compilador, interpretador, gerador de do- cumentação, entre outros. • Uma biblioteca de classes predefinidas, com suporte a interfaces gráficas (GUI), coleções de dados, comunicação de dados, entre outras. • Um ambiente de execução de aplicações capaz de executar aplicações Java nos mais diferentes tipos de computadores e dispositivos. Tipos de sistemas que podem ser desenvolvidos em Java A tecnologia Java conta com três tipos de plataformas, cada uma voltada a um tipo de aplicação, sendo elas: • Java SE (Java Standart Edition): são aplicações mais simples, para uso em compu- tadores pessoais e de empresas. • Java EE (Java Enterprise Edition): são aplicações mais complexas, que se baseiam na arquitetura cliente × servidor, que dependem da comunicação de dados e execu- tam em servidores, normalmente disponíveis em redes locais ou na internet, para atender a demandas de aplicações do cliente. Acesse a midiateca da Unidade 1 e veja o conteúdo indicado como material complementar pela professora sobre Java. MIDIATECA 12 • JME (Java Micro Edition): permite o desenvolvimento de aplicações voltadas ao en- tretenimento e ao uso doméstico, tais como aplicativos para celulares, equipamen- tos de blu-ray, set-top boxes, módulos de equipamento, impressoras, entre outros equipamentos com aplicações voltadas a dispositivos móveis e integrados. A tecnologia Java ainda se divide em dois diferentes tipos de suporte às aplicações, o de desenvolvimento (JDK), no qual criamos as aplicações, e o de execução (JRE), em que as aplicações são utilizadas pelos usuários. Para podermos contar com o suporte ao desenvolvimento Java, devemos primeiramente instalar seu ambiente de desenvolvimento, conhecido como JDK (Java Distribution Kit), disponibilizado pela Oracle por meio de download no site do Java. Essa plataforma é ne- cessária para o desenvolvimento e a execução de aplicações Java, mas, se for apenas para a execução de aplicações, devemos instalar apenas a JRE (Java Runtime Environment). O ambiente do JDK permite o desenvolvimento e a execução de aplicações Java. Esse ambiente instala o compilador e o interpretador Java, permitindo que você possa criar aplicações nessa linguagem. Ele possui uma quantidade maior de arquivos e só deve ser instalado pelos desenvolvedores, uma vez que pode atrapalhar o usuário final. É possível criar aplicações apenas com o JDK, mas seu uso é mais complexo e depende de conhecimentos avançados do sistema operacional para que o desenvolvedor possa realizar essa tarefa. Dessa forma, é comum o uso de ferramentas apropriadas, tais como o NetBeans e o Eclipse, que são específicas para o desenvolvimento de sistemas e muito apropriadas ao desenvolvimento Java. Esse assunto voltará a ser discutido em breve ainda neste conteúdo, mas é bom saber que essas ferramentas facilitarão o desenvolvi- mento e os testes de seus aplicativos. Acesse a midiateca da Unidade 1 e veja como realizar o download do ambien- te JDK. MIDIATECA 13 A seguir, podemos compreender o processo de desenvolvimento, no qual é necessário, primeiramente, que o código do programa Java seja escrito em um editor de textos. Os ambientes de desenvolvimento NetBeans e Eclipse já possuem um editor preparado para facilitar a tarefa de edição do código. Após a edição, devemos então compilar o programa Java para obtermos o arquivo com a extensão “class”, que é o segredo da portabilidade Java. O arquivo com essa extensão é, então, executado a partir de um interpretador Java. O processo de compilação do Java é diferente dos das demais linguagens, pois, en- quanto nelas a compilação gera um código de máquina para um determinado ambiente (hardware + software), esse processo em Java gera um código intermediário chamado “bytecode”, um código especial de máquina, que não leva em consideração um ambiente específico, mas sim um ambiente genérico que independe do ambiente de desenvolvi- mento. O bytecode, então, é uma linguagem de máquina genérica que o processo de compilação da linguagem Java usa para padronizar as aplicações Java independente- mente do ambiente em que ocorreu o processo de compilação. Os bytecodes indepen- dem do hardware e do software (sistema operacional) do computador no qual ocorreu a compilação, permitindo que a interpretação ocorra em qualquer ambiente, mesmo que seja diferente daquele em que ocorreu a compilação. O interpretador Java também é conhecido como JVM (Java Virtual Machine), que nada mais é do que um software ca- paz de interpretar os bytecodes em um ambiente específico. Basta que seja criado um interpretador Java (JVM) para cada ambiente em que o Java poderá ser executado, que esse interpretador poderá, então, executar qualquer aplicação Java desenvolvida para ele. Dessa forma, temos uma JVM específica para cada ambiente ou dispositivo espe- cífico, mas não podemos esquecer que, uma vez compilado um programa ou aplicação, essa técnica permite que o programa seja executado em qualquer ambiente. Existem diferentes versões da máquina virtual Java, uma para cada computador ou dispositivo que irá executar as aplicações Java. InterpretadorEditor CompiladorProg.java Prog.class O código é compilado uma vez, gerando o bytecode, que pode ser interpretado quantas vezes forem necessárias e em qualquer ambiente Java (JVM) existente. Atualmente, realiza uma compilação just in time (no momento da exe- cução) com o intuito de aumentar o desempenho. 14 • O ambiente do JRE permite apenas a execução de aplicações Java. O JRE instala apenas a máquina virtual Java (JVM), que é o interpretador Java apropriado a cada máquina ou dispositivo, existindo então várias versões da JVM. Um computador ou dispositivo com o JRE instalado poderá apenas executar aplicações Java, mas será capaz de interpretar os bytecodes gerados em outros computadores com total compati- bilidade, permitindo então a portabilidade da linguagem Java. Esse ambiente instala apenas o interpretador Java. Existe, ainda, um plug-in Java para navegadores de internet que permite a execução de aplicações Java incorporadas às páginas HTML, os chamados “applets Java”. Como vimos, a linguagem Java é híbrida: enquanto as demais são compiladas ou inter- pretadas, a linguagem Java é compilada e interpretada, sendo necessariamente obriga- tória a compilação para o bytecode, e a execução é sempre interpretada pela máquina virtual Java (JVM), que deve ser instalada no ambiente de execução do cliente. Essa ca- racterística torna a linguagem Java muito diferente das demais linguagens, contribuindo para a portabilidade das aplicações Java. Atualmente, o interpretador Java realiza uma compilação ( just in time) com o intuito de aumentar o desempenho das aplicações. Isso fez com que as execuções das aplicações se tornassem mais rápidas do que as lingua- gens de script e mais próximas, mas ainda abaixo do desempenho das linguagens com- piladas diretamente para um determinado ambiente. Acesse a midiateca da Unidade 1 e veja como realizar o download do ambien- te do JRE. MIDIATECA InterpretadorProg.class 15 Acesse a midiateca da Unidade 1 e veja o conteúdo sobre o funcionamento do Java indicado como material complementar pela professora. MIDIATECA Aplicações para smartphones com sistema operacional Android® são criadas, testadas e emuladas em computadores usados para o desenvolvimento, mas sua execução pelo cliente é toda realizada no smartphone. O Android® utiliza como linguagemnativa de desenvolvimento a linguagem Java. Curiosidade Principais características e vantagens da tecnologia Java: • Suas aplicações independem de plataforma: escreva uma vez e execute em qual- quer lugar (write once, run everywhere). • Linguagem de programação orientada a objetos, com grande versatilidade para o desenvolvimento de diferentes tipos de aplicações. • Grande biblioteca de classes prontas para suporte a interfaces gráficas, comunica- ções de dados, acesso a banco de dados, entre várias outras. • Sua segurança possui mecanismos de suporte à proteção contra vírus e suporte à criptografia. • Sintaxe de comando se baseia no padrão da linguagem C. • Sintaxe simples para a aplicação dos conceitos de orientação a objetos. • Internacionalização de sistemas, permitindo que as aplicações possam ser de- senvolvidas com suporte a várias línguas ao mesmo tempo, sendo escolhidas no momento da instalação. • Utilização do padrão Unicode, o que permite o uso de textos de qualquer sistema de escrita. • Robustez, dando suporte à criação de aplicações simples e com poucos requisitos até a aplicações altamente complexas e com muitos requisitos. • Tratamento de exceções em tempo de compilação e em tempo de execução, au- mentando a segurança na execução de aplicações altamente complexas. • Suporte a diversos protocolos de rede (TCP/IP, HTTP, FTP etc.). 16 • Execução simultânea, com o uso de múltiplas threads. • Gerenciamento de memória, com sua limpeza (garbage collection). • A JVM (máquina virtual Java) possui proteção contra a execução de aplicações malcomportadas que possam vir a paralisar o sistema. • Suporte à programação distribuída e à multitarefa. • Gerenciamento de memória virtual por meio da JVM. • Alto desempenho, sendo mais rápida do que linguagens de script, mas é mais lenta do que linguagens de programação compiladas para um ambiente. • Suas aplicações podem utilizar recursos da rede de forma tão simples quanto acessar arquivos locais. • Atualmente, diminuiu os problemas de desempenho com a inclusão da compilação just in time em vez de uma simples interpretação executada pela máquina virtual. 17 Características Comentários Existem três tipos permitidos de comentários nos programas feitos em Java: // comentário de linha: tudo na linha a partir dele é // desconsiderado pelo compilador. /* comentário de bloco: tudo entre o início e o fim é desconsiderado pelo compilador. */ /** comentário de documentação: tudo entre o início e o fim é desconsiderado pelo compilador, mas é considerado pelo documentador. (Arquivos de documentação). */ Ponto e vírgula, blocos e o espaço em branco • Na linguagem Java, os comandos são terminados com o sinal de ponto e vírgula ( ; ). • Um bloco tem seu início e seu fim representados pelo uso das chaves ({ }). • O uso dos espaços em branco (indentação) permite uma melhor visualização dos comandos de controle de fluxo e de instruções, e, em consequência, facilita a visua- lização para a realização da manutenção no programa. Identificadores Identificadores são usados para dar nomes aos elementos dos nossos programas, tais como: classes, objetos, interfaces, variáveis, constantes, métodos, atributos etc. • Os identificadores só podem começar por: – Uma letra (maiúscula ou minúscula – ver as regras da boa prática de programação). – O símbolo $. – O símbolo _ (underscore). 18 • Após o primeiro caractere, passam a ser permitidas novas letras (maiúsculas ou minúsculas), os símbolos $ e _, além dos dígitos de 0 a 9 (um identificador não pode iniciar por um dígito). • Não há limite para o número de letras, símbolos e dígitos em um identificador. • Você deve evitar o uso de caracteres acentuados e de outros símbolos ao nomear um identificador (ç, á, é, í, ó, ú, â, ê, ô, à, ã, õ, %, #, @ etc.). • Identificadores na linguagem Java são case-sensitive, ou seja, fazem distinção entre letras maiúsculas e minúsculas: pessoa, PESSOA e Pessoa são identificado- res diferentes. • Exemplos de identificadores permitidos: – Identificador – UserName – Username – _sys_var1 – $change • Algumas palavras reservadas não são permitidas como identificadores, tais como: Abstract Do Implements Private Throw Boolean Double Import Protected Throws Break Else Instanceof Public Transient Byte Extends Int Return True Case False Interface Short Try Catch Final Long Static Void Char Finally Native Super Volatile Class Float New Switch While Continue For Null Synchronized Default If Package This 19 Declaração de variáveis auxiliares A linguagem Java possui grande semelhança com a sintaxe utilizada nas linguagens C/ C++, e todas as variáveis em Java devem ser tipadas (o tipo de dado deverá ser explicita- mente informado). • Linguagens de programação fracamente tipadas: são linguagens em que as va- riáveis podem ser criadas sem a necessidade de identificação do tipo de dado que será armazenado nelas. Essas variáveis são conhecidas como variantes e podem armazenar tipos diferentes de dados durante a execução do programa. Lingua- gens como PHP e Visual Basic são exemplos de linguagens fracamente tipadas, sendo que o Visual Basic permite que as variáveis sejam obrigatoriamente tipadas quando usamos “option explicit”. • Linguagens de programação fortemente tipadas: são linguagens que obrigam todas as variáveis criadas a terem seu tipo definido, não permitindo que tipos dife- rentes do que foi declarado sejam armazenados nessas variáveis. Tipos de dados básicos A linguagem Java possui nove tipos de dados básicos, sendo oito deles primitivos e um tipo especial. Esses dados formam a base para o armazenamento em memória de todos os tipos suportados pela linguagem. A boa prática em programação Java determina que variáveis e atributos devem ser identificados pelo uso de letras minúsculas. • Tipos primitivos – São responsáveis apenas pelo armazenamento de valores na memória e são divididos em: – Lógico (boolean): responsável pelo armazenamento de um valor lógico, pode ser usado com os valores: on e off, true e false ou yes e no. Exemplo: boolean flag = false; A linguagem Java é fortemente tipada, desse modo todas as variáveis, as cons- tantes e os atributos devem ser tipados. Importante 20 – Caractere (char): responsável por armazenar um único caractere ou caracte- re especial (indicado por iniciar com uma barra invertida). Exemplos: char letra = ‘a’; char novaLinha = ‘\n’; O tipo char define um caractere simples e o representa na forma da tabela Unicode com 16-bits. O literal do tipo char pode ser representado com o uso do (‘A’). Caractere especial Descrição ‘\n’ Nova linha. ‘\r’ Enter. ‘\u????’ Especifica um caractere Unicode, o qual é representado na forma hexadecimal. ‘\t’ Tabulação. ‘\\’ Representa um caractere \ (barra invertida). ‘\”’ Representa um caractere “ (aspa). – Inteiros (byte, short, int e long): responsáveis por armazenar valores inteiros, cada tipo possui uma limitação de valores, entre os limites inferior e superior, a fim de permitir economia de espaço de memória no armazenamento de pe- quenos valores. Tipo Tamanho Escopo byte 8 bits -27 . . . . 27 - 1 short 16 bits -215 . . . . 215 - 1 int 32 bits -231 . . . . 231 - 1 long 64 bits -263 . . . . 263 - 1 21 Exemplos: byte vByte = 127b; // maior valor byte possível, o menor é -128 short vShort = 5000s; int vInt = 20000; long vLong = 2000000000; Obs.: com exceção do int, os demais, ao receberem valores constantes, devem indicar o tipo do valor, sendo: b ou B para byte, s ou S para short e l ou L para long. – Reais (float e double): responsáveis por armazenar valores reais na memória. Tipo Tamanho Descrição float 32 bits Armazena valor real de simples precisão. Por possuir uma quantidade menor de bits para ar- mazenar o valor, não é capaz de guardar com grande precisão números muito pequenos ou muito grandes. double 64 bits Armazena valor realde dupla precisão. Um double possui maior precisão, ou seja, podemos armazenar valores muito menores ou muito maiores do que em um float, mas utilizam maior espaço de memória para o armazenamento. Exemplos: float vFloat = 1.27f; double vDouble = 5000.050556; Obs.: o float também precisa de um indicador de tipo quando recebe um valor constante, que deve indicar seu tipo: f ou F. Isso não é necessário para a atribui- ção de um valor do tipo double. A linguagem Java realiza uma conversão de qualquer tipo numérico para double sempre que um tipo diferente de double é atribuído a uma variável double. Essa característica é chamada de “coerção” e é empregada na linguagem Java. 22 • Tipo especial – Responsável por armazenar o valor em uma classe, com a possi- bilidade de uso dos métodos disponibilizados por ela. – String: o tipo String não é um tipo primitivo, mas especial. O valor é armazena- do em uma classe, por isso esse tipo é iniciado com letra maiúscula, ao contrá- rio dos tipos primitivos, que sempre se iniciam por letras minúsculas. Esse tipo é usado para armazenar uma sequência de caracteres e possui várias ações (métodos) que podem ser usadas sobre os valores armazenados. Variáveis e atributos do tipo String também devem ter identificadores iniciados por letras minúsculas. Valores constantes Valores constantes em Java são obtidos com o emprego do modificador final. Qualquer tipo associado a ele fará com que, ao ser inicializado, o valor não possa mais ser alterado. A boa prática em programação Java define que constantes devem ser identificadas por meio do uso de letras maiúsculas. Exemplos: final int IDADEMINIMA = 18; // o valor será constante e não poderá // ser alterado. final String NOMEPROJETO = “Programação Java”; Operadores • Operadores aritméticos: Operador Descrição = Atribuição + Soma - Subtração * Multiplicação / Divisão % Resto da divisão inteira 23 Exemplos: int a = 7, b = 2, c;// declaração de variáveis c = a + b;// atribuição de c com a soma inteira de a com b => 9 c = a - b;// atribuição de c com a subtração inteira de a com b => 2 c = a / b;// atribuição de c com a divisão inteira de a por b => 3 c = a * b;// atribuição de c com a multiplicação inteira de a por b => 14 c = a % b;// atribuição de c com o resto da divisão inteira de a por b => 1 int a = 7; // declaração de variáveis double b = 2.0, c; // declaração de variáveis c = a / b; // atribuição de c com a divisão real de a por b => 3,333... Todo cálculo entre inteiros resulta em um inteiro, mesmo a divisão. Para uma divisão entre inteiros que se queira a parte fracionária, é necessário converter o tipo, e isso pode ser feito por meio de cast. Exemplos: int x=7, y = 3, z; z = x / y; // z valerá 2: 7 / 3 => 2 e resto 1. Podemos, então, usar o cast: int x=7, y = 3; float z; z = (float) x / y; Sempre que os operandos de uma expressão aritmética forem inteiros, a ope- ração será realizada exclusivamente com os valores inteiros, resultando em um valor inteiro para a atribuição. Já quando um número inteiro e um número em ponto flutuante são usados como operandos sem uma única operação aritmé- tica, o resultado é também um número em ponto flutuante. O número inteiro é implicitamente convertido em um número em ponto flutuante antes de a ex- pressão ser avaliada para a realização da operação. Importante 24 • Operadores de incremento e decremento: No Java, os operadores são muito similares ao estilo e à funcionalidade de outras linguagens, por exemplo, as linguagens C/C++. – Pré-incremento: x = 10; x = x + 1; O valor da variável x é 11 ou x = 10; ++x; O valor da variável x é 11. – Pós-incremento: x = 10; x = x + 1; O valor da variável x é 11 ou x = 10; x++; O valor da variável x é 11. Diferença entre o pré-incremento e o pós-incremento em atribuições: Exemplo 1: int y, x = 10; y = ++x ; => neste momento, a variável x foi primeiramente incremen- tada e vale 11, já a variável y receberá o valor de x e também valerá 11. Exemplo 2: int y, x =10; y = x++; => neste momento, a variável x será pós-incrementada, e, sendo assim, a variável y receberá primeiramente o valor de x e valerá 10; posteriormente, a variável x será incrementada e passará a valer 11. 25 Pré-decremento e o pós-decremento: --x; e x--; => Valem as mesmas regras apresentadas para o incremento, mas dimi- nuem uma unidade respectivamente. • Operadores relacionais: Operador Descrição == Igualdade/comparação != Negação > Maior que < Menor que >= Maior ou igual a <= Menor ou igual a Exemplos: if(a > b) if(a+b >= c) • Operadores em expressões lógicas Operador Descrição ! NÃO lógico && E lógico || OU lógico Esses operadores seguem as tabelas-verdade das operações lógicas de NÃO (nega- ção lógica), E (AND) e OU (OR). Exemplos: if( a > b && c <= d) if( ! a < b || c != d && e > f ) 26 Precedência na avaliação: !, &&, || Assim, o segundo exemplo equivale a, de acordo com a precedência: if( ( !(a < b) || (c != d && e > f) ) ) • Operadores de bits: Operador Descrição & E entre bits ^ OU EXCLUSIVO entre bits | OU entre bits Precedência: &, ^, | Exemplos: byte a = 45, b = 70, c=0; c = a & b; // o valor de c será 4 128 64 32 16 8 4 2 1 a = 0 0 1 0 1 1 0 1 = 45 b = 0 1 0 0 0 1 1 0 = 70 c = 0 0 0 0 0 1 0 0 = 4 byte a = 45, b = 70, c=0; c = a ^ b; // o valor de c será 107 128 64 32 16 8 4 2 1 a = 0 0 1 0 1 1 0 1 = 45 b = 0 1 0 0 0 1 1 0 = 70 c = 0 1 1 0 1 0 1 1 = 107 No OU exclusivo, apenas um dos operandos pode ser 1 (um), não os dois. 27 byte a = 45, b = 70, c=0; c = a | b; // o valor de c será 111 128 64 32 16 8 4 2 1 a = 0 0 1 0 1 1 0 1 = 45 b = 0 1 0 0 0 1 1 0 = 70 c = 0 1 1 0 1 1 1 1 = 111 As operações com bits são muito importantes não apenas para a definição de máscaras e submáscaras de rede, mas principalmente para as operações relacionadas à criptogra- fia para a segurança de dados. Nesse contexto, a operação de OU exclusivo é fundamen- tal para a realização das operações de criptografia. • Operador condicional (ternário): O operador ? : é usado em expressões condicionais. Pode ser usado em expressões aritméticas para tomar uma decisão no momento do cálculo, para definir um valor de retorno, entre outras aplicações. Exemplo: int a=15, b=5, c; c= b * ((a>=10) ? 20 : 10);// como a é maior do que 10, b será multi- plicado por 20 System.out.println(“Valor de c= “ + c);// o resultado será 100 • Boa prática em programação Java (BP): Convenções de codificação na linguagem Java: • Classe – Nomes de classes podem ser maiúsculos, minúsculos ou misturados (le- tras maiúsculas e minúsculas), mas, por convenção, o nome de classes deve come- çar por uma letra maiúscula, e, a cada nova palavra, passa-se a iniciar por maiúscula. Exemplo: class Aluno { } 28 • Interfaces – Nomes de interfaces seguem o mesmo formato de classes. Exemplo: interface Atleta { } • Métodos – Nomes de métodos podem ser verbos, podendo misturar letras maiúsculas e minúsculas. Entretanto, a primeira letra deve ser minúscula, e, a cada nova palavra, passa-se a iniciar por maiúscula. Exemplo: cadastrar( ) { } • Atributos – Nomes de atributos seguem a regra de identificação de métodos (iniciar por letras minúsculas), podendo misturar entre maiúsculas e minúsculas, sendo que a primeira letra deve ser minúscula, e, a cada nova palavra, passa-se a iniciar por maiúscula. Exemplo: String nome; • Variáveis e objetos – Todas as instâncias de classes e variáveis globais su- portam maiúsculas e minúsculas e devem ser nomeadas tal qual um atributo, iniciando por letra minúscula. Exemplo: Carro carro = new Carro(); • Identificadores com mais de uma palavra – Em todos os casos anteriores, as demais palavras usadas para nomear um identificador devem começar por le- tras maiúsculas. Exemplos: class AlunoGraduacao { } interface AtletaProfissional { } double alturaPredio; setNome () { } • Constantes – Nomes de constantes podem sermaiúsculos, minúsculos, mis- turados ou separados com underscore (_). Na boa prática de programação, usa- mos todas as letras maiúsculas. 29 • Controles de estruturas – Convencionou-se o uso obrigatório de { } (chaves). • Espaços – Convencionou-se o uso de quatro espaços para indentação. • Comentários – Use os comentários para explicar os segmentos de código que não são óbvios. Veja, a seguir, um exemplo de uso da boa prática de programação. • Estruturas de controle de fluxo: – Estruturas condicionais: - Se (if): if (condição) { instruções; }// A cláusula else é opcional. - Se / senão (if ... else): if (condição) { instruções; } else { instruções; } 30 - Se / Senão Se / Senão (if ... else if ... else): A cláusula if ocorre apenas uma vez. A cláusula else if pode ocorrer nenhuma ou várias vezes. A cláusula else pode ocorrer apenas uma vez. if (condição1) { instruções; } else if (condição2) { instruções; } else if (condição3) { instruções; } else { instruções; } - Caso (switch … case): Estruturas de decisão caracterizadas pela possibilidade de uma variável pos- suir vários valores. A cláusula switch ocorre uma vez, e a variável de controle em C/C++ e, Java pode ser um tipo inteiro ou caractere. A cláusula case pode ocorrer de uma a várias vezes, e default é opcional. switch (variável) { case 1 : instruções; break; case 2 : instruções; break; case 3 : instruções; break; default: instruções para condições não previstas anteriormente; } 31 switch (variável) // Pode-se simular o uso do OU em um switch: { case 2 : numeroDias = 28; break; case 4 : case 6 : case 9 : case 11: numeroDias = 30; break; case 1 : case 3 : case 5 : case 7 : case 8 : case 10 : case 12 : numeroDias = 31; break; default: System.out.println(“Mês não identificado”); } • Estruturas de repetição: – Para (for): Estrutura de repetição controlada por uma ou mais variáveis contadoras e ca- racterizadas pela existência de três parâmetros (opcionais): 1. Valor inicial. 2. Condição para parada das iterações. 3. Quantidade de incrementos/decrementos a cada iteração. Exemplos: for(inic (1); cond(2); passo(3)) // Repetição controlada por uma variável: for (int i=0; i<valor; i++) switch(letra){ case ‘a’: case ‘A’: opcao = 1; break; ... 32 { instruções; } // Repetição controlada por duas variáveis: for (x=1, y=2; x*y<valor; x++, y+=2) { instruções; } // Repetição sem fim for ( ; ; ) { instruções; // você pode usar uma condicional if () e a instrução // break, que encerrará a repetição } – Enquanto / Faça (while): Estrutura de repetição que realiza as operações desejadas enquanto uma de- terminada condição especificada for verdadeira. // Teste de condição no início while (condição) { instruções; } – Faça / Enquanto (do ... while): Estrutura de repetição semelhante à anterior, com o diferencial de que as con- dições são verificadas ao final da estrutura, permitindo que as operações es- pecificadas sejam sempre executadas pelo menos uma vez. // Teste de condição no final do { instruções; } while (condição); 33 Acesse a midiateca da Unidade 1 e veja o conteúdo Java: introdução, caracte- rísticas, estrutura e ambientes de programação indicado como material com- plementar pela professora. MIDIATECA 34 Ambientes de desenvolvimento Existem várias ferramentas para o desenvolvimento de aplicações utilizando a tecnologia Java, mas as duas principais são o Eclipse e o NetBeans. Você poderá escolher a que mais lhe for agradável para desenvolver os projetos dos nossos exemplos e exercícios práticos, mas não será necessário realizar as tarefas em ambos — basta escolher a que você mais gostar. Outro ponto importante é que as empresas possuem sua preferência, mas isso não será problema, porque quem está acostumado com uma delas não terá dificuldades ao utilizar a outra, uma vez que as duas são muito parecidas e realizam as mesmas tarefas. JDK Antes de mais nada, é importante que você instale o JDK. No endereço disponibilizado na midiateca da Unidade 1, você poderá efetuar o download da última versão do JDK até o momento e também baixar uma versão antiga do NetBeans. Mais a seguir, você poderá efetuar o download da versão mais atual. Clique sobre o botão “Download” do Oracle JDK versão Java SE 12.0.1 e escolha: Windows 158.49 MB jdk-12.0.1_windows-x64_bin.exe Não se esqueça de aceitar o contrato de licença após analisá-lo e de se cadas- trar na Oracle caso seja necessário. Depois, basta instalá-lo seguindo as orientações do instalador. Após a instala- ção, não se esqueça de reiniciar a máquina para que as configurações sejam atualizadas. Essa versão irá atender tanto ao Eclipse como ao NetBeans. Acesse a midiateca da Unidade 1 e veja como realizar o download do ambiente JDK, disponibilizado pela Oracle. MIDIATECA 35 NetBeans Para realizar o download do NetBeans, acesse a midiateca da Unidade 1. Faça a escolha pela versão mais recente e pelo pacote “bin” (neste momento, é a versão 11.0), que contém os executáveis da ferramenta; o pacote “source” contém todos os códigos do projeto do NetBeans, que foi feito em Java. Essa versão não precisa ser instalada — basta descompactar o arquivo, e você encontrará o executável na pasta “bin” do NetBeans. Se quiser, você poderá clicar sobre o executável com o botão direito do mouse e enviar para a área de trabalho para criar um atalho no desktop. Acesse a midiateca da Unidade 1 e veja como realizar o download do NetBeans. MIDIATECA Acesse a midiateca da Unidade 1 e veja um tutorial de download do Java e da IDE NetBeans. MIDIATECA 36 Eclipse Caso prefira, realize o download do Eclipse acessando também a midiateca da Unidade 1 e siga os procedimentos de instalação. Nas versões anteriores, bastava apenas descompactar o arquivo, assim como no NetBeans. Caso al- gum problema de instalação ocorra, será aberta uma janela do navegador com informações de suporte. Usaremos o seguinte programa para testar as duas ferramentas, e você decidirá qual prefere utilizar no desenvolvimento de seus projetos: import java.util.Scanner; public class Media { public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc = new Scanner(System.in); double media, nota1, nota2, nota3; double menorNota; System.out.println(“Digite a nota de A1:”); nota1 = Double.parseDouble(sc.nextLine()); System.out.println(“Digite a nota de A2:”); nota2 = Double.parseDouble(sc.nextLine()); System.out.println(“Digite a nota de A3:”); nota3 = Double.parseDouble(sc.nextLine()); if((nota1 <= nota2) && (nota1 <= nota3)) { menorNota = nota1; Acesse a midiateca da Unidade 1 e veja como realizar o download do Eclipse. MIDIATECA 37 } else { if((nota2 <= nota1) && (nota2 <= nota3)) { menorNota = nota2; } else { menorNota = nota3; } } media = (((nota1 + nota2 + nota3) - menorNota)) /2.0; System.out.println(“A média das 2 maiores notas é:” + media); sc.close(); } } • Trabalhando com o NetBeans 11: Tela de abertura do NetBeans 11. Fonte: The Apache Software Foundation© (2019). 38 Para criar um novo projeto, clique em “File” e, em seguida, “New Project”. Fonte: The Apache Software Foundation© (2019). Para a disciplina, sempre use “Java with Ant” e “Java Application”. Clique em “Next” para continuar. Fonte: The Apache Software Foundation© (2019). 39 Defina o nome do projeto como “Media”. Clique em “Finish” para terminar e criar o projeto. Fonte: The Apache Software Foundation© (2019). Tela do NetBeans com o projeto criado. Fonte: The Apache Software Foundation© (2019). 40 Faça a codificação do programa na página de edição. Fonte: The Apache Software Foundation© (2019). Para executar esse código, selecione o arquivo da classe na área de projetos e clique com o botão direito do mouse escolhendo “Run File”para executar o código. Fonte: The Apache Software Foundation© (2019). 41 O código será executado na área de Output abaixo do código. Todas as áreas po- dem ser redimensionadas, assim como foi feito no exemplo ao aumentar a área de Output para analisar a execução. Fonte: The Apache Software Foundation© (2019). Sua primeira aplicação Java desenvolvida no NetBeans está pronta! • Trabalhando com o Eclipse Oxygen 3 (atualizado para março de 2018): Na tela principal do Eclipse, acesse o “Menu File”, em seguida, a opção “New”, e es- colha “Java Project”. Fonte: Eclipse Foundation, Inc.© (2019). 42 Defina o nome do projeto “Media” e clique em “Finish” para criar o projeto. Fonte: Eclipse Foundation, Inc.© (2019). Tela do Eclipse com o projeto Media criado. Fonte: Eclipse Foundation, Inc.© (2019). 43 Crie uma classe Java para realizar a codificação da aplicação. Selecione o projeto e clique com o botão direito do mouse, selecionando “New” e “Class”. Fonte: Eclipse Foundation, Inc.© (2019). Determine o nome da classe (Media), selecione a opção de criação do método “main” para podermos codificar a aplicação e clique em “Finish” para criar a classe. Fonte: Eclipse Foundation, Inc.© (2019). 44 Área de codificação da classe pronta para a edição do código. Fonte: Eclipse Foundation, Inc.© (2019). Codificação da classe realizada. Fonte: Eclipse Foundation, Inc.© (2019). 45 Execute o código, selecione a classe e clique com o botão direito do mouse sobre ela, escolhendo “Run As” e “Java Application”. Fonte: Eclipse Foundation, Inc.© (2019). Área de execução do código para a realização de testes do programa. Você pode redimensionar as diversas áreas de forma a facilitar seu trabalho. Fonte: Eclipse Foundation, Inc.© (2019). Pronto! Seu primeiro programa Java desenvolvido no Eclipse está concluído. 46 Você conheceu as características da tecnologia e da linguagem Java e pode aplicá-las na prática, para isso escolha uma das ferramentas de desenvolvi- mento (NetBeans ou Eclipse) e desenvolva um programa para resolver o pro- blema a seguir. Neste primeiro momento, não se preocupe com os conceitos de orientação a objetos. Problema: o cálculo do IMC (índice de massa corporal) é utilizado para detectar casos de desnutrição ou obesidade. Sua fórmula é bem simples: divide o peso pela altura elevada ao quadrado. O programa deverá solicitar ao usuário seu peso e sua altura e retornar o valor do IMC e em qual situação ele se encontra, de acordo com a tabela a seguir. IMC Resultado Menos do que 18,5 Abaixo do peso Entre 18,5 e 24,9 Peso normal Entre 25 e 29,9 Sobrepeso Entre 30 e 34,9 Obesidade grau 1 Entre 35 e 39,9 Obesidade grau 2 Mais do que 40 Obesidade grau 3 NA PRÁTICA 47 Resumo da Unidade 1 Nesta unidade, você conheceu a história da linguagem Java e os tipos de aplicações que pode desenvolver utilizando essa tecnologia. Conheceu, ainda, as características da tecnologia Java e as estruturas de controle de fluxo condicionais e de repetição. Você também pôde avaliar duas das ferramentas mais usadas no desenvolvimento de aplicações baseadas na tecnologia Java, o Eclipse e o NetBeans, para poder escolher aquela com a qual você se sinta mais à vontade para usar no desenvolvimento de seus exercícios práticos. Histórico da linguagem Java; tipos de dados; operadores; variáveis; constan- tes; estruturas de controle de fluxo; conversões de tipos; entrada e saída; pla- taformas de desenvolvimento. CONCEITO 48 Referências DEITEL, P. Java: como programar. 10. ed. São Paulo: Pearson Education do Brasil, 2017. Biblioteca Virtual. SCHILDT, H. Java para iniciantes: crie, compile e execute programas Java rapidamente. 6. ed. Porto Alegre: Bookman, 2015. Minha Biblioteca. Os conceitos básicos da programação orientada a objetos utilizando o Java UNIDADE 2 50 A programação orientada a objetos possui diversos conceitos associados ao desenvolvimento de sistemas. Alguns desses conceitos são básicos e estão disponibilizados na maioria das linguagens de programação, mas nem todos os conceitos de programação orientada a objetos são disponibilizados em todas essas linguagens; alguns podem não estar presentes ou estar presentes parcialmente. Nesta unidade, iremos conhecer os principais conceitos da programação orientada a objetos, que fazem parte dos conceitos básicos para a implementação dessa técnica de desenvolvimento utilizando o Java. INTRODUÇÃO Nesta unidade, você será capaz de: • Compreender e aplicar os conceitos básicos da programação orientada a ob- jetos com Java. OBJETIVO 51 Classes, objetos, atributos e métodos; mé- todos de acesso Classes As classes na programação orientada a objetos são responsáveis por descrever as características e as ações que o objeto poderá realizar. Dessa forma, a classe é desenvolvida como uma biblioteca, uma vez que uma mesma classe pode ser responsável pela criação de diversos objetos em uma aplicação, assim como pode ser utilizada em várias outras aplicações diferentes. Essa característica é responsável pelo reaproveitamento de código, um dos principais benefícios da programação orientada a objetos. É parte da codificação e da criação de uma classe a ser utilizada em sua biblioteca. Toda classe representa um tipo, ou seja, assim como temos os tipos básicos (byte, short, int, long, float, double, char e boolean) e o tipo especial (String), toda classe representa uma estrutura de dados que pode armazenar um conjunto de características. Na programação orientada a objetos, temos dois tipos de membros em uma classe, que são responsáveis por determinar as características e ações dos objetos nas aplicações. É na aplicação que os objetos são criados e realizam suas ações. Uma classe possui apenas dois tipos de membros: o Atributos – Os atributos de uma classe são responsáveis por descrever o objeto quanto a suas características. Cada objeto deve ser analisado, e apenas as características importantes ao sistema devem ser levadas em consideração. As características de um automóvel para um sistema de estacionamento podem se resumir em modelo, cor e placa, sendo suficientes para representar o automóvel nesse contexto. Já para um sistema mais abrangente, como o Detran, por exemplo, a codificação do chassi, o fabricante, o número do Renavam e potência são igualmente importantes. Dessa forma, é necessário analisar o contexto do projeto de sistema (minimundo) e determinar quais são as características importantes de cada objeto ao contexto do sistema. Em um sistema acadêmico, por exemplo, são importantes o nome, matrícula, CR, curso, entre outras características, mas o time para o qual o aluno torce ou a sua religião não tem importância. Atributos devem, então, definir um tipo de dado e um identificador para cada característica relevante do objeto para o sistema. 52 Atributos não devem ser identificados de formas diferentes: uma vez que ocorra uma definição de projeto sobre o seu identificador, não devemos alterá-lo. A boa prática em desenvolvimento Java facilitará o desenvolvimento em equipes se todos usarem sempre o identificador-padrão do projeto. Qualquer mudança atrasará o projeto, e provavelmente parte dele precisará ser alterada. Se um atributo foi definido como NúmeroPessoas: inteiro, ele deve ser declarado como o atributo: int numeroPessoas; Isso de acordo com a boa prática de desenvolvimento Java (BP). public class Automovel { // Atributos String modelo, cor, placa; int hora, minuto, dia, mes, ano; } Em uma aplicação, podemos então criar diferentes objetos Automovel, baseados em apenas uma classe: public class AppAutomovel { public static void main(String[] args) { // TODO Auto-generated method stub Automovel auto1 = new Automovel(); auto1.modelo = “Corsa”; auto1.cor = “Branca”; auto1.placa = “RIO1A01”; auto1.hora = 12; auto1.minuto = 25; auto1.dia = 03; auto1.mes = 06; auto1.ano = 2019; Automovel auto2= new Automovel(); Automovel auto3 = new Automovel(); Automovel auto4 = new Automovel(); Automovel auto5 = new Automovel(); Exemplo 53 auto2.placa = “SAL1A02”; auto3.placa = “SAO1A03”; auto4.placa = “VIT1A04”; auto5.placa = “BEL1A05”; System.out.println(“Placa do auto1: “ + auto1.placa); System.out.println(“Placa do auto2: “ + auto2.placa); System.out.println(“Placa do auto3: “ + auto3.placa); System.out.println(“Placa do auto4: “ + auto4.placa); System.out.println(“Placa do auto5: “ + auto5.placa); } } Notas: 1. A classe Automovel foi definida uma única vez, e a aplicação criou cinco diferentes objetos Automovel. 2. Para cada objeto Automovel criado, foi reservada uma região de memória para armazenar as suas características (atributos). 3. As características dos diferentes objetos não se misturam, uma vez que a atribuição de cada característica exige a identificação do objeto; dessa forma, as atribuições das placas não se misturaram. 4. Exibir todas as características de cada Automovel exigiria uma grande quantidade de programação na aplicação, com códigos quase repetidos, alterando apenas o identificador de cada objeto. o Métodos – Os métodos de uma classe são responsáveis pelas ações que o objeto pode realizar. Enquanto os atributos se resumem apenas na declaração das suas características, os métodos possuem um conjunto de instruções que serão executadas para realizar ações ou funções referentes ao objeto. No caso acima, como temos oito atributos (características), a impressão de cada atributo de cada objeto poderia demandar um conjunto de 40 instruções (cinco objetos x oito atributos). Podemos, então, criar dois métodos: um método capaz de realizar a exibição dos dados do objeto e outro para realizar a entrada de dados dos atributos do objeto. Esses métodos serão responsáveis pela entrada de dados para atribuição das características e por exibir todos os atributos do objeto. Ambos os métodos serão desenvolvidos apenas uma vez e poderão ser executados por todos os objetos criados em qualquer aplicação. As ações ocorrerão sempre sobre o objeto que estiver identificado na chamada da ação. 54 import java.util.Scanner; public class Automovel { // Atributos String modelo, cor, placa; int hora, minuto, dia, mes, ano; // Métodos public void entradaDados ( ){ Scanner sc = new Scanner(System.in); System.out.println(“Digite o Modelo :”); modelo = sc.nextLine(); System.out.println(“Digite a Cor :”); cor = sc.nextLine(); System.out.println(“Digite a Placa :”); placa = sc.nextLine(); System.out.println(“Digite a Hora :”); hora = Integer.parseInt(sc.nextLine()); System.out.println(“Digite o Minuto :”); minuto = Integer.parseInt(sc.nextLine()); System.out.println(“Digite o Dia :”); dia = Integer.parseInt(sc.nextLine()); System.out.println(“Digite o Mês :”); mes = Integer.parseInt(sc.nextLine()); System.out.println(“Digite o Ano :”); ano = Integer.parseInt(sc.nextLine()); } public void imprimir ( ){ System.out.println(“Modelo : “ + modelo); System.out.println(“Cor : “ + cor); System.out.println(“Placa : “ + placa); System.out.println(“Hora : “ + hora); System.out.println(“Minuto : “ + minuto); System.out.println(“Dia : “ + dia); System.out.println(“Mês : “ + mes); System.out.println(“Ano : “ + ano); } } Exemplo 55 Em uma aplicação, podemos, então, criar diferentes objetos Automovel, baseados em apenas uma classe: public class AppAutomovel { public static void main(String[] args) { // TODO Auto-generated method stub // criação dos 5 objetos Automovel auto1 = new Automovel(); Automovel auto2 = new Automovel(); Automovel auto3 = new Automovel(); Automovel auto4 = new Automovel(); Automovel auto5 = new Automovel(); // entrada de dados dos 5 objetos auto1.entradaDados(); auto2.entradaDados(); auto3.entradaDados(); auto4.entradaDados(); auto5.entradaDados(); // exibição dos dados dos 5 objetos auto1.imprimir(); auto2.imprimir(); auto3.imprimir(); auto4.imprimir(); auto5.imprimir(); } } Notas: 1. A classe Automovel foi alterada (sofreu uma evolução), e foram criados dois métodos. 2. Os métodos entradaDados e imprimir passaram a realizar as ações de atribuições e de exibição dos dados armazenados, respectivamente. 3. Para cada objeto Automovel criado, os métodos são executados, mas a entrada de dados e a exibição ocorrem separadamente para cada objeto, uma vez que devemos sempre identificar o objeto que realizará a ação. 4. Os métodos foram reaproveitados por todos os objetos da aplicação, mas eles também estão disponíveis para qualquer outro objeto em qualquer outra aplicação que crie objetos da classe Automovel criada. 56 5. O objeto Scanner sc foi definido dentro do método de entrada de dados, porque ele não representa uma característica do objeto Automovel; esse objeto é apenas auxiliar para a realização da ação do método. Um outro ponto importante é a evolução das classes: uma vez que elas são bibliotecas disponíveis para as aplicações, essas classes podem ser utilizadas em várias aplicações diferentes. É normal que determinadas aplicações tenham algumas exigências a mais do que outras; dessa forma, as classes na programação orientada a objetos podem sofrer evoluções, mas isso não quer dizer que elas passarão a atender a apenas uma aplicação. Elas devem evoluir mantendo a compatibilidade com as aplicações anteriores. Essa forma de evolução permite que cada classe criada possa ser utilizada em diversas aplicações distintas, daí a ideia de biblioteca de classes. Objetos Objetos na programação orientada a objetos representam os objetos reais dentro do sistema de computação. Como nos exemplos anteriores, criamos cinco diferentes objetos, e cada um tem características diferentes, cada um deles pode representar um automóvel diferente. Os modelos, cores, placas e demais características são próprios de cada objeto, por isso eles se assemelham em suas características (atributos comuns), mas se diferenciam em suas propriedades. Cada objeto possui para cada atributo um valor diferente, ou seja, para o atributo placa, cada automóvel possui uma propriedade placa próprio, o que o torna diferente dos demais. Enquanto as classes são criadas e ficam à disposição das aplicações que irão usar objetos criados a partir delas, os objetos só existem na memória do computador; eles só existirão quando a aplicação estiver em execução e representarão objetos do contexto (minimundo) do sistema. Dizemos que os objetos “só existem em tempo de execução”. Os objetos realizam interações com o sistema realizando trocas de mensagens. Essas trocas de mensagens são realizadas pelos métodos, quando são utilizados. A troca de mensagens é a forma como a programação orientada a objetos realiza suas tarefas. 57 A classe Automovel então faz parte de uma biblioteca de classes criadas para serem utilizadas em aplicações, que irão criar objetos baseados nessas classes. Exemplo: // Aplicação 1: public class AppAutomovel { public static void main(String[] args) { // TODO Auto-generated method stub // criação dos 5 objetos Automovel auto1 = new Automovel(); Automovel auto2 = new Automovel(); Automovel auto3 = new Automovel(); Automovel auto4 = new Automovel(); Automovel auto5 = new Automovel(); } } // Aplicação 2: public class AppAuto { public static void main(String[] args) { // TODO Auto-generated method stub // criação dos 5 objetos Automovel a1 = new Automovel(); Automovel a2 = new Automovel(); Automovel a3 = new Automovel(); } } Notas: 1. Ambas as aplicações criam objetos Automovel da mesma classe. 2. A classe Automovel pode ser usada em diversas aplicações diferentes, sem a necessidade de que ela seja duplicada. 3. Em ambas as aplicações, os objetos Automovel criados serão capazes de representar objetos da vida real (contexto do sistema — minimundo). Exemplo 58Resumindo: • Classe: é um conjunto de códigos de programação que definem um modelo para a criação de um ou mais objetos. É uma estrutura capaz de representar diferentes objetos, com propriedades distintas, mas com as mesmas características. A classe é o modelo para a criação dos objetos. • Objeto: é uma entidade única capaz de reunir propriedades (atributos próprios de cada objeto) que difiram um objeto do outro. Pode efetuar ações para a realização de tarefas ao utilizar seus métodos. Os métodos de cada objeto realizam operações exclusivamente sobre as suas propriedades. • Atributos: definem um conjunto de descritores do objeto de forma geral e de acordo com as características necessárias do objeto para o contexto do sistema. • Métodos: representam as ações que podem ser executadas por cada objeto. Métodos de acesso São métodos especiais que são utilizados para evitar acesso direto aos seus atributos. Uma atribuição direta a um atributo não permite que possamos analisar se o valor a ser atribuído está de acordo com o realizado. MIDIATECA Acesse a midiateca da Unidade 2 e veja o conteúdo sobre objetos indicado como material complementar. 59 Imagine atribuir um valor –5 para uma idade, ou deixar de definir um nome. Esses exemplos demonstram demonstram que não há como realizar uma análise durante uma atribuição direta. Exemplos: auto1.hora = -3; auto1.placa = “AAA”; auto1.modelo = “”; Notas: 1. Foi determinada uma hora inválida. 2. A placa não está completa. 3. O modelo não foi definido. Exemplo Nesses casos, as atribuições ocorreram sem que nenhum tipo de teste pudesse ser realizado a fim de evitar essas atribuições incorretas. Outro ponto importante que será visto mais adiante é o conceito de encapsulamento, em que os atributos deverão estar protegidos para que não possam ser acessados indiscriminadamente pelas aplicações. Esse conceito é responsável por proteger os atributos de um objeto, dando mais segurança para que eles não sejam alterados diretamente pela aplicação. o Métodos setters São métodos especiais responsáveis por realizar a atribuição e o armazenamento na memória de uma propriedade do objeto. Esses métodos recebem como parâmetro o valor a ser atribuído e realizam uma análise para identificar se o valor é válido. De acordo com a boa prática em programação Java, esses métodos se iniciam pela palavra set, seguida pelo nome do atributo com letra inicial maiúscula, uma vez que será a segunda palavra do identificador. 60 Devem ser públicos (public), para que possam ser usados em qualquer aplicação. São sempre do tipo void, porque nunca retornam nada. Possuem sempre um parâmetro do mesmo tipo do atributo que realizará a atribuição. Devem realizar a atribuição do conteúdo do parâmetro da propriedade correspondente do objeto. Exemplos: public void setModelo(String m) { modelo = m; } public void setCor(String c) { cor = c; } public void setPlaca(String p) { placa = p; } public void setHora(int h) { hora = h; } public void setMinuto(int m) { minuto = m; } public void setDia(int d) { dia = d; } public void setMes(int m) { mes = m; } public void setAno(int a) { ano = a; } Exemplo 61 Notas: 1. Para cada atributo, foi criado um método setter. 2. Todos os métodos são públicos (public). 3. Todos os métodos são do tipo void, uma vez que não realizam retorno de dados. 4. Os parâmetros são do mesmo tipo do atributo. 5. Realizam a atribuição do valor do parâmetro da propriedade do objeto. 6. Os identificadores dos parâmetros puderam ser usados em diferentes métodos, mesmo sendo de diferentes tipos, porque eles somente são válidos dentro de seus respectivos métodos. Você ainda pode incluir testes para analisar se os valores estão de acordo com o esperado: public void setModelo(String m) { if(!m.isEmpty()) { modelo = m; } else { System.out.println(“valor inválido, não foi atribuído”); } } public void setPlaca(String p) { if(p.length()!=7) { placa = p; } else { System.out.println(“valor inválido, não foi atribuído”); } } public void setHora(int h) { if (h >= 0 && h <= 24){ hora = h; } Exemplo 62 else { System.out.println(“valor inválido, não foi atribuído”); } } Notas: 1. O modelo só será atribuído se o texto passado como parâmetro não estiver vazio. 2. A placa só será atribuída se o texto passado como parâmetro tiver exatamente sete caracteres. 3. A hora só será atribuída se o valor da hora passado como parâmetro estiver entre 0 e 24. o Métodos getters São métodos especiais responsáveis por recuperar valores atribuídos às propriedades e que se encontram armazenados na memória de um objeto. Esses métodos nunca recebem parâmetro, uma vez que apenas devem retornar o valor atribuído à propriedade. De acordo com a boa prática em programação Java, esses métodos se iniciam pela palavra get, seguida pelo nome do atributo com letra inicial maiúscula, uma vez que será a segunda palavra do identificador. Devem ser públicos (public) para que possam ser usados em qualquer aplicação. Nunca são do tipo void, porque sempre retornam um valor, devendo ser do mesmo tipo do atributo que irá retornar. Não possuem parâmetros, porque não recebem valores. Devem apenas realizar o retorno do valor armazenado na propriedade do objeto. 63 Exemplos: public String getModelo() { return modelo; } public String getCor() { return cor; } public String getPlaca() { return placa; } public int getHora() { return hora; } public int getMinuto() { return minuto; } public int getDia() { return dia; } public int getMes() { return mes; } public int getAno() { return ano; } Notas: 1. Para cada atributo, foi criado um método getter. 2. Todos os métodos são públicos. 3. Nenhum método é do tipo void, devendo ser definidos com o mesmo tipo do atributo que irá realizar o retorno. 4. Não recebem parâmetros. 5. Realizam o retorno do valor da propriedade do objeto armazenado na memória. Exemplo 64 o Atualização da classe (evolução) A classe Automovel foi atualizada, mas a aplicação usada anteriormente não precisará ser alterada, uma vez que a classe permanece compatível com as aplicações anteriores. De forma a melhorar a classe e utilizar os métodos de acesso criados, a nova versão da classe (evolução) irá utilizar os métodos setters e getters nos métodos de entrada de dados e de exibição. Classe Automovel atualizada: import java.util.Scanner; public class Automovel { // Atributos String modelo, cor, placa; int hora, minuto, dia, mes, ano; // Métodos de acesso public String getModelo() { return modelo; } public void setModelo(String m) { if(!m.isEmpty() ) { modelo = m; } else { System.out.println(“valor inválido, não foi atribuído”); } } public String getCor() { return cor; } public void setCor(String c) { cor = c; } public String getPlaca() { return placa; } Exemplo 65 public void setPlaca(String p) { if(p.length()==7) { placa = p; } else { System.out.println(“valor inválido, não foi atribuído”); } } public int getHora() { return hora; } public void setHora(int h) { if (h >= 0 && h <=24){ hora = h; } else { System.out.println(“valor inválido, não foi atribuído”); } } public int getMinuto() { return minuto; } public void setMinuto(int m) { minuto = m; } public int getDia() { return dia; } public void setDia(int d) { dia = d; } public int getMes() { return mes; } public void setMes(int m) { mes = m; } public int getAno() { return ano; } 66 public void setAno(int a) { ano = a; } // demais métodos public void entradaDados ( ){ Scanner sc = new Scanner(System.in); System.out.println(“Digite o Modelo :”); setModelo(sc.nextLine()); System.out.println(“Digite a Cor :”); setCor(sc.nextLine()); System.out.println(“Digite a Placa :”); setPlaca(sc.nextLine());System.out.println(“Digite a Hora :”); setHora(Integer.parseInt(sc.nextLine())); System.out.println(“Digite o Minuto :”); setMinuto(Integer.parseInt(sc.nextLine())); System.out.println(“Digite o Dia :”); setDia(Integer.parseInt(sc.nextLine())); System.out.println(“Digite o Mês :”); setMes(Integer.parseInt(sc.nextLine())); System.out.println(“Digite o Ano :”); setAno(Integer.parseInt(sc.nextLine())); } public void imprimir ( ){ System.out.println(“Modelo : “ + getModelo()); System.out.println(“Cor : “ + getCor()); System.out.println(“Placa : “ + getPlaca()); System.out.println(“Hora : “ + getHora()); System.out.println(“Minuto : “ + getMinuto()); System.out.println(“Dia : “ + getDia()); System.out.println(“Mês : “ + getMes()); System.out.println(“Ano : “ + getAno()); } } Notas: 1. A classe Automovel ganhou novos métodos, mas as aplicações usadas como exemplos em nosso estudo continuam compatíveis com a classe, apesar de sua evolução. 67 2. Não existe ordem para os métodos e atributos de uma classe; apenas por convenção, devemos definir os atributos no início, para facilitar a identificação. 3. Apenas por uma questão de organização, os métodos de acesso foram colocados no início, mas alguns desenvolvedores ainda os separam em um grupo para os setters e outro para os getters. 4. Os métodos entradaDados e imprimir foram alterados e passaram a utilizar os métodos de acesso, e não mais o acesso direto aos atributos da classe. Você ainda poderá melhorar os métodos setters que estão sem os testes de verificação de dados para entender melhor como realizar essa tarefa. 68 Polimorfismo de sobrecarga de operadores e de métodos Polimorfismo O polimorfismo vem do grego e quer dizer “muitas formas”. Na programação orientada a objetos, o polimorfismo permite que tenhamos diferentes formas de realizar uma tarefa. Isso é importante quando precisamos que uma classe atenda a diferentes aplicações, mas que em algum momento realizam a mesma operação de formas diferentes. Conforme definido por Deitel: […] com o polimorfismo, podemos projetar e implementar sistemas que são facilmente extensíveis — novas classes podem ser adicionadas com pouca ou nenhuma modificação a partes gerais do programa, contanto que as novas classes façam parte da hierarquia de herança que o programa processa genericamente. (DEITEL, 2017, p. 312) • Polimorfismo de sobrecarga de operadores A sobrecarga de operadores é um conceito que ocorre quando utilizamos um mesmo operador para realizar diferentes tarefas em uma mesma linguagem. A análise sintática realizada pela linguagem é que irá definir qual ação deverá ser executada em cada momento, para um mesmo operador. 69 Podemos analisar o operador + (soma), que será analisado sintaticamente de acordo com o contexto em que o operador está empregado. Vamos analisar a situação a seguir: public static void main(String[] args) { // TODO code application logic here int x=12; System.out.println(“Resultado: “ + (5.0 + (3 + 6) + ++ x)); } “Resultado: “ + (5.0 + (3 + 6) + ++ x) Ações: • Uso do operador +: realizará uma operação de concatenação entre o texto a ser exibido (“Resultado:”) e o valor resultante da expressão aritmética: (7.0 + (2 + 5) + ++x). • Uso do operador +: realizará uma operação de soma inteira, uma vez que os operandos são valores inteiros: (3 + 6) 9 // “Resultado: “ + (5.0 + (9) + ++ x). • Uso do operador +: realizará uma operação de soma real, uma vez que um dos operandos tem valor real: 5.0 + (9) 14.0 // “Resultado: “ + (14.0 + ++ x). • Uso do operador ++: realizará a operação de pré-incremento sobre a variável x: ++x x = 13 // “Resultado: “ + (14.0 + 13). • Uso do operador +: realizará uma operação de soma real, uma vez que um dos operandos tem valor real: 14.0 + (13) 27.0 // “Resultado: “ + (27.0). Após a execução, será exibido: Resultado: 27.0 Exemplo 70 Podemos observar que o mesmo operador foi usado de muitas formas diferentes, sendo a linguagem responsável por realizar a análise sintática e identificar a ação correta a ser realizada entre as diferentes formas possíveis. Importante Polimorfismo de sobrecarga de métodos A sobrecarga de métodos é obtida ao se criar mais de um método com o mesmo nome em uma mesma classe; para isso, é importante que esses métodos possuam diferentes assinaturas de métodos. As assinaturas dos métodos estão ligadas aos parâmetros re- cebidos pelos métodos; assim, dois ou mais métodos podem ser sobrecarregados em uma mesma classe, desde que não possuam a mesma assinatura. A assinatura do método leva em conta apenas os tipos de dados e sua ordem, não levan- do em consideração os identificadores dos parâmetros. O método definido como int meuMetodo( int a, double b, String c ) possui como assi- natura: int meuMetodo( int, double, String ). Repare que apenas os tipos e a ordem dos tipos na área de parâmetros são levados em consideração. Dessa forma, os métodos a seguir não atendem ao critério de sobrecarga, porque pos- suem a mesma assinatura: public void setX(String a ) { x = a; } Assinatura: setX( String ) public void setX(String b ) { x = b; } Assinatura: setX( String ) 71 Como os métodos possuem o mesmo nome e a mesma assinatura, eles não podem ficar na mesma classe. Importante Exemplos de polimorfismo de sobrecarga de métodos Você pode sobrecarregar o método setModelo, por exemplo: O método setModelo recebe um parâmetro com o modelo do automóvel e o armazena no atributo: public void setModelo( String m ) { modelo = m; } O método setNome não recebe parâmetros e serve para limpar (eliminar) o valor armaze- nado no atributo modelo: public void setModelo( ) { modelo = “”; } As assinaturas dos dois métodos são diferentes e, por isso, podem existir na mesma classe. • void setNome( String ) • void setNome ( ) 72 A linguagem Java resolve esse problema durante a execução da aplicação. O método correto será executado em função de uma avaliação que será realizada na sintaxe da chamada do método. Vamos analisar o seguinte exemplo: Nota: Dessa forma, não importa quantos métodos com o mesmo nome existam em uma mesma classe. Quando isso ocorre, a chamada ao método que está sendo realizada irá avaliar e transferir a execução para o método sobrecarregado que possuir a mesma assinatura da chamada. public class AppAutomovel { public static void main(String[] args) { // TODO Auto-generated method stub // criação dos 5 objetos Automovel auto1 = new Automovel(); auto1.setModelo(“Uno”); auto1.setModelo(); } } No primeiro caso, a chamada ao método será avaliada de acordo com a sua assinatura, uma vez que existe mais de um método com o mesmo nome. Como temos um método que possui uma assinatura recebendo um String, essa chamada executará o método: auto1.setModelo(“Uno”); No segundo caso, a chamada ao mé- todo não possui parâmetros, e isso fará com que o método sem parâme- tros seja executado: auto1.setModelo(); 73 Exemplos de polimorfismo de sobrecarga de métodos com a mesma quantidade de parâmetros, mas com tipos diferentes: Exemplo public double calcQuadrado(double n) { return n * n; } Assinatura: calcQuadrado( double ) public double calcQuadrado(int n) { return (double) n * n; } Assinatura: calcQuadrado( int ) Métodos de mesmo nome em uma mesma classe (sobrecarga) podem receber diferen- tes mensagens (assinaturas) e responder à chamada de diferentes formas. Os exemplos a seguir podem pertencer à mesma classe, uma vez que, apesar de todos terem a mesma quantidade de parâmetros, as suas assinaturas são diferentes: Exemplo Métodos sobrecarregados: int meuMetodo(int a, double b, String c) { } int meuMetodo(double b, String c, int a) { } int meuMetodo(String c, int a, double b) { } int meuMetodo(String c, double b, int a) { } Chamada na aplicação: obj.meuMetodo(10, 2.5, “texto”); obj.meuMetodo(2.5, “texto”,10); obj.meuMetodo(“texto”, 10, 2.5); obj.meuMetodo(“texto”, 2.5, 10); 74 O uso do polimorfismo de sobrecarga de métodos está associado à evolução das clas- ses. Imagine que você tem uma classe de acesso aos sistemas, com identificação do usuário, e esse método possui a seguinte assinatura: public void nivelAcesso ( String nome, String senha ){ } Vários sistemas já em funcionamento usam esse método para realizar o login dos usuá- rios, mas um novo cliente precisa que, além do nome de login e da senha, seja verificado um código gerado por um token. Você não precisa criar uma nova classe, basta evoluir essa classe implementando uma nova forma de acesso: public void nivelAcesso ( String nome, String senha, int token ){ } A classe agora pode atender o seu novo cliente e ainda se mantém compatível com as aplicações dos antigos clientes. Importante MIDIATECA Acesse a midiateca da Unidade 2 e veja a aplicação do conceito de polimorfismo, por meio de um estudo de caso, indicado como material complementar. 75 Métodos construtores e sobrecarga de mé- todos construtores Métodos construtores São usados para controlar a criação (instanciação) do objeto e só executam nesse momento. Após a criação do objeto, esses métodos não podem mais ser usados. São responsáveis pelo controle durante a construção do objeto na memória. Podem ser usados para definir valores para os atributos e/ou tarefas que devam ser realizados para que o objeto seja criado com algumas características. São sempre públicos (public). Não podem retornar valores, por isso são sem tipo. Devem obrigatoriamente possuir o mesmo nome da classe e podem receber valores como parâmetros para a realização de atribuição(ões) inicial(is) das propriedades do objeto. Executam apenas durante o processo de criação do objeto (ins- tanciação da classe), não podendo ser executados novamente para o objeto já criado. 76 Exemplo: public Automovel(String mo, String co, String pl, int ho, int mi, int di, int me, int an) { setModelo(mo); setCor(co); setPlaca(pl); setHora(ho); setMinuto(mi); setDia(di); setMes(me); setAno(an); } Uso: Automovel a1 = new Automovel( “Uno”, “Verde”, “RIO1A00”, 10, 23, 23, 06, 2019 ); Exemplo O uso desse método permite que possamos criar um objeto automóvel já com todos os valores atribuídos; isso é importante quando estamos trabalhando com bases de dados. Como o objeto a1 já recebeu os valores para serem atribuídos às suas propriedades, o objeto não precisará da entrada de dados ou outra forma de atribuição. Por outro lado, as aplicações anteriores não irão mais funcionar com a classe Automovel. Isso ocorre porque a forma antiga de instanciação deixou de ser válida. Automovel a1 = new Automovel( ); Quando em Java criamos uma classe sem a definição de um método construtor, o processo de compilação disponibiliza um método construtor vazio: Automovel a1 = new Automovel( ); Porém, quando criamos algum método construtor, isso não acontece. Passa a ser uma questão de segurança: como o método construtor controla a criação do objeto, só podem ser criados objetos utilizando construtores existentes na classe. 77 Essa é uma medida de segurança, uma vez que não será permitido que sejam criados objetos de qualquer forma, apenas obedecendo aos construtores disponíveis. Importante Para assegurarmos que a classe Automovel se manterá compatível com as aplicações anteriores, devemos recorrer ao polimorfismo de sobrecarga de métodos em nossos métodos construtores. Sobrecarga de métodos construtores Métodos construtores podem ser sobrecarregados e seguem a mesma regra da sobrecarga de métodos: os parâmetros são verificados não de acordo com o identificador, mas sim pela sequência dos tipos (assinatura). Para mantermos a compatibilidade de nosso Automovel com a inclusão do método construtor que recebe todos os valores para atribuição nas propriedades do objeto, devemos criar também um construtor vazio sobrecarregando os métodos construtores: public Automovel() { } public Automovel(String mo, String co, String pl, int ho, public int mi, int di, int me, int an) { setModelo(mo); setCor(co); setPlaca(pl); setHora(ho); setMinuto(mi); setDia(di); setMes(me); setAno(an); } 78 A instanciação ou criação de um objeto segue a seguinte sintaxe: Podemos, então, evoluir a classe Automovel incluindo alguns métodos construtores, mas lembre-se de que não poderá haver métodos com o mesmo nome, construtores ou não, e com a mesma assinatura. Incluir na classe Automovel: // métodos construtores public Automovel() { } // construtor vazio para a classe public Automovel( String pl) { // só a placa setPlaca(pl); } public Automovel( String pl, int ho, int mi) { // poucos atributos setPlaca(pl); setHora(ho); setMinuto(mi); } public Automovel(String pl, int ho, int mi, int di, int me, int an) {// alguns atributos setPlaca(pl); setHora(ho); setMinuto(mi); setDia(di); setMes(me); setAno(an); } public Automovel(String mo, String co, String pl, int ho, int mi, int di, int me, int an) { // todos os atributos setModelo(mo); setCor(co); setPlaca(pl); setHora(ho); setMinuto(mi); Classe objeto = new Construtor(); Automovel auto2 = new Automovel(); Lembre-se de que o método construtor possui o mesmo nome da classe. 79 setDia(di); setMes(me); setAno(an); } Lembre-se de alterar a aplicação AppAutomovel e criar alguns objetos utilizando os novos construtores disponibilizados. Dizemos que os objetos estão sendo criados com diferentes métodos construtores. Importante MIDIATECA Acesse a midiateca da Unidade 2 e veja o conteúdo sobre construtores indicado como material complementar. 80 NA PRÁTICA A programação orientada a objetos procura trazer para o ambiente computa- cional objetos existentes no mundo real. Ao analisar os conceitos aqui com- preendidos, observamos que qualquer objeto do mundo real pode ter a sua representação computacional, mas devemos ficar atentos às características importantes para o contexto do sistema. Vamos analisar um objeto a nossa volta e pensar em quais seriam as características importantes dele para um sistema computacional. Vamos, então, analisar o mouse. Suas características para um determinado sistema poderiam ser: marca (texto), modelo (texto), cor (texto), peso (real), número de botões (inteiro) e tipo de conexão (texto), poden- do ser bluetooth, wireless ou fio. Agora é sua vez de analisar outros objetos e determinar as suas características para um sistema computacional. 81 Resumo da Unidade 2 Nesta unidade, você conheceu os conceitos de classe e objeto e aprendeu a diferenciá- los. Você também aprendeu que uma classe é composta de membros e que os membros de uma classe são os atributos e os métodos. Além disso, também aprendeu as características de cada um dos membros de uma classe. Abordamos o conceito de polimorfismo e como ele pode ser aplicado a operadores e métodos na programação orientada a objetos. Por final, conhecemos os métodos construtores e suas características, além de compreendermos que, por se tratar de métodos, eles também podem ser sobrecarregados. CONCEITO Nesta unidade, conhecemos os conceitos de classes e objetos e suas carac- terísticas. Vimos que uma classe é composta somente de atributos e méto- dos, que são responsáveis, respectivamente, pela descrição do objeto e pelas ações (tarefas) que o objeto pode executar. Conhecemos também o conceito de polimorfismo aplicado à sobrecarga de operadores e à sobrecarga de mé- todos. Entendemos como ocorre a sobrecarga de operadores e aprendemos a utilizar na prática a sobrecarga de métodos. Ainda exploramos o conceito de métodos construtores, suas características e como utilizá-los na prática. 82 Referências DEITEL, P. Java: como programar. 10. ed. São Paulo: Pearson Education do Brasil, 2017. p. 312. Biblioteca Virtual. MANZANO, J. A. N. G.; COSTA JUNIOR, R. A. Java 7: programação de computadores:
Compartilhar