Aula 13 Classes e Objectos Programação em Java 2006-2007 Introdução Java é uma linguagem de programação orientada a objectos (POO), mas aceita os outros paradigmas de programação de um nível de desenvolvimento inferior, tais como programação estruturada e programação imperativa nível Programação Orientada a Objectos Encapsula dados (atributos) e subprogramas (métodos) em componentes (classes) Programação Estruturada Programação Procedural paradigma de programação estilo de programação Programação em Java 2006-2007 Organiza código em subprogramas dando especial atenção às estruturas de dados. Também chamada imperativa. Organiza o código em funções (subprogramas) 2 Objectos e Classe objecto = atributos (dados) + métodos (subprogramas) objecto = instância de uma classe classe = molde (padrão) para criar objectos similares Classe - padrão Objecto - instância Classe: AlunoJava Objecto - instância Objecto: aluno1 atributos nº mec.: 23478 nome: João Pires nota aval.periódica: 16 nota exame final: 18 nº de faltas às TP: 1 nº de faltas às P: 0 métodos calcular a nota final reprovou por faltas? pode ir a exame final? atributos nº mecanográfico nome nota aval.periódica nota do exame final nº de faltas às TP nº de faltas às P métodos calcular a nota final reprovou por faltas? pode ir a exame final? Programação em Java 2006-2007 Objecto: aluno2 atributos nº mec.: 25506 nome: Luisa Santos nota aval.periódica: 15 nota exame final: 13 nº de faltas às TP: 0 nº de faltas às P: 0 métodos calcular a nota final reprovou por faltas? pode ir a exame final? 3 Objectos Os objectos são entidades criadas a partir de uma classe e possuem um estado (definido pelos seus atributos ) e um comportamento (definido pelos seus métodos) Objecto: aluno1 atributos Os objectos aluno1 e aluno2 foram Classe: AlunoJava nº mec.: 23478 nome: João Pires nota aval.periódica: 16 nota exame final: 18 nº de faltas às TP: 1 nº de faltas às P: 0 atributos métodos criados a partir do molde definido pela classe AlunoJava O número de objectos que pode ser criado a partir de uma classe não é limitado Convenção de nomes: métodos os nomes das classes começam com maiúsculas nº mecanográfico nome nota aval.periódica nota do exame final nº de faltas às TP nº de faltas às P calcular a nota final reprovou por faltas? pode ir a exame final? os nomes dos objectos começam com calcular a nota final reprovou por faltas? pode ir a exame final? Objecto: aluno2 atributos nº mec.: 25506 nome: Luisa Santos nota aval.periódica: 15 nota exame final: 13 nº de faltas às TP: 0 nº de faltas às P: 0 métodos minúsculas calcular a nota final reprovou por faltas? pode ir a exame final? Programação em Java 2006-2007 4 Classe: Produto atributos codigo designacao precoUnit quantStock Passos para criar uma Classe métodos entradaEmStock public class Produto extends P1App { // atributos da classe Produto int codigo; String designacao; double precoUnit; int quantStock; // construtor para a classe Produto public Produto (int c, String d, double p, int q) { codigo = c; designacao = d; precoUnit = p; quantStock = q; } public void entradaEmStock (int numUnidades) { quantStock = quantStock + numUnidades; } } 1. Definir nome da classe 2. Definir atributos (variáveis) 3. Definir construtores construtor - método utilizado para criar e inicializar os objectos da classe subprograma com o mesmo nome da classe sem valor de retorno cada classe deve ter pelo menos um construtor 4. Definir métodos (subprogramas) 5. Guardar em ficheiro com nome: NomeClasse.java Este método modifica o estado do atributo quantStock (note que o tipo de dados de saída é void ) Programação em Java 2006-2007 5 Criação de Objectos Depois de construir uma classe, é possível escrever um outro programa que utilize objectos criados a partir desta classe public class Produto extends P1App { // atributos da classe Produto int codigo; String designacao; double precoUnit; int quantStock; // construtor para a classe Produto public Produto (int c, String d, double p, int q) { codigo = c; designacao = d; precoUnit = p; quantStock = q; } // métodos associados à classe Produto ….. } } A declaração de um objecto é semelhante à das variáveis de tipo primitivo NomeClasse nomeObjecto Exemplo: Produto p1; Nota: Esta declaração por si só não cria o objecto. Apenas reserva na memória um espaço capaz de armazenar um endereço da memoria (referencia) onde este objecto venha a ser armazenado. A criação de um objecto é feita usando new nomeObjecto = new NomeClasse(parâm.) Exemplo: p1 = new Produto (1, "Computador portátil", 1100.00, 0) Nota: new encarrega-se de chamar o construtor da classe. Entre parêntesis devem ser passados os respectivos parâmetros, se houver Programação em Java 2006-2007 6 Declaração, Criação e Inicialização Podemos declarar, criar e inicializar um objecto numa única instrução NomeClasse nomeObjecto = new NomeClasse(parâmetros_do_construtor) Exemplo: Produto p1 = new Produto (1, "Computador portátil", 1100.00, 0) Ou podemos apenas declarar o objecto para logo cria-lo e inicializá-lo Exemplo: public class Produto extends P1App { int cod, quant; double preco; String design; //1º. declarar 2º produto Produto p2; // 2º. ler os dados do 2º produto do teclado println("Produto #2"); cod = readInt (" . código do produto: "); design = readLine (" . designação : "); preco = readDouble(" . preço unitário : "); println(); // 3º. Criar objecto com nome p2 p2 = new Produto(cod, design, preco, 0); Programação em Java 2006-2007 // atributos da classe Produto int codigo; codigo String designacao; designacao double precoUnit; precoUnit int quantStock; quantStock // construtor para a classe Produto public Produto (int c, String d, double p, int q) { codigo = c; designacao = d; precoUnit = p; quantStock = q; } // métodos associados à classe Produto ….. } } 7 Acedendo aos atributos e invocando métodos Para aceder a um atributo de um objecto: Para invocar um método: Exemplo: nomeObjecto.nomeAtributo nomeObjecto.nomeMétodo (parâmetros) Classe: Produto atributos codigo designacao precoUnit quantStock métodos entradaEmStock // declarar e criar um objecto da classe Produto Produto p = new Produto(1, "Computador portátil", 1100.00, 0); // mostrar no ecrã o stock inicial (mostra 0) println(“stock inicial: ” + p.stock) // actualizar stock p.entradaEmStock(5) // mostrar no ecrã o stock actualizado (mostra 5) println(“stock actual: “ + p.stock) Programação em Java 2006-2007 8 Exemplo 1: Gestão de Produtos import p1.*; // subprograma que imprime os atributos de um produto public class Pr_13_1_GestProdutos extends P1App { public static void mostrarAtributos(Produto p) { public static void main(String [] args) { println(" . código -> " + p.codigo); int cod, quant; println(" . designação -> " + p.designacao); double preco; print (" . preço unitário -> "); String design; printfd(4,2, p.precoUnit); println(); // declarar e criar um objecto da classe Produto println(" . quantidade em stock -> " + p.quantStock); Produto p1 = new Produto(1, "Computador portátil", println(); 1100.00, 0); } // fecho suprograma // declarar outro objecto da classe Produto Produto p2; } // fecho main // ler os dados do 2º produto } // fecho programa println("Produto #2"); cod = readInt (" . código do produto: "); design = readLine (" . designação : "); preco = readDouble(" . preço unitário : "); println(); Dois objectos (instâncias) // criar e inicializar dados do 2º produto da classe Produto são p2 = new Produto (cod, design, preco, 0); criados, com nomes // mostrar os valores de cada produto println("Produto #1:"); p1 e p2 mostrarAtributos(p1); println("Produto #2:"); mostrarAtributos(p2); Programação em Java 2006-2007 9 Problema 1. Supondo que a empresa comercializa apenas dois produtos, alterar o exemplo anterior para que este passe implementar um pequeno sistema de gestão de produtos em stock. O programa deverá ter o seguinte menu de opções: 1. Listar produtos 2. Entrada em stock 3. Saída (venda) 4. Encomenda 0. Terminar Programação em Java 2006-2007 10 Problema 1: Menu de Operações A opção “1. Listar produtos” deve listar todos os dados associados aos dois produtos usando o subprograma mostrarAtributos como mostrado no exemplo anterior public static void main(String args[]) { // declaração de variáveis do { // repetir enquanto opção <> 0 println(“Menu"); println(" 1 – Listar Produtos"); println(" 2 – Entrada em Stock"); println(" 3 - Saída (venda)”); println(" 4 - Produtos a Encomendar”); println(" 0 - Terminar o programa”); op = readInt(“Seleccione uma opção ", 0, 4); switch (op) { case 1: // listar produtos break; case 2: // entrada em stock break; case 3: // venda break; case 4: // Produtos a encomendar break; } while (op !=0); } // fecha main Programação em Java 2006-2007 11 Problema 1. Opção 2 – Entrada em Stock Variáveis: int cod, quant; Produto p1, p2; Algoritmo: switch (op) { … case 2: // entrada em stock Leitura do código do produto a entrar (cod); SE codigo válido { Leitura da quantidade do produto a entrar (quant); Entrar quant do produto em stock; Mostrar no ecrã o stock actualizado; } CASO CONTRÁRIO Escrever mensagem “código não válido”; Escrever mensagem “prima <enter> para continuar”; break; } Programação em Java 2006-2007 Classe: Produto atributos codigo designacao precoUnit quantStock métodos entradaEmStock Usar o método entradaEmStock da classe Produto 12 Problema 1. Opção 3 – Venda case 3: // saída (venda) Leitura do código do produto a entrar (cod); SE (código válido) { Leitura da quantidade do produto a vender (quant); Venda de produto (quant); SE (foi possível vender) Mostrar no ecrã o valor da venda; Mostrar no ecrã o stock actualizado; CASO CONTRÁRIO Escrever mensagem “stock não suficiente”; } CASO CONTRÁRIO Escrever mensagem “código não válido”; Escrever mensagem “prima <enter> para continuar”; break; Programação em Java 2006-2007 Classe: Produto atributos codigo designacao precoUnit quantStock métodos entradaEmStock venda acrescentar o método venda à classe Produto. Este método deve receber como parâmetro o nº de unidades vendidas numUnidades SE nº de unidades do produto em stock é suficiente para satisfazer o pedido: 1º. subtrair do stock numUnid 2º. devolver o valor da venda (quantidade x preço unitário); CASO CONTRARIO: devolver um valor negativo 13 Problema 1. Classe: Produto atributos Opção 4 – Encomenda case 4: // encomendar produtos SE (p1.verificarPontoEncomenda() > 0 ){ Mostrar dados do produto # 1 (modificar o subprograma “mostrarAtributos”): Produto #1 . código -> 1 . designação -> Computador portátil . preço unitário -> 1100,00 . quantidade em stock -> 0 . pontoEncomenda -> 4 Mostrar quantidade mínima a encomendar: quantidade mínima a encomendar: 4 unidades } SE (p2.verificarPontoEncomenda() > 0 ){ Mostrar dados do produto # 2 Mostrar quantidade mínima a encomendar: } Escrever mensagem “prima <enter> para continuar”; break; codigo designacao precoUnit quantStock pontoEncomenda métodos entradaEmStock venda verificarPontoEncomenda 1. acrescentar o atributo pontoEncomenda o nº mínimo de unidades que deverão existir em stock de forma a evitar eventuais rupturas de stock (isto leva a modificar o construtor da classe e o programa principal) 2. acrescentar o método verificarPontoEncomenda SE (pontoEncomenda – quantStock > 0) devolver este valor que corresponde ao nº mínimo de unidades a encomendar para regularizar o stock; CASO CONTARIO devolver o valor zero Programação em Java 2006-2007 14 A Classe String: uma classe do pacote java.lang Podemos assim declarar, criar e inicializar um objecto da classe String: String nome_do_string = new String(“texto”) Exemplo: String str = new String(“Bom dia turma”); Uma vez instanciado um objecto da classe String podemos invocar todos os seus métodos: nomeObjecto.nomeMétodo (parâmetros) Exemplos: int n = str.length(); char c = str.charAtt(2); String s = str.substring(8) Todas as classes definidas em Java estão bem documentadas no site da Sun (java.sun.com) Toda a documentação sobre todos os métodos da classe String podem ser consultados on-line em: http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html#method_summary Programação em Java 2006-2007 15 Classes usadas com Ficheiros BufferedReader, FileReader, BufferedWriter, FileWriter Todas estas classes pertencem ao pacote java.io Documentação on-line em: http://java.sun.com/j2se/1.4.2/docs/api/java/io/package-summary.html Exemplo: import java.io.*; class Ex_12_1_lerFicheiro extends P1App { static void main(String [] args) throws IOException { String s, nomeFx; // atribuir a nomeFx o nome do ficheiro nomeFx = “teste1.txt”; // declarar um objecto da classe BufferedReader BufferedReader f; // cria e inicializa o objecto com nome f da classe BufferedReader f = new BufferedReader(new FileReader(nomeFx)); // lee a primeira linha do ficheiro s = f.readLine(); // readLine é um método da classe BufferedReader } } A documentação sobre todas as classes de Java pode ser consultada em: http://java.sun.com/j2se/1.4.2/docs/api/allclasses-noframe.html Programação em Java 2006-2007 16 A classe Math A classe Math é uma das classes do pacote java.lang. Esta inclui um vasto conjunto de métodos que implementam diversas funções matemáticas As classes pertencentes ao pacote java.lang das “JAVA API classes”, tais como Math, System, String, etc., não precisam ser importadas toda a documentação sobre os métodos da classe Math está disponível em: http://java.sun.com/j2se/1.4.2/docs/ api/java/lang/Math.html import p1; class Ex_2_5_ClasseMath extends P1App { public static void main(String args[]) { println("abs(-30): " + Math.abs(-30) ); println("acos(0.5): " + Math.acos(0.5) ); println("asin(0.5): " + Math.asin(0.5) ); println("atan(60): " + Math.atan(60) ); println("ceil(5.215): " + Math.ceil(5.215) ); println("ceil(-5.215): " + Math.ceil(-5.215) ); println("cos(60): " + Math.cos(60) ); println("exp(10): " + Math.exp(10) ); println("floor(54.687): " + Math.floor(54.687) ); println("floor(-54.687): " + Math.floor(-54.687) ); println("log(2): " + Math.log(2) ); println("max(5,7): " + Math.max(5,7) ); println("min(-3,2): " + Math.min(-3,2) ); println("pow(2,3): " + Math.pow(2,3) ); println("random(): " + Math.random() ); println("round(13.124): " + Math.round(13.124) ); println("sin(30): " + Math.sin(30) ); println("sqrt(16): " + Math.sqrt(16) ); println("tan(45): " + Math.tan(45) ); println("toDregrees(2): " + Math.toDegrees(2) ); println("toRadians(90): " + Math.toRadians(90) ); } } Programação em Java 2006-2007 17 Bibliografia António José Mendes, Maria José Marcelino. Fundamentos de programação em JAVA 2.FCA – Editora de informática, 2003. Tutorial da Sun sobre classes e Objectos em Java http://java.sun.com/docs/books/tutorial/java/javaOO/index.html Programação em Java 2006-2007 18