• Nenhum resultado encontrado

Introdução linguagem Java principais pacotes. Bruno Calegaro

N/A
N/A
Protected

Academic year: 2021

Share "Introdução linguagem Java principais pacotes. Bruno Calegaro"

Copied!
60
0
0

Texto

(1)

Introdução a linguagem Java e principais pacotes

Bruno Calegaro

(2)

O que é o Java ?

• “O Java é uma linguagem de programação de

propósito geral, concorrente, com base em classes

e orientada a objetos. Foi projetada para ser

simples o bastante para que a maioria dos

programadores se torne fluente com ela. A

linguagem Java tem relação com C e C++, mas é

organizada de maneira diferente, com vários

aspectos de C e C++ omitidos e algumas ideias de

outras linguagens incluídas.” (Gosling et al., 2000,

pág. 1)

(3)

Pequeno Histórico (1/4)

• 1991, projeto Green da Sun Microsystem, criou uma nova geração de computadores portáteis inteligentes, capazes de se comunicar de várias maneiras, ampliando suas potencialidades de uso.

• Para tanto, decidiu-se criar também uma nova

plataforma para desenvolvimento desses equipamentos,

de forma que seu software pudesse ser portado para os

mais diferentes tipos de equipamentos (tecnologia para

aplicativos embutidos em dispositivos).

(4)

Pequeno Histórico (2/4)

James Gosling, criação de uma nova linguagem de programação: simples, portátil e fácil de programar (Oak, carvalho, em inglês).

• Devido a problemas de copyright, o Oak recebe o nome

Java, mas continua sem uso definido até 1994, quando,

estimulados pelo grande crescimento da Internet, Patrick

Naughton e Jonathan Payne desenvolveram o programa

navegador WebRunner (HotJava), capaz de efetuar o

download e a execução de código Java via Internet.

(5)

Pequeno Histórico (3/4)

• Maio de 1995, apresentação formal pela Sun, no SunWorld’95, quando o interesse pela solução mostrou- se explosivo.

• No início de 1996, a Netscape Corp. lança a versão 2.0 de seu navegador, que incorpora as capacidades de efetuar o download e realizar a execução de pequenas aplicações Java, então chamadas de applets.

• Sun decide disponibilizar um conjunto de ferramentas de

desenvolvimento Java (JDK) “gratuitamente” para a

comunidade de software.

(6)

Pequeno Histórico (4/4)

• Em meados de 1996, Java Devoloper’s Kit 1.02 (JDK 1.02), versão mais difundida.

• Em 1997, torna-se disponível o JDK 1.1, que inclui grandes melhorias para o desenvolvimento de aplicações gráficas e distribuídas.

• No final de 1998, uma grande série de adições, melhorias e correções são incorporadas ao kit, iniciando o que a Sun denomina oficialmente família Java 2. Neste ponto, o JDK passa a ser denominado de Java 2 SDK (Software Developer’s Kit).

• Atualmente, a JDK encontra-se na 8 versão.

(7)

Linguagem Java

• Linguagem de programação orientada a objetos

Familiar (sintaxe parecida com C)

Simples e robusta (minimiza bugs, aumenta produtividade) – Suporte nativo a threads (+ simples, maior portabilidade) – Dinâmica (módulos, acoplamento em tempo de execução) – Com coleta de lixo (menos bugs, mais produtividade)

Independente de plataforma

Segura (vários mecanismos para controlar segurança)

– Código intermediário de máquina virtual interpretado (compilação rápida - + produtividade no desenvolvimento)

– Sintaxe uniforme, rigorosa quanto a tipos (código mais simples, menos diferenças em funcionalidades iguais)

(8)

Características importantes

• Orientada a objetos

• Independente de plataforma

• Sem ponteiros

• Permite multithreading

• Segura

• Robusta

• Simples

(9)

Java é Orientada a Objetos

• Java é uma linguagem puramente orientada a objetos, pois, com exceção de seus tipos primitivos de dados (número, caractere e booleano), tudo em Java são classes ou instâncias (objetos) de uma classe.

• Atende a todos os requisitos necessários para uma linguagem ser considerada orientada a objetos:

– oferecer mecanismos de abstração – encapsulamento

herança

(10)

Java é Independente de Plataforma

