Conceitos Avançados da Linguagem de Programação Java · Programação Java. Encapsulamento...

Post on 01-Dec-2018

242 views 1 download

Transcript of Conceitos Avançados da Linguagem de Programação Java · Programação Java. Encapsulamento...

Prof. Gilberto B. OliveiraProf. Gilberto B. Oliveira

Análise de ProgramaçãoAnálise de Programação

Conceitos Avançados da Linguagem de Conceitos Avançados da Linguagem de Programação JavaProgramação Java

EncapsulamentoEncapsulamento

Proteger o dado dentro de uma classe (capsula Proteger o dado dentro de uma classe (capsula segura)segura)Facilita o uso da classe por outros programadoresFacilita o uso da classe por outros programadoresProtege certos dados contra alterações indevidasProtege certos dados contra alterações indevidas

Modificadores mais comuns aplicados a Modificadores mais comuns aplicados a métodos e atributos:métodos e atributos:publicpublic

Qualquer classe de qualquer lugar pode acessar;Qualquer classe de qualquer lugar pode acessar;

privateprivateNinguém pode acessar, exceto a própria classe.Ninguém pode acessar, exceto a própria classe.

ModificadoresModificadores

Modificador Classe Pacote Sub Classe Livreprivate Xdefault X Xprotected X X Xpublic X X X X

Interface:Interface:Métodos e variáveis públicasMétodos e variáveis públicas

ImplementaçãoImplementaçãoManeira como a classe executa uma operaçãoManeira como a classe executa uma operação

““Boas práticas de POO permitem alterar a implementação Boas práticas de POO permitem alterar a implementação sem alterar a interface das classes.”sem alterar a interface das classes.”

Métodos get e setMétodos get e set

A implementação de métodos usados para A implementação de métodos usados para proteger atributos privados é comum em POOproteger atributos privados é comum em POO

Método get()Método get()Permite criar uma saída mais adequada ao dado Permite criar uma saída mais adequada ao dado

armazenado.armazenado.

Método set(tipo arg)Método set(tipo arg)Permite controlar de maneira mais eficaz o dado a Permite controlar de maneira mais eficaz o dado a

ser armazenado no atributo antes de atribuí-loser armazenado no atributo antes de atribuí-lo

Implementação de classe Implementação de classe não encapsulada não encapsulada

Classe Funcionário:Classe Funcionário:public class Funcionario {public class Funcionario {

public String nome;public String nome;

public double salario;public double salario;

public void identificarFuncionario(){public void identificarFuncionario(){

System.out.println("Nome: " + nome);System.out.println("Nome: " + nome);

System.out.println("Salário: " + salario);System.out.println("Salário: " + salario);

}}

}}

Quebrando as regras de Quebrando as regras de negócionegócio

Sem o encapsulamento outra classe acessa o Sem o encapsulamento outra classe acessa o salário da classe funcionário e atribui um salário da classe funcionário e atribui um salário menor do que o salário mínimo atual no salário menor do que o salário mínimo atual no Brasil:Brasil:

public class TesteFuncionario {public class TesteFuncionario {

public static void main(String[] args){public static void main(String[] args){Funcionario f1 = new Funcionario();Funcionario f1 = new Funcionario();f1.salario = 450.00;f1.salario = 450.00;

}}

}}

Método GetMétodo Get

O método get gera uma saída mais inteligível para O método get gera uma saída mais inteligível para o usuário:o usuário:

..

. .

public public StringString getNome(){ getNome(){

if(this.nome.charAt(this.nome.length() - 1) == 'a'){if(this.nome.charAt(this.nome.length() - 1) == 'a'){

return "Sra. " + this.nome;return "Sra. " + this.nome;

} else {} else {

return "Sr. " + this.nome;return "Sr. " + this.nome;

}}

}}

..

..

Método Set(arg)Método Set(arg)

O método set permite um tratamento mais eficaz:O método set permite um tratamento mais eficaz:..

