Java Criação de Classes e Objetos Unidade de Aprendizado Criação de classes e objetos Você aprenderá nesta unidade • • • • • • Métodos; Classes e objetos; Criação e uso de objetos Variáveis e métodos de instância e de classe. Construtores. Referência this. UA “Classes, Objetos e Encapsulamento” - Apresentação Métodos • Estrutura de um método; • Chamadas a métodos; • Regras aplicadas aos métodos; • Sobrecarga de métodos; UA “Classes, Objetos e Encapsulamento” - Teoria Estrutura de um método • Um método de uma classe tem a seguinte estrutura genérica: <visibilidade> <static> <tipo_retorno> <nome_metodo> (<parêmetros>) { //corpo ou escopo do método. Fica entre chaves { }. } <visibilidade> - public, private, <package>, protected; <static> - com a palavra static ou sem ela; <tipo_retorno> - void, tipo primitivo ou classe; <nome_método> - valem as convenções; <parâmetros> - devem ser do mesmo tipo que os argumentos enviados. UA “Classes, Objetos e Encapsulamento” - Teoria Demonstração 04 Estrutura de um método //Exemplo de um método que não retorna valor - void public class DesenhaPontosUsandoMetodo{ public static void main(String args[]) { ... desenhaPontos(numPontos); //chamada do método System.exit(0); } //Declaração do método desenhaPontos public static void desenhaPontos(int num) { System.out.print(num + " pontos: \t" ); for (int i = 0; i <= num; i++){ System.out.print("."); } System.out.println(); } } UA “Classes, Objetos e Encapsulamento” - Teoria Demonstração 05 Estrutura de um método //Método com retorno de valores public class AvaliaRandomico { public static void main(String args[]){ while (i<=intIteracoes) { a = intSorteado(inic,fin); switch (a){ Chamada do método case 1: i1++;break; case 2: i2++;break; ... } i++; } System.out.println (intIteracoes + ..... ..... + .... intPonto); System.out.println ("i1 - " + i1 + " \t" + strBarra(i1)); System.out.println ("i2 - " + i2 + " \t" + strBarra(i2));... } public static int intSorteado (int a, int b){ return ((int) (Math.random()*(b-a+1)) + a); } public static String strBarra(int a){ String strResult = ""; for (i = 0;i<=a;i+=intPonto){ Retorno do método strResult += "."; } return strResult; } } UA “Classes, Objetos e Encapsulamento” - Teoria Chamadas a métodos • Dentro da definição da classe – nomeDoMetodo( ) • Chamados automaticamente – main( ), init( ), paint( ) • Métodos de classe – Integer.parseInt( ), Math.random( ) • Métodos de instância da classe – aluno1.getNome( ) UA “Classes, Objetos e Encapsulamento” - Teoria Regras aplicadas aos métodos • Métodos retornam no máximo um valor; • Se <tipo_retorno> não for void, o corpo do método tem que ter um return; • É um erro de sintaxe passar os argumentos com tipos diferentes dos parâmetros recebidos; • Um método não pode ser definido dentro de outro método; • Métodos devem ter sua função bem definida para promover a reutilização de código. UA “Classes, Objetos e Encapsulamento” - Teoria Demonstrãção 06 Escopo de variáveis public class EscopoDeVariavel { static int x = 1; // variável “global” da classe public static void main(String args[]){ int x = 5; // variable local do metodo main System.out.println("x no inicio de main() eh " + x); metodoA(); // metodoA tem uma variavel local de x metodoB(); // metodoB usa a variavel de instancia metodoA(); // metodoA reinicializa a variavel local x metodoB(); // variavel de instancia x retem seu valor } public static void metodoA(){ int x = 25; // inicializa cada vez que for chamado System.out.println("\n\nVariavel local x ao entrar no metodoA eh " + x); ++x; System.out.println("Variavel local x antes de sair do metodoA eh " + x); } public static void metodoB(){ System.out.println("\n\nVariavel local x ao entrar no metodoB eh " + x); x *= 10; System.out.println("Variavel local x antes de sair do metodoA eh " + x); } } UA “Classes, Objetos e Encapsulamento” - Teoria Sobrecarga de métodos overload definição • Ocorre quando dentro da definição de uma classe existem dois ou mais métodos com o mesmo nome. • Para que isso seja possível os métodos devem ter assinaturas diferentes . • Assinatura: formada pelo nome do método, junto com o número e os tipos dos parâmetros. O tipo de retorno NÃO é levado em consideração. UA “Classes, Objetos e Encapsulamento” - Teoria Sobrecarga de métodos public void defineCampo(int valor){ idade = valor; } public void defineCampo(String valor){ nome = valor; } public int defineCampo(int valor1, String valor2){ idade = valor1; nome = valor2; } //Exemplo de chamada de método sobrecarregado ... emp.defineCampo(32); emp.defineCampo(“Maria”); emp.defineCampo(40, “Roberto”); ... emp.defineCampo(12f); // Erro!!!! UA “Classes, Objetos e Encapsulamento” - Teoria Classe e Objeto Definição • Classe é uma descrição de alguma coisa existente no domínio do problema. É usada na criação de múltiplos objetos. Engloba dados e comportamento de um objeto. • Objeto (Instância de classe) é uma entidade relevante ao domínio do problema. São dinâmicos. UA “Classes, Objetos e Encapsulamento” - Teoria Operador new • O operador new cria um objeto da classe colocada à sua direita e retorna uma referência. • Sintaxe: Empregado emp;//Declaração da variável emp do tipo Empregado emp = new Empregado();//A referência é atribuída a emp ou Empregado emp = new Empregado();//2 passos numa única linha UA “Classes, Objetos e Encapsulamento” - Teoria Uso de objetos • Uma vez criado o objeto, podemos usar suas propriedades (atributos) e métodos através de sua referência: ... emp.defineIdade(22); ... emp.idade = 66; emp.nome = “Fernando Henrique”; ... UA “Classes, Objetos e Encapsulamento” - Teoria Modificadores de Visibilidade Modificadores private <package> * protected public package xyz Mesma classe x x x x class Teste1 { private int x; int y;//* protected int z; public int w; metodo m1( ){ x,y,z,w -> ok } } class Teste2 x -> não y -> ok z -> ok w -> ok Mesmo package x x x Subclasses x x class Teste3 x -> não y -> não z -> não w -> ok Qualquer lugar x package abc class Teste4 extends teste1 z -> ok w -> ok UA “Classes, Objetos e Encapsulamento” - Teoria Encapsulamento • Manter dentro da classe seus métodos e propriedades. • Com o encapsulamento, não importa quanto o sistema cresça ou se torne complexo, a manutenção estará segura, pois o código estará no lugar mais fácil de ser encontrado, encapsulado na definição do objeto. UA “Classes, Objetos e Encapsulamento” - Teoria Ocultamento • Esconder como os objetos funcionam internamente e o que eles sabem atrás de uma interface. • Através dos modificadores de visibilidade temos como obter o encapsulamento e o ocultamento. • Regra básica: variáveis de instância private e métodos de acesso public UA “Classes, Objetos e Encapsulamento” - Teoria Métodos Set e Get • Utilizados para atribuir ou retornar os valores dos atributos da classe. • Garante o formato de retorno e valida valores inseridos. public class Empregado { private int idade; private String nome; public void setIdade(int valor){ idade = (valor<0)? 0 : valor; } public int getIdade(){ ... } public void setNome(String valor){ ... } public String getNome(){ ... } } UA “Classes, Objetos e Encapsulamento” - Teoria Variáveis de instância • Variáveis de Instância são aquelas declaradas dentro da definição da classe e que todo objeto da classe possui um próprio. public class Empregado { private int idade; //tipos primt. Numéricos são inicializado com zero private boolean permiteEscrita; //tipos primit. booleanos com false private String nome; //objetos são inicializados com null ... } UA “Classes, Objetos e Encapsulamento” - Teoria Métodos de instância • Métodos de Instância são aqueles declarados dentro da definição da classe e que todo objeto possui individualmente. public class Empregado {... public void defineIdade(int campo) { idade = campo; } public int retornaIdade() { return idade; } ... } UA “Classes, Objetos e Encapsulamento” - Teoria Demonstração 08 variáveis e métodos de instância public class BarraHorizontal{ private int numPontos; public void setNumPontos(int n){ if(n < 0) numPontos = 0; else numPontos = n; } public void setNumPontos(){ numPontos = 0; } public int getNumPontos(){ return numPontos; } public class TestaBarraHorizontal{ public static void main(String args[]) { //Declara b1 e atribui uma instância da classe BarraHorizontal b1 = new BarraHorizontal (); /*Pode-se operar com o objeto somente com seus métodos de acesso*/ b1.setNumPontos(20); b1.geraBarra(); //Como o objeto está num "estado consistente” ... b1.setNumPontos(-30); b1.geraBarra(); b1.setNumPontos( ); b1.geraBarra(); public void geraBarra(){ ... } System.exit(0); } Variáveis private e métodos public. } } Não se tem acesso direto às variáveis. O encapsulamento permite manter o objeto em “estado consistente”. UA “Classes, Objetos e Encapsulamento” - Teoria Construtores • São métodos especiais que as classes possuem e que servem para inicializar seus objetos, alocando a memória de que eles precisarão. • Devem obrigatoriamente ter o mesmo nome que a classe a qual pertencem e não possuem tipo de retorno. • Usam o conceito de sobrecarga de método. • Construtor padrão UA “Classes, Objetos e Encapsulamento” - Teoria Construtores //Classe com dois construtores public class Empregado{ //Construtor padrão. Neste caso deve existir //obrigatoriamente para não gerar um erro public Empregado() { } } //Construtor para quando a classe receber um inteiro e //um String. public Empregado(int valor1, String valor2) { idade = valor1; nome = valor2; } ... UA “Classes, Objetos e Encapsulamento” - Teoria Referência this • Parâmetro implícito de todos os métodos de instância. Se refere ao objeto atual sobre o qual o método foi chamado. • Obrigatório quando: – o nome da variável é igual ao nome de um argumento formal passado pelo método de instância; – for necessário passar uma referência ao objeto atual como parâmetro para outro método. UA “Classes, Objetos e Encapsulamento” - Teoria Exemplos de uso da Referência this int idade; String nome; ... public Empregado(int idade, String nome) { this.idade = idade; this.nome = nome; } ... public Empregado(int valor1) { idade = valor1; } public Empregado(int v1, String v2) { this(v1);//chama o método que recebe um único inteiro nome = valor2; } ... UA “Classes, Objetos e Encapsulamento” - Teoria Variáveis e métodos de classe • Variável de classe é aquela que pertence a classe e é compartilhada por todas as instâncias da mesma. • Usa-se o inicializador static public class Empregado { private int idade; //var. de instância private String nome; //var. de instância private static double ultimaMatricula = 8;//var. de classe ... } UA “Classes, Objetos e Encapsulamento” - Teoria Variáveis e métodos de classe • Inicializações complexas podem ser feitas dentro de blocos de inicialização static public class Empregado { private int idade; private String nome; private static double ultimaMatricula = 8; static { ultimaMatricula = outroObjeto.recupera(); } ... } UA “Classes, Objetos e Encapsulamento” - Teoria Variáveis e métodos de classe • Método de classe é aquele que pertence a classe e é compartilhada por todas as instâncias da mesma. public class Empregado { ... public static void defineUltMatr(double valor) { ultimaMatricula = valor; } ... } Empregado.defineUltMatr(50); UA “Classes, Objetos e Encapsulamento” - Teoria Demonstração 11 variáveis e métodos de classe //.. mesmo tipo (*, -, #, etc.. ...um contador public class BarraHorizontal{ private int extensao; //var. de instância private static int itens; // var. de classe private static char tipoBarra; //var. de classe public BarraHorizontal(){ tipoBarra = '*'; itens++;//incrementa a variável estática } public BarraHorizontal(int extensao){ this(); setExtensao(extensao); } public void setExtensao(int extensao){ if(extensao < 0) this.extensao = 0; else this.extensao = extensao; } public static void setTipoBarra(char t){ tipoBarra = t; } public static int getItens(){ return itens;} public static char getBarra(){return tipoBarra;} public int getExtensao(){return extensao;} BarraHorizontal b1, b2, b3; b1 = new BarraHorizontal(20); b1.setTipoBarra('#'); b2 = new BarraHorizontal(-30); b3 = b2; //b3 é um outro objeto? b2.setExtensao(15); //individual do objeto //Setando todas as barras para tipo "-" BarraHorizontal.setTipoBarra('-'); System.out.println(b1); System.out.println(b2); System.out.println(b3); //Métodos de classe podem ser acessados pelo nome da classe //ou pela referência de qualquer uma de suas instâncias System.out.println("Total de barras: " + b1.getItens()); System.out.println("Total de barras: " + BarraHorizontal.getItens()); System.out.println("Barra usada: " + b1.getBarra()); System.exit(0); private String geraBarra(){...;} public String toString(){...;}} UA “Classes, Objetos e Encapsulamento” - Teoria Lab 06 Loja Virtual Objetivo: Praticar o uso de variáveis de instância e de classe. Tarefas: Criar um projeto para uma loja virtual. É Produto um exemplo de “composição”,onde objetos são usados como variáveis de instância de outras classes. Cliente TestaLoja -descricao: String -nome: String -preco: double -desconto: double +Produto(nome, descricao, preco, desconto) +getPreco() : double +getDesconto(): double +setDesconto(desc: double) -nome: String -endereco: String -pedido: CestaCompras +getNome(): String +setPedido(CestaCompras) +getPedido(): CestaCompras CestaCompras -produto: Produto[] -total: double +CestaCompras(quantidade) +getQuantidade(): int +adicionar(Produto): boolean +getTotal(): double +remover(Produto): boolean +main(){ declara um cliente1; constrói cliente1 “João Barone” constrói produto1 e item1 associa item1 a cliente1 altera as quantidades de item1 imprime as propriedades de cliente1 e do seu item } UA “Introdução a Java” - BCA “O que é a linguagem Java?” - Laboratório Herança e Polimorfismo Unidade de Aprendizado UA “Classes, Interfaces e Arrays” - BCA “Herança” Herança e Polimorfismo • • • • • • Você aprenderá Conceito de herança. Classe Object e construtores. Referência super. Sobrescrita de métodos. Polimorfismo. Modificador final. UA “Classes, Interfaces e Arrays” - BCA “Herança” - Apresentação Conceito de Herança • É a possibilidade de se criar objetos a partir de outros já existentes. Os objetos derivados contêm todos os atributos e métodos que o seu antecessor. • Hierarquia de objetos. Primata Macaco Humano Homem Mulher UA “Classes, Interfaces e Arrays” - BCA “Herança” - Teoria Herança • Palavra chave extends. • Hierarquia de objetos. • Não é permitida herança múltipla, ou seja, uma classe só pode estender uma e somente uma outra. UA “Classes, Interfaces e Arrays” - BCA “Herança” - Teoria Herança • Para criarmos um objeto filho ou descendente usa-se extends public class Humano extends Primata{} • Humano contém todos os métodos e propriedades de Primata. • Construtores não são herdados. Conceito de Herança • Na definição da classe Humano acrescentamos propriedades e métodos próprios dos Humanos public class Humano extends Primata { private String nome; private int idade; private String profissao; public void definirNome(String nome) {...} public void definirIdade(int idade) {...} public void definirProfissao(String profissao){...} public String retornarNome() {...} public int retornarIdade() {...} public String retornarProfissao() {...} } Hierarquia de construtores Homem fulano = new Homem(); • Chama o construtor padrão da classe propriamente dita. • Chama o construtor padrão da classe pai até alcançar a classe Object. UA “Classes, Interfaces e Arrays” - BCA “Herança” - Teoria Referência super • Usada para referenciar a classe pai. • super() se refere, dentro de um construtor, ao construtor existente na classe pai. • Deve estar na primeira linha do construtor. • Se não houver uma instrução super() ou this() explícita em um construtor, Java coloca uma chamada a super() implícita. UA “Classes, Interfaces e Arrays” - BCA “Herança” - Teoria Referência super 1 public class Humano extends Primata { 2 3 4 6 8 15 String nome; int idade; String profissao; ... public Humano (){} public Humano(String nome, int id, String prof) public void setNome(String nome) {...} ... {...} 33 } public class Homem extends Humano { String certMilitar; public Homem(){ certMilitar = “000000”;}//super() implicito o que torna //a linha 6 obrigatória public Homem(String nome, int idade, String profissao, String ident) { super(nome, idade, profissao); certMilitar = ident; } } Sobrescrita de métodos overriding • Consiste em definir, na classe filha, um método com a mesma assinatura (ou seja, mesmos argumentos) e mesmo tipo de retorno de uma classe pai (não necessariamente no primeiro nível de herança). • Podemos referenciar o método da classe pai através da referência super em qualquer lugar do método. UA “Classes, Interfaces e Arrays” - BCA “Herança” - Teoria Demonstração 12 sobrescrita de métodos 1 public class Humano extends Primata { 2 String nome; 3 int idade; 4 String profissao; public class TestaHumano{ public static void main(String args[]){ Homem h1 = new Homem("Silvio Rodrigues", 39, 1 "Coordenador", "373-619" ); System.out.println(h1.getProfissao()); } } ... 6 public Humano (){} 8 public Humano(String n, int i, String p){... 11 setProfissao(p);} 15 public void setNome(String nome) {...} 21 public void setProfissao(String prof){...} ... 4 5 6 Coordenador - contratado Press any key to continue . . . 33 } public class Homem extends Humano { String certMilitar; public Homem(){ certMilitar = "000000"; } public Homem(String nome, int idade, 2 String profissao, String ident) { super(nome, idade, profissao); 3 certMilitar = ident; } //Método sobreescreve o mesmo método da superclasse public void setProfissao(String profissao){ 6 this.profissao = profissao + " - contratado"; } } UA “Classes, Interfaces e Arrays” - BCA “Herança” - Teoria Polimorfismo • Permite que a linguagem consiga determinar, em tempo de execução, qual método deverá ser executado, dependendo do tipo do objeto. boolean cadastrarUsuario(Humano pessoa) { // esse método cadastra em um banco de dados // informações referentes a uma pessoa, seja // esta um homem ou uma mulher String nome = pessoa.retornarNome(); ... } • Com o polimorfismo, um grande programa fica mais linear, com menos desvios de lógica. UA “Classes, Interfaces e Arrays” - BCA “Herança” - Teoria Polimorfismo • Operador instanceof • Retorna um valor booleano indicando se o objeto é uma instância de uma determinada classe. UA “Classes, Interfaces e Arrays” - BCA “Herança” - Teoria Modificador final • Uma variável final é uma constante. • Um método final não pode ser sobrescrito. • Uma classe final não pode ter filhos. public final PI = 3.1415f; public final boolean verificaSenha(String senha) { ... } public final class String { ... } UA “Classes, Interfaces e Arrays” - BCA “Herança” - Teoria Demonstração 13 herança e polimorfismo Empregado String primeiroNome; String ultimoNome; public class TestePolimorfismo{ static Empregado e_ref; //Só referência public static void main(String args[]){ rendimentos( ){ return -1; } Chefe PorPecaProduzida double salarioSemanal; double salarioPorProducao; double quantidadeProduzida; rendimentos( ){ return salarioSemanal; } //construído com salario semanal Chefe ch1 = new Chefe("Al", "Capone",80000.0); e_ref = ch1; relatorioDeSaida(); System.out.println(ch1.toString() + ch1.rendimentos()); //Salário por produção e peças produzidas PorPecaProduzida ppp = new PorPecaProduzida ("Jorge", "Silva", 20.0, 427); e_ref = ppp; relatorioDeSaida(); System.out.println(ppp.toString() + ppp.rendimentos()); System.exit(0); rendimentos( ){ return salarioPorProducao * quantidadeProduzida; } } (Chefe) Al Capone 80000.0 (Chefe) Al Capone 80000.0 (Funcionario por peca produzida) Jorge Silva 8540.0 (Funcionario por peca produzida) Jorge Silva 8540.0 Press any key to continue . . . public static void relatorioDeSaida(){ System.out.println(e_ref.toString() + e_ref.rendimentos()); } }