• Programas Java não são compilados para uma plataforma de hardware específica, mas, sim, para uma forma intermediária de código (bytecodes) destinada à máquina virtual Java, denominada JVM (Java Virtual Machine).

• A JVM é, na verdade, um interpretador de bytecodes

para a plataforma na qual eles são executados. Por ser

possível implementar uma JVM para qualquer

plataforma, um mesmo programa Java pode ser

executado em qualquer arquitetura que disponha de

uma JVM.

(11)

Máquina Virtual Java

• JVM – Java Virtual Machine

Bytecode não é código de máquina, e sim um padrão binário (consiste de 1’s e 0’s) que não é “específico” para um processador.

• A Especificação define Máquina Virtual Java como:

– Máquina imaginária que é implementada através de sua emulação em um software contido em uma máquina real.

O código da Máquina Virtual Java é armazenado nos

arquivos .class, que contém o código de, no máximo, uma

classe pública.

(12)

Máquina Virtual Java

Ambiente de Execução

Código Java (*.java) Compilador

(javac) Bytecode Java

(*.class)

VM Windows

SO Windows

VM Linux

SO Linux

VM Celular

SO Celular

Distribuição

Ambiente de

Desenvolvimento

(13)

Java não possui ponteiros

• Java não permite a manipulação direta de endereços de memória nem exige que os objetos criados sejam explicitamente destruídos, livrando os programadores de uma tarefa complexa.

• Toda a manipulação de variáveis e objetos se dá por

intermédio de referências. Além disso, a JVM possui

um mecanismo automático de gerenciamento de

memória, conhecido como automatic garbage

collector, que recupera a memória alocada para

objetos não mais referenciados pelo programa.

(14)

Java permite multithreading

• Java oferece recursos para o desenvolvimento de aplicações capazes de executar múltiplas rotinas concorrentemente, possibilitando sua sincronização.

Cada uma dessas rotinas é como um fluxo de execução independente, usualmente denominado thread.

• Exemplo, um web browser pode estar emitindo o

som de um clip, enquanto estiver fazendo scrolling

de uma página e ainda carregando uma imagem em

background.

(15)

Java é seguro

• Considerando a possibilidade de que as aplicações possam ser obtidas através de uma rede, a linguagem Java possui mecanismos de segurança que podem, no caso de applet, evitar, por exemplo, qualquer operação no sistema de arquivos da máquina-alvo, minimizando problemas de segurança.

• Tal mecanismo é flexível o suficiente para determinar

se uma applet é considerada segura, especificando

nesta situação diferentes níveis de acesso ao

sistema-alvo.

(16)

Java é robusto = Código confiável

• Java não aceita o acesso direto aos ponteiros de memória o que evita muitos problemas de memória comuns em linguagens, tais como C e C++.

• Executa verificações enquanto a applet está sendo executada, para se certificar de que todas as referências de arrays e de strings estejam dentro dos intervalos de cada item.

• Fortemente tipada: o compilador faz verificações para evitar potenciais erros de incompatibilidade.

• Garbage collection automática evita erros de uso de

memória.

(17)

Tratamento de Exceções

• Java institui um método de detecção de erros conhecido com “tratamento de exceções”.

• objetivo  tratar erros de software ou hardware

• como  separando o código de tratamento de erros do código normal da aplicação

• Em tempo de execução, o Java levanta exceções

quando alguma coisa sai errada e o código da

aplicação, se escrito adequadamente, poderá

solucionar.

(18)

Java é fácil de aprender

• Pequeno número de construções de linguagem.

• Familiar para os programadores C e C++.

• Elimina algumas das construções mais complicadas:

– desvio incondicional (goto) – herança múltipla

– ponteiros

• Grande número de APIs (Application Programming

Interfaces) para o desenvolvimento de aplicações

específicas.

(19)

Tecnologia Java

Java Platform, Standard Edition (Java SE)

– é a versão básica, destinada ao desenvolvimento da maior parte das aplicações de desktop e estações de trabalho.

Java Platform, Enterprise Edition (Java EE)

– plataforma java para desenvolvimento e execução de aplicações servidoras, possui suporte para desenvolver aplicações robustas e escaláveis, para suportar grandes números de usuários.

Java Platform, Micro Edition (Java ME)

– plataforma voltada para pequenos devices (telefones celulares,

televisores, aparelhos eletrônicos em geral)

(20)

Tecnologia Java

(21)

Ambiente de execução e desenvolvimento

