Algoritmos e Programação 2 Baseado no material do Prof. Júlio Machado Objetos e Classes em Java Revisão Classes: encapsulam dados (atributos) e operações sobre os dados (métodos) Objetos: instâncias de classes, têm estado (definido pelos atributos) e comportamento (definido pelos métodos) Classes Definições de classes incluem (geralmente): modificador de acesso palavra-chave class nome da classe atributos de instância métodos de instância 1
Modificadores de acesso Permitem definir o encapsulamento de atributos e métodos Dois modificadores principais: private: visível apenas na classe atual public: visível para qualquer classe externa Recomendações A menos que hajam razões fortes, os atributos de uma classe devem ser definidos como private (encapsulamento) e os métodos que são chamados de fora da classe devem ser public (interface de acesso). Métodos que devem ser usados somente dentro da própria classe, devem ser especificados como private. Encapsulamento Objetivo: Esconder como as coisas funcionam por trás de uma interface de acesso. Implementado através dos modificadores de acesso. 2
Métodos get Retornam o valor dos atributos de um objeto, uma vez que não é possível acessálos diretamente. Métodos set Permitem alterar o valor de um atributo. Estes métodos são chamados por alguns autores de transformadores. Exemplo: classe Professor public class Professor { private String nome; private int matricula; private int cargahoraria; private double salariohora;... Atributos estão encapsulados!!! Apenas métodos da própria classe Professor podem acessar os atributos. Métodos:... public void setnome(string n) { nome = n; public String getnome() { return nome; public void setmatricula(int m) { matricula = n; public int getmatricula() { return matricula;... 3
... public void setcargahoraria(int c) { cargahoraria = c; public int getcargahoraria() { return cargahoraria; public void setsalariohora(double s) { salariohora = s; public double getsalariohora() { return salariohora; public double getsalario() { return salariohora * cargahoraria; Notação Gráfica Para melhor visualizar e entender as classes. Representação das classes Relacionamento entre as classes Exemplos: Booch, OMT, UML (Unified Modeling Language) Padrão Atual (mais moderna, mais usada) Notação UML Classe: retângulo dividido em três partes primeira parte: nome da classe segunda parte: atributos terceira parte: métodos Atributos e métodos private: - public: + Professor - nome: String - matricula: int - cargahoraria: int - salariohora: double + setnome (n: String) + getnome ( ): String + setmatricula (m: int) + getmatricula( ): int + setcargahoraria (c: int) + getcargahoraria( ): int + setsalariohora(s: double) + getsalariohora( ): double + getsalario( ): double 4
Instanciação Um objeto depois de criado, conterá todos os atributos e métodos descritos em sua classe. Para instanciar um objeto em Java utilizamos o operador new. Ex.: Professor prof1; prof1 = new Professor(); prof1:professor prof1 NULL prof1 nome=null matricula=0 cargahoraria=0 salariohora=0.0 Para matar um objeto em Java se utiliza null Exemplo: Professor prof1; prof1 = new Professor(); prof1 = null; // coletor de lixo prof1 NULL prof1:professor prof1 nome=null matricula=0 cargahoraria=0 salariohora=0.0 prof1 NULL Quando o operador new é usado é alocada memória. Quando um objeto não é mais necessário, devolve-se o(s) recurso(s) para o sistema. Java realiza a coleta de lixo automática da memória (garbage collector). Quando um objeto não é mais utilizado, ele é marcado para coleta de lixo. 5
Como executar um programa em Java? Um programa é composto de várias classes e objetos. Como indicar por onde o programa começa? Em Java temos um método especial que o interpretador assume como o início do programa: main. public static void main (String args[ ]) public static void main (String args[]){ Professor prof1; prof1 = new Professor(); prof1.setnome( Júlio ); prof1.setmatricula(1234); prof1.setcargahoraria(14); System.out.println(prof1.getCa rgahoraria()); Escopo de Variáveis O escopo de uma variável informa onde ela pode ser utilizada. Ex.: 1: public class VerificaEscopo{ 2: private int escopoa; 3: public void metodo(int escopob){ 4: int escopoc; 5: 6: 6
escopoa é atributo da classe e seu escopo vale em qualquer lugar a partir da linha 1 escopob e escopoc são variáveis locais cujo escopo é válido somente dentro do método Inicialização de Variáveis Atributos de uma classe são inicializados com valores padrão: 0 -> byte, short, int, long 0.0 -> float, double false -> boolean \u0000 -> char null -> Object Variáveis locais declaradas dentro de métodos devem obrigatoriamente serem inicializadas. O compilador Java irá indicar se não inicializarmos as variáveis. Ex.: class Aluguel { private int numero; public void adicitem(){ float itemcusto; int numdias; System.out.println("Numero="+numero); //OK System.out.println("ItemCusto="+itemCusto); //Erro 7
Referências Quando criamos um objeto em Java, mantemos uma referência para o objeto na memória. Ex.: Professor prof1, prof2; prof1 = new Professor();... prof2 = new Professor();... prof1:professor prof2:professor prof1 nome="júlio" matricula=123 cargahoraria=14 salariohora=21.5 prof2 nome="isabel" matricula=321 cargahoraria=40 salariohora=21.5 Ao atribuir prof1 ou prof2 a uma terceira variável, o que irá acontecer? Ex.: Professor prof1, prof2, prof3; prof1 = new Professor();... prof2 = new Professor();... prof3 = prof1; prof1:professor prof2:professor prof1 prof3 nome="júlio" matricula=123 cargahoraria=14 salariohora=21.5 prof2 nome="isabel" matricula=321 cargahoraria=40 salariohora=21.5 Se alteramos algum atributo do objeto referenciado por prof3, estaremos alterando também o referenciado por prof1! Ex.: Professor prof1, prof2, prof3; prof1 = new Professor();... prof2 = new Professor();... prof3 = prof1; prof3.setcargahoraria(12); prof1:professor prof1 prof3 nome="júlio" matricula=123 cargahoraria=12 salariohora=21.5 8
Exercícios 1) Escreva um método para a classe Professor que imprima todos os dados de um determinado professor. Nome: Maria Matrícula: 234 Carga Horária: 8 Salário/Hora: 20.00 Salário: 160.00 2) Escreva uma classe Contador, que apresente métodos para informar o valor inicial, incrementar, decrementar e exibir o valor atual na tela. 3) Exemplifique a utilização desta classe criando uma aplicação que crie vários contadores e use os métodos definidos. Por exemplo, crie 3 contadores e chame alguns métodos para incrementar/decrementar o contador. No final, exiba o valor de cada contador. Inicialização de Objetos Objetos: Estado: definido pelos atributos declarados na classe Comportamento: definido pelos métodos declarados na classe Quais valores os atributos do objeto possuem após a sua instanciação? Como definir o estado inicial do objeto? 9
Exemplo: classe Circulo public class Circulo { private int centrox; private int centroy; private int raio; public double area(){ return (3.14 * raio * raio); public double circunferencia(){ return (2 * 3.14 * raio); public int diametro(){ return (2 * raio); Circulo -centrox:int -centroy:int -raio:int +area():double +circunferencia():double +diametro():int Circulo circ = new Circulo(); circ:circulo circ:circulo centrox=??? centroy=??? raio=??? centrox=0 centroy=0 raio=0 Inicialização padrão de atributos: byte, short, int, long: 0 float, double: 0.0 char: \u0000 boolean: false Object: null Da forma como foi apresentada a classe Circulo, todos os objetos criados a partir dela terão seus atributos inicializados com valores padrão iguais a zero. Como permitir que instâncias da classe Circulo possuam estados diferentes? 10
Construtores O construtor é um código especial responsável pela inicialização dos atributos de instância de um objeto de uma determinada classe. Um construtor em Java: Possui o mesmo nome da classe (respeitando maiúsculas e minúsculas); Pode possuir ou não parâmetros; Não possui um tipo de retorno, nem mesmo void. <modificador_de_acesso> <nome_classe>(<parâmetros>) { //corpo do construtor Exemplo: classe Circulo public class Circulo { private int centrox; private int centroy; private int raio; public Circulo(int x, int y, int r){ if (x >= 0) centrox = x; else centrox = 0; if (y >= 0) centroy = y; else centroy = 0; if (r > 0) raio = r; else raio = 1;... -centrox:int -centroy:int -raio:int Circulo +Circulo(x:int, y:int, r:int) +area():double +circunferencia():double +diametro():int 11
Circulo circ = new Circulo(5,1,1); circ:circulo circ:circulo centrox=??? centroy=??? raio=??? centrox=5 centroy=1 raio=1 Quando um objeto é instanciado: Operador new aloca a memória necessária; Construtor é invocado automaticamente para inicializar os atributos do objeto. Construtor Default Se nenhum construtor é definido para uma determinada classe, Java irá definir um construtor padrão (chamado construtor default) Não possui argumentos de entrada e não faz nada. Foi o construtor utilizado até agora! Caso qualquer construtor seja definido na classe, Java não irá disponibilizar o construtor default. Exemplo: classe Circulo -centrox:int -centroy:int -raio:int Circulo +Circulo(x:int, y:int, r:int) +area():double +circunferencia():double +diametro():int Inválido Circulo circ = new Circulo(); Circulo circ = new Circulo(1,1,1); Válido 12
Exercícios 1) Adicione os seguintes comportamentos à classe Circulo: - mover um circulo para qualquer posição; - aumentar o tamanho de um círculo em uma unidade; - diminuir o tamanho de um círculo em uma unidade; - informar uma representação textual do círculo, contendo seu ponto central e raio; 2) Defina novos construtores para a classe Circulo com as seguintes características: - receba como parâmetros o ponto X e Y para o centro; para o raio utilizar o valor padrão 1 - receba como parâmetro o raio; para o ponto X e Y utilizar o valor padrão 0 - receba como parâmetro um outro círculo, gerando uma cópia do mesmo 3) Reimplemente a classe Professor desenvolvida anteriormente para incluir a inicialização de objetos via construtores. 13
4) Suponha que uma casa é formada por 3 peças: uma cozinha circular, uma sala retangular e um banheiro quadrado. Vamos implementar um programa que permita definir as dimensões das peças da casa e calcular sua área. Para tanto implemente as seguintes classes: - classe Cozinha: um método que calcula a área da cozinha, e os atributos e demais métodos necessários para isto; - classe Sala: um método para cálculo da área, e os atributos e demais métodos necessários para tanto; - classe Banheiro: idem. - classe Casa: que tenha 3 atributos (para as três peças da casa), um método para calcular a área da casa, e os atributos e demais métodos necessários. - uma aplicação (uma classe com o método main() ) que instancie 3 casas, calcule e exiba suas áreas. 14