. .

public public voidvoid setSalario( setSalario(double salariodouble salario){){

if(salario < 510){if(salario < 510){

System.out.println(“Salário inapropriado!”);System.out.println(“Salário inapropriado!”);

} else {} else {

this.salariothis.salario == salario; salario;

}}

}}

..

..

Método ConstrutorMétodo Construtor

São invocados automaticamente ao instanciar São invocados automaticamente ao instanciar objetos;objetos;

Normalmente são usados para inicializar atributos. Normalmente são usados para inicializar atributos. Sintaxe:Sintaxe:

[modificador] class NomeClasse {[modificador] class NomeClasse {

[modificador] NomeClasse([modificador] NomeClasse([argumentos][argumentos]){){

bloco_codigo;bloco_codigo;

}}

}}

Exemplo:Exemplo:

Método construtor simples:Método construtor simples:..

..

public Funcionario() {public Funcionario() {

this.setNome("Funcionario");this.setNome("Funcionario");

this.setSalario(510.0);this.setSalario(510.0);

}}

..

O método construtor pode ser sobrecarregado O método construtor pode ser sobrecarregado permitindo a inicialização de várias formas.permitindo a inicialização de várias formas.

Exemplo2:Exemplo2:

Método construtor sobrecarregado:Método construtor sobrecarregado: public Funcionario() {public Funcionario() {

this.setNome("Funcionario");this.setNome("Funcionario");

this.setSalario(510.0);this.setSalario(510.0);

}}

public Funcionario(String nome){public Funcionario(String nome){

this.setNome(nome);this.setNome(nome);

this.setSalario(510.0);this.setSalario(510.0);

}}

public Funcionario(double salario){public Funcionario(double salario){

this.setSalario(salario);this.setSalario(salario);

this.setNome("Funcionario");this.setNome("Funcionario");

}}

Declaração de vetores Declaração de vetores de uma dimensãode uma dimensão

Sintaxe:Sintaxe:tipo [] nomeVetor;tipo [] nomeVetor;

Exemplos com tipos primitivos:Exemplos com tipos primitivos:char [] codCor;char [] codCor;

double [] preco;double [] preco;

Exemplos com tipos objetos:Exemplos com tipos objetos:Camisa [] minhaCamisa;Camisa [] minhaCamisa;

Date [] agenda;Date [] agenda;

Instancia de vetores de Instancia de vetores de uma dimensão:uma dimensão:

Sintaxe:Sintaxe:nomeVetor = new tipo [comprimento];nomeVetor = new tipo [comprimento];

Exemplos com tipos primitivos:Exemplos com tipos primitivos:codCor = new char[5];codCor = new char[5];

preco = new double[3];preco = new double[3];

Exemplos com tipos objetos:Exemplos com tipos objetos:minhaCamisa = new Camisa[2];minhaCamisa = new Camisa[2];

agenda = new Date[7];agenda = new Date[7];

Inicializando vetores Inicializando vetores de uma dimensãode uma dimensão

Sintaxe:Sintaxe:nomeVetor[indice] = valor;nomeVetor[indice] = valor;

Exemplo com tipos primitivosExemplo com tipos primitivoscodCor[0] = 'P';codCor[0] = 'P';

codCor[1] = 'V';codCor[1] = 'V';

..

..

..

codCor[4] = 'A';codCor[4] = 'A';

Inicializando vetores Inicializando vetores de uma dimensãode uma dimensão

Exemplo com tipos objeto:Exemplo com tipos objeto:minhaCamisa[0] = new Camisa();minhaCamisa[0] = new Camisa();

..

..

minhaCamisa[1] = new Camisa(“T-Shirt”);minhaCamisa[1] = new Camisa(“T-Shirt”);

Outro exemplo:Outro exemplo:agenda[0] = new Date();agenda[0] = new Date();