Java Development Kit (JDK)

• Coleção de ferramentas de linha de comando para, entre outras tarefas, compilar, executar e depurar aplicações Java

Java Runtime Environment (JRE)

• Tudo o que é necessário para executar aplicações Java

(22)

Ambiente de Desenvolvimento Java

• Java Platform, Standard Edition (Java SE):

http://java.sun.com/javase

• Editor de textos ASCII simples, tal como o “Bloco de Notas” de qualquer versão do Microsoft Windows.

• IDEs voltadas para a programação Java tais como:

BlueJ, Gel, Eclipse, JCreator e Netbeans; também são

alternativas para o desenvolvimento de aplicações

Java.

(23)

Kit de Desenvolvimento Java

• O kit é composto de quatro partes básicas:

– Um conjunto de ferramentas para desenvolvimento de aplicações Java.

– Uma extensa biblioteca de classes padronizadas Java, denominada “Java Standard API”.

– Um ambiente de execução Java (JRE- Java Runtime Environment).

– Exemplos, código-fonte das porções públicas e a

documentação das APIs.

(24)

Programa para geração de documentação (javadoc).

Compilador para linguagem Java (javac).

Máquina virtual Java (java).

Utilitário para criar e manter arquivos compactados Java ARchive (jar). Java ARchive e é o formato criado pela Sun

Microsystems para distribuir aplicações e bibliotecas na plataforma Java

Visualizador de applets (appletviewer).

As principais ferramentas incluídas no kit JavaSE são:

(25)

Ambientes visuais de desenvolvimento Java

Eclipse

http://www.eclipse.org

Netbeans

http://netbeans.org/downloads/index.html

Visual J# .Net ©Microsoft

http://msdn2.microsoft.com/en-us/vjsharp/default.aspx

JBuilder ©Borland

http://www.codegear.com/products/jbuilder

VisualAge Generator for Java ©IBM

http://www-306.ibm.com/software/awdtools/visgen/support/

IntelliJ IDEA

http://www.jetbrains.com/idea/

Oracle JDeveloper

http://www.oracle.com/technology/products/jdev/index.html

(26)

Aplicativos e Miniaplicativos (applet) Classes e API Java

Java Virtual Machine (JVM)

Adaptador Adaptador

Sistema Operacional Sistema Java

Operacional

Hardware Hardware Hardware

Browse Sistema Operacional

Rigorosamente falando, a plataforma Java é constituída apenas de suas classes e API específicas, juntamente com a JVM. A plataforma Java pode ser adaptada para hardware específico de três formas:

(a)por meio de um adaptador específico para cada sistema operacional/hardware específico;

(b)por meio de um adaptador específico para cada browse específico;

(c)Sendo integrada a um sitema operacional nativo Java que opere para um certo hardware.

(a) (b) (c)

O ambiente Java

(27)

A Criação de Aplicações Java – 1 ° Passo

Editor ASCII

Arquivo .java

O “primeiro passo” consiste da edição do programa por meio de um editor de textos capaz de salvar arquivos no formato ASCII (por exemplo, o bloco de notas (Notepad) do Microsoft Windows).

Após a edição de qualquer programa Java, os arquivos devem, obrigatoriamente ser salvos com a extensão .java. Tais arquivos de programa são chamados de arquivos-fonte de programa ou apenas arquivos-fonte.

(28)

A Criação de Aplicações Java – 2 ° Passo

Editor ASCII

Arquivo .java

Compilador Java (javac)

Arquivo .class

O “segundo passo” é a compilação do programa, que deve ser feita pelo programa javac fornecido com o Kit. Não encontrando erros, o compilador javac transformará o arquivo-fonte em um ou mais arquivos de extensão .class. Cada arquivo .class contém bytecodes, formato intermediário da plataforma Java, equivalentes do programa editado. Existindo erros, os mesmos devem ser localizados e corrigidos, repetindo-se, para isso, os passos 1 e 2.

(29)

A Criação de Aplicações Java – 3 ° Passo

Editor ASCII

Arquivo .java

Compilador Java (javac)

Arquivo .class

Máquina Virtual Java (java)

Depois de compilado sem erros, o programa Java pode ser executado, o que corresponde ao último passo da seqüência de criação de programas. No caso de aplicações Java, acionamos o programa java, que corresponde à máquina virtual que interpretará os bytecodes, informando apenas o nome do arquivo .classque desejamos executar.

