Introdução à Análise Orientada a Objetos Prof. Ariovaldo Dias de Oliveira Parte 2
Solução da Atividade 1 class Funcionário {  String nome; String departamento; private  double salário; String admissão; String rg; boolean ativo; Segue... Atributos
Funcionário (String nome, String departamento, double  salário, String admissão, String rg) { this.nome = nome; this.departamento = departamento; this.salário = salário; this.admissão = admissão; this.rg = rg; ativo = true; } Construtor   Segue... O construtor da classe é um bloco declarado com o mesmo nome da classe. Quando não se declara nenhum construtor, um  construtor default  é ativado. Ele não recebe nenhum argumento e o corpo dele é vazio. A partir do momento que se declara um construtor, o  construtor default  não é mais fornecido.
  void bonifica(double valor) { salário = salário + valor; } void demite(){ ativo = false; } double getSalário() { return salário; } } Métodos   Segue...
Programa para testar a classe Funcionário class TestaFuncionário { public static void main (String [ ] args) { Funcionário f = new Funcionário ("João", "RH", 123.45, "23/03/2011", "123456-x");    System.out.println("nome..............." + f.nome);   System.out.println("departamento..." +f.departamento);   System.out.println("salário............ " + f.getSalário());   System.out.println("admissão........." +f.admissão);   System.out.println("RG.................." + f.rg);   System.out.println("ativo................" + f.ativo);   f.bonifica(100);   System.out.println("novo salário....." + f.getSalário());   f.demite();   System.out.println("ativo................" + f.ativo); } }
UML da Atividade 1 Funcionário +nome:  String +departamento:  String  -salário:  double +admissão:  String +rg:  String +ativo:  boolean +Funcionário (nome: String, departamento: String,   salário: double, admissão: String, rg: String): +bonifica( valor: double ): +demite ( ): +getSalário ( ): double
Herança A herança é um relacionamento pelo qual uma classe, chamada de subclasse, herda todos comportamentos e estados possíveis de outra classe, chamada de superclasse ou classe base
Exemplo de Herança import java.util.Scanner;  class Funcionário {  String nome; private double salário; double getSalário() { return salário; } void setSalário(double salário) { this.salário =  salário; } } Segue...
class Gerente extends Funcionário { int senha; boolean autentica(int senha) { if (this.senha == senha) { return true; } else { return false; } } } Em todo momento que criarmos um objeto do tipo  Gerente , este objeto também possuirá os atributos e métodos de  Funcionário Segue...
class TestaGerente { public static void main (String [ ] args) { Gerente gestor = new Gerente ( ); gestor.nome = "João"; gestor.setSalário(8000.0); Scanner input = new Scanner(System.in);  System.out.println ("Informe a senha para criar esse gerente: ");   int senha = input.nextInt();    gestor.senha = senha;  System.out.println ("Informe a senha para acessar esse gerente: ");   int senhaAcesso = input.nextInt();    boolean permite = gestor.autentica(senhaAcesso); if (permite) { System.out.println("Permitido"); } else { System.out.println("Negado"); } } }
Para dar aumento ao Gerente, não podemos  comandar  (na subclasse Gerente) a ação  Salário = Salário + valor , pois esta subclasse  não tem acesso ao atributo salário, que é  private  na superclasse Funcionário: class Gerente extends Funcionário { int senha; boolean autentica(int senha) { if (this.senha == senha) { return true; } else { return false; } } void daAumento (double valor) { salário = salário + valor; } } Vai dar erro de compilação!
Para não dar erro, mudamos o atributo de salário (em Funcionário) de  private  para  protected import java.util.Scanner;  class Funcionário {  String nome; protected  double salário; double getSalário() { return salário; } void setSalário(double salário) { this.salário =  salário; } }
Para discussão: O que aconteceria se comandássemos no programa TestaGerente um acesso direto ao atributo salário do gerente, como na codificação abaixo? ..... boolean permite = gestor.autentica(senhaAcesso); if (permite) { System.out.println("Permitido"); } else { System.out.println("Negado"); } System.out.println(gestor.salário);
Funcionário +bonifica (valor: double ): +demite ( ): +getSalário ( ): double Gerente +nome:  String +departamento:  String  # salário:  double +admissão:  String +rg:  String +ativo:  boolean +senha:  int +autentica (senha: int): boolean
Sobrescrita (ou Reescrita) de Método Ocorre quando uma sobclasse define um método idêntico(*)  a um método de sua superclasse Utilizado quando o comportamento da superclasse não corresponde ao desejado para o método da subclasse (*) Métodos idênticos possuem o mesmo nome, tipo de retorno e lista de parâmetros
Exemplo de Sobrescrita class Produto {  int cod; String desc; protected double preço; void setPreço(double preço) { this.preço = preço; } void aumenta (double valor){ preço = preço + valor; } double getPreço() { return preço; } } Segue...
class Importado extends Produto { int codImportação;   void setPreço(double preço) { this.preço = preço * 1.7; } }
class TestaProduto { public static void main (String [ ] args) { Produto prod1= new Produto ( ); prod1.cod = 123; prod1.desc = "Borracha"; prod1.setPreço(2.5); prod1.aumenta(0.5); System.out.println(prod1.desc + " preço = " + prod1.getPreço());   Importado prod2 = new Importado(); prod2.cod = 456; prod2.desc = "Lápis"; prod2.codImportação = 12345; prod2.setPreço(3); prod2.aumenta(1); System.out.println(prod2.desc + " preço = " + prod2.getPreço()); } } Sem o Método  setPreço  na classe  Importado , o valor exibido para o produto 2 seria 4 e não 6.1  Segue...
Sobrecarga Sobrecarregar um método ou um construtor significa prover mais de uma versão desse mesmo Método (ou Construtor). As versões devem, necessariamente, possuir listas de parâmetros diferentes, seja no tipo ou no número desses parâmetros (o tipo do valor de retorno pode ser igual).
Exemplo de Sobrecarga de um Construtor class Produto {  int cod; String desc;   Produto (String desc, int cod) { this.cod = cod; this.desc = desc; } Produto (int cod, String desc) { this.cod = cod; this.desc = desc; } Produto (int cod) { this.cod = cod; desc = "descrição padrão"; } Produto (String desc) { this.cod = 999; this.desc = desc; } Produto () { this.cod = 999; this.desc = "descrição padrão"; } } Segue...
class TestaSobrecarga { public static void main (String [ ] args) { Produto prod1= new Produto ("produto 1", 1111 ); System.out.println(prod1.desc + "  " + prod1.cod); Produto prod2= new Produto ( 2222, "produto 2"); System.out.println(prod2.desc + "  " + prod2.cod); Produto prod3= new Produto (3333 ); System.out.println(prod3.desc + "  " + prod3.cod); Produto prod4= new Produto ("produto 4"); System.out.println(prod4.desc + "  " + prod4.cod); Produto prod5= new Produto ( ); System.out.println(prod5.desc + "  " + prod5.cod); } }
Exemplo de Sobrecarga de um Método class Produto {  int cod; String desc;   Produto (String desc, int cod) { this.cod = cod; this.desc = desc; } String getInfo () { String resposta = "Produto: " + desc + ", código = " + cod; return resposta; } String getInfo (int n) { String resposta; if (n == 1 ) { resposta = "Product name: " + desc + ", code = " + cod; } else { resposta = "Product code: " + cod + ", name = " + desc; } return resposta; } } Segue...
class TestaSobrecarga { public static void main (String [ ] args) { Produto prod= new Produto ("tijolo", 1111 ); String texto; texto = prod.getInfo(); System.out.println(texto); texto = prod.getInfo(1); System.out.println(texto); texto = prod.getInfo(2); System.out.println(texto); } }
Polimorfismo É quando existem várias formas de um método ser ativado.  As  mais usuais  são: Polimorfismo por herança - Quando ocorre a sobreposição de um método de uma subclasse em cima do método da superclasse. Polimorfismo por Sobrecarga - Quando em uma classe, um mesmo método (de mesmo nome) pode ser chamado de várias maneiras diferentes, onde a diferença está na quantidade e no tipo de parâmetros passados.
Faça a modelagem em um diagrama UML.  Criar, em Java, as classes Produto, Alimento e o programa Atividade2 de acordo com o especificado abaixo: Um produto tem os seguintes atributos: código, descrição, setor e preço.  Significado de setor:  1 = alimento, 2 = higiene e 3 = roupas.  Esses atributos não podem ser acessados diretamente pelo programa  Atividade2.   Um Alimento é um produto, com a diferença que ele tem um atributo a mais,  que é o código da vigilância sanitária.   Um produto pode ser criado passando-se todos os atributos, ou omitindo-se o atributo de setor, e nesse caso assume-se setor 3 (roupas).   Atividade 2
Para criar-se um alimento, é necessário passar todos os atributos, exceto o setor, que será assumido como 1.    Os produtos tem um valor de ICMS  de 15%, porém para alimentos deve-se calcular 10% para alimentos nacionais ou 20% para alimentos importados. Os alimentos nacionais são aqueles cujo código de Vigilância começa com “55”.   OBS:  Não há necessidade,nesta atividade, de validar os valores dos atributos. Assumiremos que os atributos para os Construtores serão sempre válidos.  O programa Atividade2 deve criar vários produtos para cobrir todas as possibilidades do enunciado
Faça a modelagem em um diagrama UML.  Criar, em Java, algumas classes relacionadas, aplicando os conceitos de encapsulamento, herança, sobrecarga e reescrita. Atividade 3
Referências Orientação a objetos. Disponível em  <http : //www.softechnetwork.com.br/java/CursoOO.pdf >. Acesso em :11 mar. 2011. Java e Orientação a Objetos. Disponível em  <www. caelum.com.br>  Acesso em 15 fev. 2009. RUMBAUGH, James et al. Modelagem e Projetos baseados e Objetos. Rio de Janeiro: Campus, 1997.