agenda[1] = new Date(2010, 05, 18);agenda[1] = new Date(2010, 05, 18);

..

..

agenda[6] = new Date(“2010/11/21”);agenda[6] = new Date(“2010/11/21”);

Declarar, instanciar e Declarar, instanciar e inicializarinicializar

Sintaxe:Sintaxe:tipo [] nomeVetor = {item0, ..., itemN};tipo [] nomeVetor = {item0, ..., itemN};

Exemplo com tipos primitivos:Exemplo com tipos primitivos:double [] preco = {12.5, 13.5, 13.0};double [] preco = {12.5, 13.5, 13.0};

char [] codCor = {'A', 'P', 'V', 'B', 'R'};char [] codCor = {'A', 'P', 'V', 'B', 'R'};

Exemplo com tipos objetos:Exemplo com tipos objetos:Camisa [] minhaCamisa = {new Camisa(), new Camisa [] minhaCamisa = {new Camisa(), new Camisa(“T-Shirt”), new Camisa(“Polo”, 'M')};Camisa(“T-Shirt”), new Camisa(“Polo”, 'M')};

Date [] agenda = {new Date(“2010/07/10”), new Date [] agenda = {new Date(“2010/07/10”), new Date(2010, 03, 21), new Date()};Date(2010, 03, 21), new Date()};

Acessando valores Acessando valores contidos em vetorescontidos em vetores

Inserindo um valor em uma posição do vetor:Inserindo um valor em uma posição do vetor:codCor[3] = 'W';codCor[3] = 'W';

agenda[0] = new Date(“2010/07/30”);agenda[0] = new Date(“2010/07/30”);

preco[2] = 24.5;preco[2] = 24.5;

minhaCamisa = new Camisa(“Social”, 'G');minhaCamisa = new Camisa(“Social”, 'G');

Retirando valores de uma posição do vetor:Retirando valores de uma posição do vetor:Date d = agenda[0];Date d = agenda[0];

char c = codCor[3];char c = codCor[3];

double p = preco[1];double p = preco[1];

Camisa c1 = minhaCamisa[2];Camisa c1 = minhaCamisa[2];

Comportamento da Comportamento da Memória (primitivos)Memória (primitivos)

AleatóriaHeap

char [] codCor = {'P', 'B', 'V'};char tamanho = 'M';

PilhaStack

0@B25X32

M

P

B

V

Comportamento da Comportamento da MemóriaMemória

AleatóriaHeap

Camisa [] suaCamisa = {new Camisa(“Social”), new Camisa('P'), new Camisa(“Polo”, 'M')};

Camisa minhaCamisa = new Camisa();

T-Shirt

B

M

Polo

B

G

PilhaStack

0@B25X32

0@X56622

T-Shirt

P

M

Social

B

M

0@B12345

0@D23456

0@F34567

Atribuição de valores Atribuição de valores através de laçoatravés de laço

Exemplo:Exemplo:int [] meuVetor;int [] meuVetor;

meuVetor = new int[100];meuVetor = new int[100];

for(int i = 0; i < meuVetor.for(int i = 0; i < meuVetor.lengthlength; i++){; i++){

meuVetor[i] = i;meuVetor[i] = i;

}}

Laço for melhoradoLaço for melhorado

ExemploExemplopublic class ExemploFor {public class ExemploFor {

public static void main(String[] args) {public static void main(String[] args) {int [] int [] numnum = {1, 3, 5, 7, 9, 11, 13, 15, = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};17, 19};

int soma = 0;int soma = 0;for(int item : for(int item : numnum) {) {

soma += item;soma += item;}}System.out.println(“Soma: ” + soma);System.out.println(“Soma: ” + soma);

}}

}}

VarargsVarargs