No caso de miniaplicativos (applet), deve-se utilizar o programa appletviewer, informando o nome do arquivo HTML que incorpora oapplet.

(30)

Método main()

public static void main(String args[])

main() é um método público (public)

static – uma keyword que informa ao compilador que o

método main() pode ser utilizado no contexto da classe, não exigindo uma instância para sua execução.

void – indica que o método main() não retorna nada. Isso é importante porque a linguagem Java executa uma verificação de tipos cuidadosa, que inclui verificar se os métodos

chamados retornam os tipos com os quais foram declarados.

String args[] – declaração de um array de strings. Estes são os argumentos digitados na linha e comandos após o nome da classe:

java AloMundo arg1 arg2 ...

(31)

Método main()

• Uma aplicação Java pode conter várias classes:

– cada classe pública dá origem a um arquivo *.class

– uma delas deverá conter o método main() que representa o ponto inicial da execução da aplicação.

• Outras linguagens de programação, especialmente C e

C++ também utilizam a declaração main() como o ponto

inicial da execução de uma aplicação.

(32)

Tipos de Dados

•Java possui os mesmos tipos primitivos de qualquer linguagem de programação

boolean char

byte

short

int

long

float

double

(33)

Tipos de Dados

•Java possui conversão automática de tipos:

• Um byte pode ser convertido em um int short, int, long, float ou double

•Um short pode ser convertido em um int, long, float ou double

• Um char pode ser convertido em um int, long, float ou double

•Um int pode ser convertido em um long, float ou double

• Um long pode ser convertido em um float ou double

• Um float pode ser convertido em um double

(34)

Tipos de Dados

(35)

Operadores

•Existem diversos operadores na linguagem Java

•Operadores aritméticos

•+,-,*,/,^

•Operadores lógicos

•|, &&, ||, ?:

•Operadores condicional

• ==, !=, !, <=, <, >=, >

•Operador de atribuição

=

•Operadores delimitadores

., []

(36)

Controle de Fluxo

•O controle de fluxo é efetuado através do uso de condicionais, que são estruturas que modificam o fluxo de execução normal do programa.

•if-else

•while e do-while

• for

•break e continue

• switch

(37)

Palavras Reservadas

•Palavras reservadas ou keywords são nomes especiais para representar algum comportamento para a linguagem

•Familiarizados com o C notarão em Java a existência de algumas novas palavras. Entre elas:

•abstract

• interface

•class

• extends

•implements

• import

•new

• static

•public

• private

•protected

(38)

Entrada de Dados

• Em Java podemos receber a entrada de dados de duas formas:

1. Linha de comando

• Um dois modos é utilizar a classe Scanner

2. Interface gráfica

• Utilizando a classe JOptionPane através dos métodos

showConfirmDialog showInputDialog

showMessageDialog

showOptionDialog

(39)

Pacotes em Java

O que são pacotes?

Um pacote (package) em Java é um diretório em que está armazenada uma ou mais classes

Para usar uma classe de um pacote se usa a palavra reservada import

Exemplo:

import java.util.Vector import java.util.*

A diferença do primeiro comando pelo segundo é que podemos utilizar uma classe específica (Date) no primeiro

No segundo caso o * significa que podemos utilizar todas as

classes que estiverem no pacote

(40)

O pacote java.lang

Por padrão o pacote java.lang é importado automaticamente pelo Java

Nele estão as classes que representam os tipos primitivos:

 Integer, Float, Boolean, Byte, Caracter, String, Math, Object, System, Thread, entre outros

 Strings em Java são representadas pela classe java.lang.String

 Na classe das strings existem diversos métodos que

podem manipulá-las de diversas maneiras

(41)

Classes Wrapper

São as classes que representam os tipos primitivos:

Integer, Double, Byte, etc

Essas classes contém diversos métodos para manipular os respecitos tipos

Suas funções mais utilizadas são:

parseInt(), parseDouble(), etc

toString()

(42)

O pacote java.util

Nesse pacote existem uma série de classes úteis

Uma exemplo é a classe ArrayList e Vector , para

lidar com listas, as classes Formatter , Scanner ,

Stack, Timer , entre outras.

(43)

Coleções

• Coleções (estruturas de dados) são encontradas em qualquer linguagem de programação e em Java as coleções recebem um tratamento especial