Introdução à análise orientada a objetos parte 2

  • 1.
    Introdução à AnáliseOrientada a Objetos Prof. Ariovaldo Dias de Oliveira Parte 2
  • 2.
    Solução da Atividade1 class Funcionário { String nome; String departamento; private double salário; String admissão; String rg; boolean ativo; Segue... Atributos
  • 3.
    Funcionário (String nome,String departamento, double salário, String admissão, String rg) { this.nome = nome; this.departamento = departamento; this.salário = salário; this.admissão = admissão; this.rg = rg; ativo = true; } Construtor Segue... O construtor da classe é um bloco declarado com o mesmo nome da classe. Quando não se declara nenhum construtor, um construtor default é ativado. Ele não recebe nenhum argumento e o corpo dele é vazio. A partir do momento que se declara um construtor, o construtor default não é mais fornecido.
  • 4.
    voidbonifica(double valor) { salário = salário + valor; } void demite(){ ativo = false; } double getSalário() { return salário; } } Métodos Segue...
  • 5.
    Programa para testara classe Funcionário class TestaFuncionário { public static void main (String [ ] args) { Funcionário f = new Funcionário (&quot;João&quot;, &quot;RH&quot;, 123.45, &quot;23/03/2011&quot;, &quot;123456-x&quot;); System.out.println(&quot;nome...............&quot; + f.nome); System.out.println(&quot;departamento...&quot; +f.departamento); System.out.println(&quot;salário............ &quot; + f.getSalário()); System.out.println(&quot;admissão.........&quot; +f.admissão); System.out.println(&quot;RG..................&quot; + f.rg); System.out.println(&quot;ativo................&quot; + f.ativo); f.bonifica(100); System.out.println(&quot;novo salário.....&quot; + f.getSalário()); f.demite(); System.out.println(&quot;ativo................&quot; + f.ativo); } }
  • 6.
    UML da Atividade1 Funcionário +nome: String +departamento: String -salário: double +admissão: String +rg: String +ativo: boolean +Funcionário (nome: String, departamento: String, salário: double, admissão: String, rg: String): +bonifica( valor: double ): +demite ( ): +getSalário ( ): double
  • 7.
    Herança A herançaé um relacionamento pelo qual uma classe, chamada de subclasse, herda todos comportamentos e estados possíveis de outra classe, chamada de superclasse ou classe base
  • 8.
    Exemplo de Herançaimport java.util.Scanner; class Funcionário { String nome; private double salário; double getSalário() { return salário; } void setSalário(double salário) { this.salário = salário; } } Segue...
  • 9.
    class Gerente extendsFuncionário { int senha; boolean autentica(int senha) { if (this.senha == senha) { return true; } else { return false; } } } Em todo momento que criarmos um objeto do tipo Gerente , este objeto também possuirá os atributos e métodos de Funcionário Segue...
  • 10.
    class TestaGerente {public static void main (String [ ] args) { Gerente gestor = new Gerente ( ); gestor.nome = &quot;João&quot;; gestor.setSalário(8000.0); Scanner input = new Scanner(System.in); System.out.println (&quot;Informe a senha para criar esse gerente: &quot;); int senha = input.nextInt(); gestor.senha = senha; System.out.println (&quot;Informe a senha para acessar esse gerente: &quot;); int senhaAcesso = input.nextInt(); boolean permite = gestor.autentica(senhaAcesso); if (permite) { System.out.println(&quot;Permitido&quot;); } else { System.out.println(&quot;Negado&quot;); } } }
  • 11.
    Para dar aumentoao Gerente, não podemos comandar (na subclasse Gerente) a ação Salário = Salário + valor , pois esta subclasse não tem acesso ao atributo salário, que é private na superclasse Funcionário: class Gerente extends Funcionário { int senha; boolean autentica(int senha) { if (this.senha == senha) { return true; } else { return false; } } void daAumento (double valor) { salário = salário + valor; } } Vai dar erro de compilação!
  • 12.
    Para não darerro, mudamos o atributo de salário (em Funcionário) de private para protected import java.util.Scanner; class Funcionário { String nome; protected double salário; double getSalário() { return salário; } void setSalário(double salário) { this.salário = salário; } }
  • 13.
    Para discussão: Oque aconteceria se comandássemos no programa TestaGerente um acesso direto ao atributo salário do gerente, como na codificação abaixo? ..... boolean permite = gestor.autentica(senhaAcesso); if (permite) { System.out.println(&quot;Permitido&quot;); } else { System.out.println(&quot;Negado&quot;); } System.out.println(gestor.salário);
  • 14.
    Funcionário +bonifica (valor:double ): +demite ( ): +getSalário ( ): double Gerente +nome: String +departamento: String # salário: double +admissão: String +rg: String +ativo: boolean +senha: int +autentica (senha: int): boolean
  • 15.
    Sobrescrita (ou Reescrita)de Método Ocorre quando uma sobclasse define um método idêntico(*) a um método de sua superclasse Utilizado quando o comportamento da superclasse não corresponde ao desejado para o método da subclasse (*) Métodos idênticos possuem o mesmo nome, tipo de retorno e lista de parâmetros
  • 16.
    Exemplo de Sobrescritaclass Produto { int cod; String desc; protected double preço; void setPreço(double preço) { this.preço = preço; } void aumenta (double valor){ preço = preço + valor; } double getPreço() { return preço; } } Segue...
  • 17.
    class Importado extendsProduto { int codImportação; void setPreço(double preço) { this.preço = preço * 1.7; } }
  • 18.
    class TestaProduto {public static void main (String [ ] args) { Produto prod1= new Produto ( ); prod1.cod = 123; prod1.desc = &quot;Borracha&quot;; prod1.setPreço(2.5); prod1.aumenta(0.5); System.out.println(prod1.desc + &quot; preço = &quot; + prod1.getPreço()); Importado prod2 = new Importado(); prod2.cod = 456; prod2.desc = &quot;Lápis&quot;; prod2.codImportação = 12345; prod2.setPreço(3); prod2.aumenta(1); System.out.println(prod2.desc + &quot; preço = &quot; + prod2.getPreço()); } } Sem o Método setPreço na classe Importado , o valor exibido para o produto 2 seria 4 e não 6.1 Segue...
  • 19.
    Sobrecarga Sobrecarregar ummétodo ou um construtor significa prover mais de uma versão desse mesmo Método (ou Construtor). As versões devem, necessariamente, possuir listas de parâmetros diferentes, seja no tipo ou no número desses parâmetros (o tipo do valor de retorno pode ser igual).
  • 20.
    Exemplo de Sobrecargade um Construtor class Produto { int cod; String desc; Produto (String desc, int cod) { this.cod = cod; this.desc = desc; } Produto (int cod, String desc) { this.cod = cod; this.desc = desc; } Produto (int cod) { this.cod = cod; desc = &quot;descrição padrão&quot;; } Produto (String desc) { this.cod = 999; this.desc = desc; } Produto () { this.cod = 999; this.desc = &quot;descrição padrão&quot;; } } Segue...
  • 21.
    class TestaSobrecarga {public static void main (String [ ] args) { Produto prod1= new Produto (&quot;produto 1&quot;, 1111 ); System.out.println(prod1.desc + &quot; &quot; + prod1.cod); Produto prod2= new Produto ( 2222, &quot;produto 2&quot;); System.out.println(prod2.desc + &quot; &quot; + prod2.cod); Produto prod3= new Produto (3333 ); System.out.println(prod3.desc + &quot; &quot; + prod3.cod); Produto prod4= new Produto (&quot;produto 4&quot;); System.out.println(prod4.desc + &quot; &quot; + prod4.cod); Produto prod5= new Produto ( ); System.out.println(prod5.desc + &quot; &quot; + prod5.cod); } }
  • 22.
    Exemplo de Sobrecargade um Método class Produto { int cod; String desc; Produto (String desc, int cod) { this.cod = cod; this.desc = desc; } String getInfo () { String resposta = &quot;Produto: &quot; + desc + &quot;, código = &quot; + cod; return resposta; } String getInfo (int n) { String resposta; if (n == 1 ) { resposta = &quot;Product name: &quot; + desc + &quot;, code = &quot; + cod; } else { resposta = &quot;Product code: &quot; + cod + &quot;, name = &quot; + desc; } return resposta; } } Segue...
  • 23.
    class TestaSobrecarga {public static void main (String [ ] args) { Produto prod= new Produto (&quot;tijolo&quot;, 1111 ); String texto; texto = prod.getInfo(); System.out.println(texto); texto = prod.getInfo(1); System.out.println(texto); texto = prod.getInfo(2); System.out.println(texto); } }
  • 24.
    Polimorfismo É quandoexistem várias formas de um método ser ativado. As mais usuais são: Polimorfismo por herança - Quando ocorre a sobreposição de um método de uma subclasse em cima do método da superclasse. Polimorfismo por Sobrecarga - Quando em uma classe, um mesmo método (de mesmo nome) pode ser chamado de várias maneiras diferentes, onde a diferença está na quantidade e no tipo de parâmetros passados.
  • 25.
    Faça a modelagemem um diagrama UML. Criar, em Java, as classes Produto, Alimento e o programa Atividade2 de acordo com o especificado abaixo: Um produto tem os seguintes atributos: código, descrição, setor e preço. Significado de setor: 1 = alimento, 2 = higiene e 3 = roupas. Esses atributos não podem ser acessados diretamente pelo programa Atividade2.   Um Alimento é um produto, com a diferença que ele tem um atributo a mais, que é o código da vigilância sanitária.   Um produto pode ser criado passando-se todos os atributos, ou omitindo-se o atributo de setor, e nesse caso assume-se setor 3 (roupas).   Atividade 2
  • 26.
    Para criar-se umalimento, é necessário passar todos os atributos, exceto o setor, que será assumido como 1.   Os produtos tem um valor de ICMS de 15%, porém para alimentos deve-se calcular 10% para alimentos nacionais ou 20% para alimentos importados. Os alimentos nacionais são aqueles cujo código de Vigilância começa com “55”.   OBS: Não há necessidade,nesta atividade, de validar os valores dos atributos. Assumiremos que os atributos para os Construtores serão sempre válidos. O programa Atividade2 deve criar vários produtos para cobrir todas as possibilidades do enunciado
  • 27.
    Faça a modelagemem um diagrama UML. Criar, em Java, algumas classes relacionadas, aplicando os conceitos de encapsulamento, herança, sobrecarga e reescrita. Atividade 3
  • 28.
    Referências Orientação aobjetos. Disponível em <http : //www.softechnetwork.com.br/java/CursoOO.pdf >. Acesso em :11 mar. 2011. Java e Orientação a Objetos. Disponível em <www. caelum.com.br> Acesso em 15 fev. 2009. RUMBAUGH, James et al. Modelagem e Projetos baseados e Objetos. Rio de Janeiro: Campus, 1997.