Criação de métodos que recebem uma quantidade Criação de métodos que recebem uma quantidade de argumentos variada.de argumentos variada.public class MensagemVar public class MensagemVar {{

public static void minhaMensagem(public static void minhaMensagem(String... nomeString... nome)){{

for(String lista : nome) for(String lista : nome) {{

System.out.println(lista);System.out.println(lista);

}}

}}

public static void main(String [] args) public static void main(String [] args) {{

minhaMensagem(args);minhaMensagem(args);

}}

}}

Vetores Vetores multidimensionaismultidimensionais

Sintaxe de criação:Sintaxe de criação:tipo [] [] nomeVetor;tipo [] [] nomeVetor;

Exemplo:Exemplo:int [] [] notaBim;int [] [] notaBim;

Sintaxe de instância:Sintaxe de instância:nomeVetor = new int [numVetores] [comp];nomeVetor = new int [numVetores] [comp];

ExemploExemplonotaBim = int[5][4];notaBim = int[5][4];

Exemplo de vetor Exemplo de vetor multidimensionalmultidimensional

1.° Bim 2.° Bim 3.° Bim 4.° BimJoãoJoséMariaJoanaJoaquina

AtribuiçãoAtribuição

Exemplo de atribuição de valores às posições Exemplo de atribuição de valores às posições dos vetores:dos vetores:notaBim[0] [0] = 5;notaBim[0] [0] = 5;

notaBim[0] [1] = 7;notaBim[0] [1] = 7;

notaBim[0] [2] = 9;notaBim[0] [2] = 9;

notaBim[1] [3] = 5;notaBim[1] [3] = 5;

notaBim[2] [2] = 10;notaBim[2] [2] = 10;

notaBim[3] [0] = 7;notaBim[3] [0] = 7;

Atribuição em vetor Atribuição em vetor multidimensionalmultidimensional

1.° Bim 2.° Bim 3.° Bim 4.° BimJoão 5 7 9José 5Maria 10Joana 7Joaquina

Herança (inheritance)Herança (inheritance)

Sintaxe para a criação de subClasses:Sintaxe para a criação de subClasses:[modificado] class NomeSubClasse extends [modificado] class NomeSubClasse extends NomeSuperClasseNomeSuperClasse

Permite criar classes mais especializadas a partir de Permite criar classes mais especializadas a partir de classes generalistas.classes generalistas.

Classes generalistas são superClasses e classes Classes generalistas são superClasses e classes especializadas subClassesespecializadas subClasses

Classes generalistas carregam atributos e métodos Classes generalistas carregam atributos e métodos que são herdados pela(s) subClasse(s)que são herdados pela(s) subClasse(s)Quanto mais abstratas forem as classes de um sistema, Quanto mais abstratas forem as classes de um sistema,

mais abrangente ele será, portanto, melhor construído.mais abrangente ele será, portanto, melhor construído.

Pacotes da API JavaPacotes da API Java

API Application Programming InterfaceAPI Application Programming InterfaceAbstract Windowing Toolkit: Usada para construir Abstract Windowing Toolkit: Usada para construir

e gerenciar uma GUI (Graphic User Interface):e gerenciar uma GUI (Graphic User Interface):java.awt.*;java.awt.*;

Comportamentos específicos de AppletComportamentos específicos de Appletjava.applet.*;java.applet.*;

Permite executar operações relacionadas a redePermite executar operações relacionadas a redejava.net.*;java.net.*;

Pacote com classes utilitárias, permite gerar Pacote com classes utilitárias, permite gerar números randômicos, data e hora, etc.números randômicos, data e hora, etc.java.util.*;java.util.*;

Importando pacotes:Importando pacotes:

Usando uma declaração Usando uma declaração importimport

import java.awt.*;import java.awt.*;

public class MeuBotao extends Button {public class MeuBotao extends Button {

//Implementação da classe//Implementação da classe

}}

Usando o nome qualificador da classe completoUsando o nome qualificador da classe completopublic class MeuBotao extends java.awt.Button {public class MeuBotao extends java.awt.Button {

//implementação da classe//implementação da classe

}}