• O framework “Collections” surgiu com a intenção de formar uma arquitetura unificada para representação e manipulação de

coleções.

• Esse framework é o conjunto de implementações (classes e

interfaces) oferecidas no pacote java.util que fornecem as principais funcionalidades esperadas quando trabalha-se com conjuntos de elementos (coleções).

(44)

Coleções

O uso de coleções facilitam a vida do programador do Java porque diferente de outras linguagens como o C, ele já conta todas

funcionalidades implementadas, ou seja, o programado não precisa fazer a sua própria Lista, Fila ou Árvore.

Ao utilizarmos as coleções já implementadas obtemos os seguintes benefícios:

Redução na codificação: Muitas funcionalidades esperadas durante a manipulação de um conjunto de elementos já estão prontas;

Melhor desempenho do programa: As implementações das uncionalidades e estruturas de armazenamento foram feitas com o objetivo de fornecerem um desempenho ótimo;

Maior qualidade do programa: Respeitando as interfaces podemos substituir as implementações utilizadas sem prejuízo ao resto doprograma;

(45)

Coleções

• Arquitetura:

(46)

Coleções

• Nesta figura temos as interfaces (raízes e nós das árvores) que

formam o conjunto de interfaces disponíveis. Nas folhas (retângulos com bordas mais espessas) encontramos as classes concretas ou implementações destas interfaces.

• Esta arquitetura de interfaces forma o núcleo do Java

Framework Collections e todas as classes concretas irão derivar de uma ou mais interfaces.

• É interessante notar que apesar da “arquitetura única” as

coleções derivadas da interface Map não implementam a interface Collection no entanto elas também fazem parte do pacote de

implementações Java para coleções.

• A figura apresentada pode ser interpretada da seguinte forma:

“Um Set, List ou Queue é um tipo de Collection, cada um com suas particularidades. Já um Map não é do mesmo tipo dos demais mas também manipula coleções de elementos”

(47)

Coleções

Set: Representa uma coleção que não pode conter duplicatas, implementa uma abstração dos conjuntos matemáticos;

List: Representa uma coleção ordenada (ordem de inserção) e que permite duplicatas;

Queue: Parecida com a interface List porém adiciona algumas funcionalidades, é muito utilizada para representar listas de elementos cuja ordem é importante, normalmente elementos em ordem de processamento;

Map: É um objeto que armazena um elemento e o remove através da sua chave, os Maps não aceitam chaves duplicadas.

(48)

Coleções

Algumas definições:

• Ordenação: Define que a coleção possui algum tipo de ordem determinada por regra(s).

– Ex: Crescente, decrescente, prioridade e etc.

• Organização: Garante que a coleção sempre é percorrida em uma determinada seqüência não aleatória.

– Ex: Ordem de inserção, índice e etc.

(49)

List

• A interface List garante que todas as suas

implementações serão organizadas, isto é, a ordem de inserção será mantida e são permitidas

duplicatas, isto é, objetos iguais de acordo com o método equals().

• Ao contrário do Set, qualquer implementação da

interface List mantém seus elementos indexados, ou seja, existe uma preocupação com o

posicionamento de cada elemento e esta posição é determinada pelo índice.

• Devemos utilizar um List quando a ordem de

inserção ou a posição na coleção nos interessa

(50)

List

• Alguns métodos importantes quando manipulamos

Lists:

(51)

ArrayList e Vector

• Um ArrayList pode ser visto como um vetor (array) porém dinâmico, isto é, ele aumenta o espaço disponível a medida que é

demandado. Ele é organizado pelo índice, ou seja, temos alguma garantia quanto a ordem que encontraremos os elementos.

• Vector é basicamente um ArrayList, no entanto seus métodos são sincronizados o que significa que o acesso por vários processos simultaneamente é coordenado.

• Antes de continuarmos falando das implementações da interface List, iremos introduzir uma nova característica da

linguagem Java e mostrar trechos de códigos que a utilizam junto com ArrayList e Vector:

– Generics: É uma funcionalidade introduzida a partir da versão 1.5 do Java. Em relação as coleções sua principal

característica é definir o tipo aceito pela coleção;

(52)

ArrayList e Vector

• Até agora as nossas coleções aceitavam qualquer tipo de elemento, desde que fosse um Object, por exemplo, abaixo temos um ArrayList onde adicionamos uma String e um