Notas do Editor

  • #2 Introdução à Análise Orientada a Objetos Parte 2
  • #3 Introdução à Análise Orientada a Objetos Parte 2
  • #4 Introdução à Análise Orientada a Objetos Parte 2
  • #5 Introdução à Análise Orientada a Objetos Parte 2
  • #6 Introdução à Análise Orientada a Objetos Parte 2
  • #7 Introdução à Análise Orientada a Objetos Parte 2
  • #8 Introdução à Análise Orientada a Objetos Parte 2
  • #9 Introdução à Análise Orientada a Objetos Parte 2
  • #10 Introdução à Análise Orientada a Objetos Parte 2
  • #11 Introdução à Análise Orientada a Objetos Parte 2
  • #12 Introdução à Análise Orientada a Objetos Parte 2
  • #13 Introdução à Análise Orientada a Objetos Parte 2
  • #14 Introdução à Análise Orientada a Objetos Parte 2
  • #15 Introdução à Análise Orientada a Objetos Parte 2
  • #16 Introdução à Análise Orientada a Objetos Parte 2
  • #17 Introdução à Análise Orientada a Objetos Parte 2
  • #18 Introdução à Análise Orientada a Objetos Parte 2
  • #19 Introdução à Análise Orientada a Objetos Parte 2
  • #20 Introdução à Análise Orientada a Objetos Parte 2
  • #21 Introdução à Análise Orientada a Objetos Parte 2
  • #22 Introdução à Análise Orientada a Objetos Parte 2
  • #23 Introdução à Análise Orientada a Objetos Parte 2
  • #24 Introdução à Análise Orientada a Objetos Parte 2
  • #25 Introdução à Análise Orientada a Objetos Parte 2
  • #26 Introdução à Análise Orientada a Objetos Parte 2
  • #27 Introdução à Análise Orientada a Objetos Parte 2
  • #28 Introdução à Análise Orientada a Objetos Parte 2
  • #29 Introdução à Análise Orientada a Objetos Parte 2