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 NULL prof1 prof1 Professor prof1; prof1 = new Professor(); prof1 = null; // coletor de lixo NULL prof1 prof1:Professor nome=null matricula=0 cargaHoraria=0 salarioHora=0.0 prof1 nome=null matricula=0 cargaHoraria=0 salarioHora=0.0 Para “matar” um objeto em Java se utiliza null – Exemplo: prof1:Professor 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 prof1 nome="Júlio" matricula=123 cargaHoraria=14 salarioHora=21.5 prof2:Professor 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 prof1 prof3 nome="Júlio" matricula=123 cargaHoraria=14 salarioHora=21.5 prof2:Professor 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 prof3 prof1:Professor 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); Circulo } -centrox:int public int diametro(){ -centroy:int -raio:int return (2 * raio); +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; Circulo if (r > 0) raio = r; -centrox:int else raio = 1; -centroy:int } -raio:int ... +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 Circulo -centrox:int -centroy:int -raio:int +Circulo(x:int, y:int, r:int) +area():double +circunferencia():double +diametro():int Circulo circ = new Circulo(); Inválido 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