Baixe o app para aproveitar ainda mais
Prévia do material em texto
POOS3 – Programação Orientada a Objetos edilson.ifsp@gmail.com Aula 1 – Classes, Objetos, Métodos e Encapsulamento 1. Programação Orientada a Objetos A programação orientada a objetos é o paradigma de programação em evidência na atualidade. Ele vem substituir o paradigma estruturado, que é baseado em técnicas de programação procedurais, utilizadas em linguagens como C ou Pascal. Um programa orientado a objetos é constituído de objetos. Cada objeto possui uma funcionalidade específica, visível ao usuário e cuja implementação fica escondida. Objetos são mais apropriados para solucionar grandes problemas. Eles facilitam a busca por bugs e a manutenção do código. 2. Definindo Classe e Objeto Classe: É um blueprint dos objetos que define como eles devem funcionar. A classe representa um conjunto de objetos com características iguais/similares. Ela define o comportamento de um objeto, através de métodos, e quais estados ele é capaz de manter, através de atributos. Exemplos de Classes: Pessoa, Carro, Casa, Aluno, Conta Corrente, Filme, Jogo, etc. Veja o código abaixo: class Pessoa { String nome; int idade; } A classe Pessoa foi definida. Note que ela não é um objeto, mas é utilizada para construir um objeto. Neste momento a classe contém dois atributos: nome e idade. Você poderia perguntar: Mas de qual pessoa estamos falando? E a resposta seria: Nenhuma. Temos somente a definição de uma classe genérica. É preciso criar objetos para que possamos especificar uma determinada pessoa. Objeto: É uma instância de uma classe. Um objeto é capaz de armazenar estados através de seus atributos e reagir a mensagens enviadas a ele, assim como se relacionar e enviar mensagens a outros objetos. Exemplo de objetos da classe Pessoa: João, José, Maria. Como criar um objeto do tipo Pessoa? Veja o código abaixo: Pessoa p = new Pessoa(); Agora temos um objeto “p”, do tipo Pessoa. Dessa maneira, o objeto “p” possui os atributos nome e idade. O operador “.” dá acesso aos atributos. p.nome = "José"; p.idade = 25; Surge então outra questão. Como definir o comportamento de uma pessoa? Isso é feito utilizando-se os métodos. 3. Definindo Métodos Um método é muito parecido com uma função. Ele possui um nome e um corpo. - O nome deve ser um identificador que reflita o propósito principal do método (ex: efetuarCalculoImposto). - O corpo do método possui as declarações que serão executadas quando o método for invocado/chamado. É possível passar alguma informação para processamento e receber o resultado de tal operação. 3.1. Sintaxe: tipoRetorno nomeMetodo (listaParametros) { // corpo do método } tipoRetorno: especifica o tipo de informação que o método retorna. Pode ser int, float, String, etc. Se você estiver escrevendo um método que não retorna um valor, utilize void como tipo de retorno. nomeMetodo: o nome utilizado para invocar o método. O nome de um método segue as mesmas regras utilizadas para a criação de variáveis. listaParametros: é opcional e descreve os tipos e nomes das informações que você quer enviar para processamento. Você escreve os parâmetros entre os parênteses da mesma forma como declara as variáveis. Caso seu método tenha dois ou mais parâmetros, separe-os utilizando vírgula. Exemplo 1: Criando métodos para a classe Pessoa class Pessoa { String nome; int idade; void conversar(){ System.out.println("Blá Blá Blá"); } void comprar(){ System.out.println("Hora de Gastar $$$$"); } int falarIdade(){ return idade; } } Como Testar? public class Main { public static void main(String[] args) { Pessoa p = new Pessoa(); p.nome = "José"; p.idade = 25; p.conversar(); p.comprar(); System.out.println("Idade da Pessoa:" + p.falarIdade()); } } Exemplo 2: int somaValores(int valor1, int valor2){ // corpo do método } somaValores; // erro em tempo de compilação. somaValores (); // erro em tempo de compilação. somaValores (37); // erro em tempo de compilação. somaValores ("37", "5"); // erro em tempo de compilação. 3.2. Escrevendo declarações de retorno do método Para retornar um valor do método, escreva a declaração return dentro do método, seguida pela expressão a qual você quer retornar, seguida de “;”. int somaValores(int valor1, int valor2) { // corpo do método return valor1 + valor2; } 3.3. Definindo Escopo Local public class Exemplo { void primeiroMetodo() { int campo; // ok } void segundoMetodo() { campo = 42; // errado } } 3.4. Definindo Escopo de Classe class Exemplo { public int campo = 0; public void primeiroMetodo() { campo = 42; // ok } public void segundoMetodo() { campo++; // ok } } 3.5. Efetuando a Chamada de um método nomeObjeto.metodo(); class Main { public static void main(String[] args) { Funcionario f = new Funcionario(); f.nome = "Edilson"; f.salarioBruto = 1000; System.out.println(f.calcularSalarioLiquido()); } } class Funcionario { String nome; double salarioBruto; public double calcularSalarioLiquido() { return salarioBruto * 0.9; } } 4. Encapsulamento O encapsulamento ocorre quando alguns atributos são mantidos como privados e métodos públicos para permitir o acesso a eles são fornecidos. Isso significa manter algumas das informações da classe como privadas, e fornecer métodos públicos para acessar essas informações. Quando todos os métodos e campos são mantidos como públicos, qualquer outra classe pode acessá-los. Tudo que essa classe faz torna-se um “livro aberto” para qualquer outra classe. O encapsulamento permite que você controle aquilo que você quer compartilhar e aquilo que você quer manter privado, dentro de sua classe. Exemplo: Classe Pessoa com dois atributos: nome e idade public class Pessoa { private String nome; private int idade; public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public int getIdade() { return idade; } public void setIdade(int idade) { this.idade = idade; } } No exemplo acima, a variável nome foi declarada utilizando-se o modificador de acesso private. Isso faz com que essa variável possa ser acessada somente dentro da classe Pessoa. Para permitir a leitura dos valores da variável, foi definido um método “get” (também conhecido como método acessor) chamado de getNome(). Observe que o método getNome() é público. Para permitir a modificação das informações, foi especificado um método “set” (também chamado de mutatório) chamado de setNome(). Esse método pode fornecer capacidades de validação das informações, assegurando que o valor da variável nome seja alterado adequadamente. A variável idade também foi declarada como private e possui dois métodos públicos: getIdade() e setIdade(). 4.1. Dicas - Para criar os métodos públicos get e set, utilize os prefixos get ou set seguidos do nome da variável declarada como private. Exemplo. A variável salario teria como métodos públicos getSalario e setSalario. Note que a primeiraletra do nome da variável fica em maiúsculo. - A especificação dos métodos set e get não é obrigatória. Eles devem ser fornecidos somente quando isso fizer sentido. Exemplo: Se você tem uma variável cujo valor nunca será alterado fora classe, somente consultado, não faz sentido especificar um método set. Como testar? public class Main { public static void main(String[] args) { Pessoa p = new Pessoa(); p.setNome("Edilson"); p.setIdade(35); System.out.println("Nome: " + p.getNome()); System.out.println("Idade: " + p.getIdade()); } } 5. Entendendo Métodos Estáticos Quando você invoca um método como Math.sqrt, por que ele funciona? Parece estranho. O método está sendo invocado diretamente da classe e não de um objeto do tipo Math. Como isso funciona? O método sqrt é somente um exemplo dos vários métodos que são independentes de qualquer instância específica de uma Classe. Se sqrt fosse uma instância da classe Math, seria possível utilizá- lo somente da seguinte forma: Math m = new Math(); double d = m.sqrt(42.24); Em Java todos os métodos devem ser declarados dentro de uma classe. Entretanto, se você declarar um método ou uma variável como static, você pode acessá-lo utilizando o nome da classe. Nenhuma instância é requerida. Veja como o método Sqrt é declarado na classe Math: class Math { public static double Sqrt(double d) { ... } ... } Tenha em mente que um método estático não é chamado em um objeto. Quando você define um método estático, ele não tem acesso a variáveis de instância declaradas na classe, somente a variáveis estáticas. Além disso, ele somente poderá invocar de forma direta outros métodos que também são estáticos. Métodos NÃO estáticos requerem a criação de um objeto. 6. Entendendo as palavras chave class, public, static e main A palavra chave class é utilizada para declarar que uma nova classe está sendo definida. A definição da classe começa com “{” e termina com “}”. Todos os elementos que estiverem dentro das chaves são membros da classe. A linha static void main() inicia o método main(). É nessa linha que o programa iniciará sua execução (todas as aplicações em Java iniciam sua execução a partir de main()). A palavra chave static permite que main() seja utilizado sem que um objeto do tipo da sua classe seja criado. Isso é necessário porque main() é chamado quando o programa começa a ser executado. 7. Casting A conversão entre tipos de dados pode ser feita explicitamente utilizando-se um “cast”. Entretanto, em alguns casos, conversões implícitas são permitidas: Exemplo: int i = 10; float f = 0; f = i; // Conversão Implícita. Nenhuma informação será perdida. f = 0.5F; i = (int)f; // Conversão Explícita. Informações serão perdidas. Um cast explícito invoca o operador de conversão de um tipo para o outro. Caso o operador de conversão definido não exista, o cast irá falhar. Exemplo: Convertendo um double para um int. Sem o cast, o programa não irá compilar. class Main { public static void main(String[] args) { double x = 1234.7; int a; a = (int)x; // cast de “double” para “int” System.out.println(a); } } Saída: 1234 8. Números Aleatórios O método random() da classe Math gera um valor double entre 0.0 e um valor próximo a 1.0. Entretanto, esse valor produzido pode diferir do que é necessário para uma aplicação específica. Por exemplo, um programa que simule o lançamento de uma moeda pode requerer somente “0” para cara ou “1” para coroa. Um programa que simule a rolagem de um dado de seis lados requer inteiros aleatórios no intervalo de 1 a 6. Uma solução é utilizar o operador * em conjunto com random. (int) (Math.random() * 6) O código acima produz inteiros entre 0 e 5. Isso é chamado de escalonamento. Como o objetivo é gerar números entre 1 e 6, o valor 1 é adicionado ao resultado anterior. 1 + (int) (Math.random() * 6); Exemplo: O código abaixo gera um número, aleatoriamente, maior ou igual a 1 e menor ou igual a 6. int nro; nro = 1 + (int) (Math.random() * 6); System.out.println("Número Sorteado: " + nro); 9. Exercícios Propostos 9.1. Crie uma classe chamada Calçado. A classe deve conter os atributos descricao, tipo, anoFabricacao e valor. Além disso, forneça métodos para informar/recuperar a descrição do calçado, o tipo, o ano no qual foi lançado e também seu preço. 9.2. Especifique uma classe que represente uma Casa. A classe deve permitir a verificação da quantidade de pessoas no interior da casa, se as luzes externas estão acesas ou não, a quantidade de água e energia elétrica consumidos, assim como a temperatura ambiente. 9.3. Crie uma classe chamada SmartPhone. Defina, no mínimo, quatro atributos e dois métodos. 9.4. Crie uma classe Contador. Ela deverá fornecer métodos para incrementar, decrementar e exibir o valor de um determinado número. 9.5. Crie uma classe Aluno especificando o nome, o sobrenome, prontuário, média geral das disciplinas. Inclua métodos para identificação do nome do aluno e também alteração/exibição das demais informações. 9.6. Crie uma classe Livro especificando o título, o autor, a editora e o número de páginas. Inclua métodos para retornar o título, a editora e para determinar se o livro está emprestado ou não. Dica: Como vou saber se o livro está emprestado? A utilização de um atributo resolveria esse problema? 9.7. Crie uma classe que represente uma Calculadora simples. Essa classe terá os métodos de adição, subtração, divisão e multiplicação. Os métodos devem receber dois parâmetros (Ex: valor1 e valor2) e retornar o resultado. 9.8. Elabore uma classe que auxilie no gerenciamento de aluguéis. Crie métodos para definir o valor do aluguel, calcular o desconto (caso exista) e calcular o valor do aluguel. 9.9. Escreva um programa (utilizando classes e métodos) para calcular o aumento salarial de um funcionário baseando-se na tabela abaixo. Além do salário, a classe deve conter o nome do funcionário e o ano de contratação. Salário Aumento (%) Acima de R$ 4.000,00 5% R$ 1.900,00 ----- R$ 4.000,00 10% Até R$ 1.900,00 20% 9.10. Escreva um programa que simule um jogo de azar. Após solicitar o nome de dois jogadores, o programa deve permitir que eles informem seus palpites (um número entre 1 e 6), gerar um número aleatório e verificar se algum dos jogadores acertou seu respectivo palpite. O número de rodadas é controlado pelos jogadores. Ao final do jogo, o número de acertos de cada jogador deverá ser informado. 9.11. Escreva um programa para gerenciar duas rotas de uma companhia aérea (São Paulo – Rio e São Paulo – Salvador). Para cada uma das rotas, devem ser armazenados a quantidade de assentos disponíveis e ocupados, a tarifa e o tipo de aeronave utilizada. Após a leitura das informações, o programa deve produzir um relatório contendo os seguintes itens: a) Tipo da Aeronave. b) Origem. c) Destino. d) Percentual de ocupação da aeronave. e) Valor da tarifa. f) Faturamento do vôo. 9.12. Escreva um programa que auxilie no controle da produção de cana de açúcar de uma usina. O programa deve armazenar a quantidade de cana de açúcar estimada para processamento (em toneladas), a quantidade que foi realmente processada na usina, o custo de produção e o preço de venda da tonelada. Após isso, um relatório deve ser elaborado, contendo as seguintes informações: a) Quantidade de toneladas processadas. b) Valor da tonelada. c) Lucro da usina. d) Capacidade de produção utilizada (processamento real dividido pelo processamento estimado). 9.13.Crie uma classe que permita a simulação de uma conta bancária. Ela deve conter o nome do cliente, o tipo da conta (1-Especial; 2-Comum) e o saldo. As seguintes funcionalidades devem ser fornecidas: a) saque; b) depósito; c)bônus; d) cálculo da tarifa. O bônus e a tarifa devem ser calculados de acordo com as tabelas abaixo: Detalhe: o bônus pode ser utilizado somente uma vez. Saldo Bônus Tipo Conta Tarifa Até 1000 5% 1 R$ 8 Acima de 1000 10% 2 R$ 14 9.14. Crie um programa que gerencie um estacionamento rotativo de carros. O programa deve armazenar a descrição do carro, a placa, o horário de entrada e o horário de saída (despreze os minutos). O estacionamento cobra X reais pela primeira hora de permanência com o automóvel e X/3 pelas demais horas. Além disso, é fornecido um desconto para o pagamento de acordo com a tabela abaixo: Valor Desconto (%) Até R$ 20 (inclusive) 5 Entre R$ 20 e R$ 50 (inclusive) 10 Acima de R$ 50 20 O programa deve exibir um relatório contendo as seguintes informações: a) Tipo do carro. b) Placa. c) Hora da Entrada. d) Hora da Saída. e) Valor Pago.
Compartilhar