Integer:

• Isto era possível pois nossas coleções aceitam qualquer

elemento que seja do tipo Object, e todas as classes criadas

em Java automaticamente herdam, e portanto são, da classe

Object.

(53)

ArrayList e Vector

• No entanto, com o uso de Generics podemos definir de que tipo específico será a nossa coleção. Abaixo temos um exemplo de ArrayList, parecido com o anterior, utilizando Generics:

• Perceba que a partir de agora este List aceita apenas objetos do tipo Integer utilizando esta notação, declaração <Integer>

junto a declaração da Classe/Interface, evito que sejam inseridos indevidamente outros tipos que não sejam Integer na minha

coleção

(54)

A classe Collections

• Da mesma forma que para vetores, Java fornece uma classe com um conjunto de funcionalidades muito utilizadas

(ordenação, pesquisa, preenchimento e etc.) na manipulação das estruturas de dados do Framework Collections também existe uma classe similar

• Algumas funcionalidades úteis:

Ordenação

Mistura/ Desordenação Pesquisa

Entre outras: reverse, fill, swap, addAll, frequency, disjoint.

(55)

A classe Collections

Ordenação

– O algoritmo de ordenação implementado na classe Collections ordena os elementos em ordem ascendente.

(56)

A classe Collections

Mistura/Desordenação

– Este algoritmo é o oposto ao anterior, ao invés de ordenar ele desordena (mistura) os elementos dentro de um List. A primeira vista pode parecer pouco útil, mas existem situações onde você irá querer desordenar sua estrutura de dados para obter um elemento aleatoriamente.

– Por exemplo, abaixo temos uma possível implementação para a modalidade de sorteio cujos nomes dos elementos a serem

sorteados, normalmente pessoas, são escritos em pequenos pedaços de papéis e o primeiro a ser escolhido é o vencedor.

(57)

A classe Collections

Mistura/Desordenação

(58)

A classe Collections

Pesquisa

Quando falamos em estruturas de dados obrigatoriamente devemos pensar em algoritmos de ordenação e pesquisa, pois, de que adianta uma estrutura de dados cujos elementos não conseguimos localizar?

Ao manipularmos estruturas de dados sempre devemos ter em mente que iremos ordená-las ou pesquisá-las.

Por isto a importância deste algoritmo. A pesquisa efetuada pela Classe Collections retorna um número inteiro positivo ou zero se o elemento for encontrado e negativo se o elemento não existe na

coleção. Quando o elemento existe na coleção o número representa o seu índice (posição), por outro lado, quando o elemento não

existe, o número, em módulo, representa a posição que ele deveria estar (ponto de inserção), neste caso, esta posição somente é válida se a coleção estiver ordenada antes da pesquisa.

(59)

A classe Collections

Pesquisa

(60)

Referência

•Curso Java Starter

Disponível gratuitamente em:

http://t2ti.com/curso/video/java/basico/java_starter.php

• Programação em Java – Uma introdução Abrangente

• Shildt, H., Skrien, D

• Programação com Java

• Hubbard. H

Referências

Documentos relacionados

David Stephen Gee; (ii) a ratificação do &#34;projeto ônibus movido à cédula de hidrogênio&#34;; (iii) a ratificação do estabelecimento de um programa de distribuição de valores

5x2.5mm2. Isporuka i montaža OG razvodnih dozni 80x80mm.. Технички Факултет ''Михајло Пупин | Конкурсна документација за ЈН_01_ППБОП_2016 9 од 43 IV

O que esta função faz é varrer todas as interfaces de rede do computador, verificar quais são USB/SAT, verificar qual tem o MAC compatível com o número de série fornecido e

O Programa de Educação Tutorial “PET/Conexões de Saberes – ACESSO” da Universidade Federal do Rio de Janeiro aprovado pelo Edital PET/MEC nº 11 de 10 de janeiro de

Mathes and Nahai 20 con- ducted a detailed study of the vascular anatomy of the muscles, where the blood configuration model of the muscle determines how safe it is to

Os traficantes exploram justamente esse impulso, ajudados pelo crescimento econômico dos países, que fez surgir mercados de trabalho até então inexistentes e muitas vezes

E finalizando precisamos ser ministrados nesta direção para alcançarmos esta libertação na mente e finalmente poderemos não somente compreender como também ver os mistérios do