Jump to content

O Retorno dos Membros VIP Junte-se ao Clube

Obtenha destaque e desfrute os benefícios exclusivos para VIP.
Clique Aqui

Reporte bugs e nos ajude a melhorar!

Nos ajude a descobrir bugs! Além de melhorar a comunidade.
Reporte aqui!

Conheça a Lotérica e arrisque sua sorte!

Descubra o quão sortudo você pode ser.
Saiba mais
Notícia
  • Junte-se ao Clube de membros VIP!
  • Teste sua sorte em nossa loteria e concorra a uma fortuna de webcoins!

opandaG

Silver Member
  • Content Count

    287
  • Joined

  • Last visited

  • Days Won

    5
  • WCoins

    210 [ Donate ]

opandaG last won the day on August 2 2017

opandaG had the most liked content!

Community Reputation

229

2 Followers

About opandaG

  • Rank
    Data Science
  • Birthday 05/12/1995

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Olá, venho aqui oferecer meus serviços, entrega no prazo correto e dentro do orçamento combinado. Desenvolvimento de Aplicações Desktop, web e mobile Cursos de Desenvolvimento, Pentest e Infraestrutura de Servidores Backup em cloud Consultoria em segurança e ataques Consultoria para compra de equipamentos Implantação de boas práticas de governança de TI / Cobit / ISO 27001 / ITIL Virtualização de servidores Suporte, Diagnóstico e Reparação de Servidores
  2. https://www.youtube.com/watch?v=5qgh2mFtl7Y
  3. Obrigado cara, qualquer coisa que precisar estou aqui!
  4. Olá Galera, aqui é o panda! Vamos para Aula de Numero 05, Começando com Orientação a objetos! Comentem e deixe o feedback de vocês! Orientação a objetos é uma maneira de programar que ajuda na organização e resolve muitos problemas enfrentados pela programação procedural. Consideremos o clássico problema da validação de um CPF. Normalmente, temos um formulário, no qual recebemos essa informação, e depois temos que enviar esses caracteres para uma função que vai validá-lo, como no pseudocódigo abaixo: cpf = formulario->campo_cpf valida(cpf) Alguém te obriga a sempre validar esse CPF? Você pode, inúmeras vezes, esquecer de chamar esse validador. E mais: considere que você tem 50 formulários e precise validar em todos eles o CPF. Se sua equipe tem 3 programadores trabalhando nesses formulários, quem fica responsável por essa validação? Todos! A situação pode piorar: na entrada de um novo desenvolvedor, precisaríamos avisá-lo que sempre devemos validar o cpf de um formulário. É nesse momento que nascem aqueles guias de programação para o desenvolvedor que for entrar nesse projeto - às vezes, é um documento enorme. Em outras palavras, todo desenvolvedor precisa ficar sabendo de uma quantidade enorme de informações, que, na maioria das vezes, não está realmente relacionado à sua parte no sistema, mas ele precisa ler tudo isso, resultando um entrave muito grande! Outra situação onde ficam claros os problemas da programação procedural, é quando nos encontramos na necessidade de ler o código que foi escrito por outro desenvolvedor e descobrir como ele funciona internamente. Um sistema bem encapsulado não deveria gerar essa necessidade. Em um sistema grande, simplesmente não temos tempo de ler todo o código existente. Considerando que você não erre nesse ponto e que sua equipe tenha uma comunicação muito boa (perceba que comunicação excessiva pode ser prejudicial e atrapalhar o andamento), ainda temos outro problema: imagine que, em todo formulário, você também quer que a idade do cliente seja validada - o cliente precisa ter mais de 18 anos. Vamos ter de colocar um if... mas onde? Espalhado por todo seu código... Mesmo que se crie outra função para validar, precisaremos incluir isso nos nossos 50 formulários já existentes. Qual é a chance de esquecermos em um deles? É muito grande. A responsabilidade de verificar se o cliente tem ou não tem 18 anos ficou espalhada por todo o seu código. Seria interessante poder concentrar essa responsabilidade em um lugar só, para não ter chances de esquecer isso. Melhor ainda seria se conseguíssemos mudar essa validação e os outros programadores nem precisassem ficar sabendo disso. Em outras palavras, eles criariam formulários e um único programador seria responsável pela validação: os outros nem sabem da existência desse trecho de código. Impossível? Não, o paradigma da orientação a objetos facilita tudo isso. O problema do paradigma procedural é que não existe uma forma simples de criar conexão forte entre dados e funcionalidades. No paradigma orientado a objetos é muito fácil ter essa conexão através dos recursos da própria linguagem. Quais as vantagens? Orientação a objetos vai te ajudar muito a se organizar e escrever menos, além de concentrar as responsabilidades nos pontos certos, flexibilizando sua aplicação, encapsulando a lógica de negócios. Outra enorme vantagem, onde você realmente vai economizar montanhas de código, é o polimorfismo das referências, que veremos em um posterior capítulo. Nos próximos capítulos, conseguiremos enxergar toda essa vantagem, mas, primeiramente é necessário conhecer um pouco mais da sintaxe e da criação de tipos e referências em Java. Criando um tipo Considere um programa para um banco, é bem fácil perceber que uma entidade extremamente importante para o nosso sistema é a conta. Nossa ideia aqui é generalizarmos alguma informação, juntamente com funcionalidades que toda conta deve ter. O que toda conta tem e é importante para nós? número da conta nome do dono da conta saldo limite O que toda conta faz e é importante para nós? Isto é, o que gostaríamos de "pedir à conta"? saca uma quantidade x deposita uma quantidade x imprime o nome do dono da conta devolve o saldo atual transfere uma quantidade x para uma outra conta y devolve o tipo de conta Com isso, temos o projeto de uma conta bancária. Podemos pegar esse projeto e acessar seu saldo? Não. O que temos ainda é o projeto. Antes, precisamos construir uma conta, para poder acessar o que ela tem, e pedir a ela que faça algo. Repare na figura: apesar do papel do lado esquerdo especificar uma Conta, essa especificação é uma Conta? Nós depositamos e sacamos dinheiro desse papel? Não. Utilizamos a especificação da Conta para poder criar instâncias que realmente são contas, onde podemos realizar as operações que criamos. Apesar de declararmos que toda conta tem um saldo, um número e uma agência no pedaço de papel (como à esquerda na figura), são nas instâncias desse projeto que realmente há espaço para armazenar esses valores. Ao projeto da conta, isto é, a definição da conta, damos o nome de classe. Ao que podemos construir a partir desse projeto, as contas de verdade, damos o nome de objetos. A palavra classe vem da taxonomia da biologia. Todos os seres vivos de uma mesma classe biológica têm uma série de atributos e comportamentos em comum, mas não são iguais, podem variar nos valores desses atributos e como realizam esses comportamentos. Homo Sapiens define um grupo de seres que possuem características em comum, porém a definição (a ideia, o conceito) de um Homo Sapiens é um ser humano? Não. Tudo está especificado na classe Homo Sapiens, mas se quisermos mandar alguém correr, comer, pular, precisaremos de uma instância de Homo Sapiens, ou então de um objeto do tipo Homo Sapiens. Um outro exemplo: uma receita de bolo. A pergunta é certeira: você come uma receita de bolo? Não. Precisamos instanciá-la, criar um objeto bolo a partir dessa especificação (a classe) para utilizá-la. Podemos criar centenas de bolos a partir dessa classe (a receita, no caso), eles podem ser bem semelhantes, alguns até idênticos, mas são objetosdiferentes. Podemos fazer milhares de analogias semelhantes. A planta de uma casa é uma casa? Definitivamente não. Não podemos morar dentro da planta de uma casa, nem podemos abrir sua porta ou pintar suas paredes. Precisamos, antes, construir instâncias a partir dessa planta. Essas instâncias, sim, podemos pintar, decorar ou morar dentro. Pode parecer óbvio, mas a dificuldade inicial do paradigma da orientação a objetos é justo saber distinguir o que é classe e o que é objeto. É comum o iniciante utilizar, obviamente de forma errada, essas duas palavras como sinônimos. Uma classe em Java Vamos começar apenas com o que uma Conta tem, e não com o que ela faz (veremos logo em seguida). Um tipo desses, como o especificado de Conta acima, pode ser facilmente traduzido para Java: class Conta { int numero; String dono; double saldo; double limite; // .. } String String é uma classe em Java. Ela guarda uma cadeia de caracteres, uma frase completa. Como estamos ainda aprendendo o que é uma classe, entenderemos com detalhes a classe String apenas em capítulos posteriores. Por enquanto, declaramos o que toda conta deve ter. Estes são os atributos que toda conta, quando criada, vai ter. Repare que essas variáveis foram declaradas fora de um bloco, diferente do que fazíamos quando tinha aquele main. Quando uma variável é declarada diretamente dentro do escopo da classe, é chamada de variável de objeto, ou atributo. Criando e usando um objeto Já temos uma classe em Java que especifica o que todo objeto dessa classe deve ter. Mas como usá-la? Além dessa classe, ainda teremos o Programa.java e a partir dele é que vamos utilizar a classeConta. Para criar (construir, instanciar) uma Conta, basta usar a palavra chave new. Devemos utilizar também os parênteses, que descobriremos o que fazem exatamente em um capítulo posterior: class Programa { public static void main(String[] args) { new Conta(); } } Bem, o código acima cria um objeto do tipo Conta, mas como acessar esse objeto que foi criado? Precisamos ter alguma forma de nos referenciarmos a esse objeto. Precisamos de uma variável: class Programa { public static void main(String[] args) { Conta minhaConta; minhaConta = new Conta(); } } Pode parecer estranho escrevermos duas vezes Conta: uma vez na declaração da variável e outra vez no uso do new. Mas há um motivo, que em breve entenderemos. Através da variável minhaConta, podemos acessar o objeto recém criado para alterar seu dono, seu saldo, etc: class Programa { public static void main(String[] args) { Conta minhaConta; minhaConta = new Conta(); minhaConta.dono = "Duke"; minhaConta.saldo = 1000.0; System.out.println("Saldo atual: " + minhaConta.saldo); } } É importante fixar que o ponto foi utilizado para acessar algo em minhaConta. A minhaConta pertence ao Duke, e tem saldo de mil reais. Métodos Dentro da classe, também declararemos o que cada conta faz e como isto é feito - os comportamentos que cada classe tem, isto é, o que ela faz. Por exemplo, de que maneira que uma Conta saca dinheiro? Especificaremos isso dentro da própria classe Conta, e não em um local desatrelado das informações da própria Conta. É por isso que essas "funções" são chamadas de métodos. Pois é a maneira de fazer uma operação com um objeto. Queremos criar um método que saca uma determinada quantidade e não devolve nenhuma informação para quem acionar esse método. class Conta { double saldo; // ... outros atributos ... void saca(double quantidade) { double novoSaldo = this.saldo - quantidade; this.saldo = novoSaldo; } } A palavra chave void diz que, quando você pedir para a conta sacar uma quantia, nenhuma informação será enviada de volta a quem pediu. Quando alguém pedir para sacar, ele também vai dizer quanto quer sacar. Por isso precisamos declarar o método com algo dentro dos parênteses - o que vai aí dentro é chamado de argumento do método (ou parâmetro). Essa variável é uma variável comum, chamada também de temporária ou local, pois, ao final da execução desse método, ela deixa de existir. Dentro do método, estamos declarando uma nova variável. Essa variável, assim como o argumento, vai morrer no fim do método, pois este é seu escopo. No momento que vamos acessar nosso atributo, usamos a palavra chave this para mostrar que esse é um atributo, e não uma simples variável. (veremos depois que é opcional) Repare que, nesse caso, a conta pode estourar o limite fixado pelo banco. Mais para frente, evitaremos essa situação, e de uma maneira muito elegante. Da mesma forma, temos o método para depositar alguma quantia: class Conta { // ... outros atributos e métodos ... void deposita(double quantidade) { this.saldo += quantidade; } } Observe que não usamos uma variável auxiliar e, além disso, usamos a abreviação +=para deixar o método bem simples. O += soma quantidade ao valor antigo do saldo e guarda no próprio saldo, o valor resultante. Para mandar uma mensagem ao objeto e pedir que ele execute um método, também usamos o ponto. O termo usado para isso é invocação de método. O código a seguir saca dinheiro e depois deposita outra quantia na nossa conta: class TestaAlgunsMetodos { public static void main(String[] args) { // criando a conta Conta minhaConta; minhaConta = new Conta(); // alterando os valores de minhaConta minhaConta.dono = "Duke"; minhaConta.saldo = 1000; // saca 200 reais minhaConta.saca(200); // deposita 500 reais minhaConta.deposita(500); System.out.println(minhaConta.saldo); } } Uma vez que seu saldo inicial é 1000 reais, se sacarmos 200 reais, depositarmos 500 reais e imprimirmos o valor do saldo, o que será impresso? Métodos com retorno Um método sempre tem que definir o que retorna, nem que defina que não há retorno, como nos exemplos anteriores onde estávamos usando o void. Um método pode retornar um valor para o código que o chamou. No caso do nosso método saca , podemos devolver um valor booleano indicando se a operação foi bem sucedida. class Conta { // ... outros métodos e atributos ... boolean saca(double valor) { if (this.saldo < valor) { return false; } else { this.saldo = this.saldo - valor; return true; } } } A declaração do método mudou! O método saca não tem void na frente. Isto quer dizer que, quando é acessado, ele devolve algum tipo de informação. No caso, um boolean. A palavra chave return indica que o método vai terminar ali, retornando tal informação. Exemplo de uso: minhaConta.saldo = 1000; boolean consegui = minhaConta.saca(2000); if (consegui) { System.out.println("Consegui sacar"); } else { System.out.println("Não consegui sacar"); } Ou então, posso eliminar a variável temporária, se desejado: minhaConta.saldo = 1000; if (minhaConta.saca(2000)) { System.out.println("Consegui sacar"); } else { System.out.println("Não consegui sacar"); } Mais adiante, veremos que algumas vezes é mais interessante lançar uma exceção (exception) nesses casos. Meu programa pode manter na memória não apenas uma conta, como mais de uma: class TestaDuasContas { public static void main(String[] args) { Conta minhaConta; minhaConta = new Conta(); minhaConta.saldo = 1000; Conta meuSonho; meuSonho = new Conta(); meuSonho.saldo = 1500000; } } bjetos são acessados por referências Quando declaramos uma variável para associar a um objeto, na verdade, essa variável não guarda o objeto, e sim uma maneira de acessá-lo, chamada de referência. É por esse motivo que, diferente dos tipos primitivos como int e long, precisamos dar new depois de declarada a variável: public static void main(String args[]) { Conta c1; c1 = new Conta(); Conta c2; c2 = new Conta(); } O correto aqui, é dizer que c1 se refere a um objeto. Não é correto dizer que c1 é um objeto, pois c1 é uma variável referência, apesar de, depois de um tempo, os programadores Java falarem "Tenho um objeto c do tipo Conta", mas apenas para encurtar a frase "Tenho uma referência c a um objeto do tipo Conta". Basta lembrar que, em Java, uma variável nunca é um objeto. Não há, no Java, uma maneira de criarmos o que é conhecido como "objeto pilha" ou "objeto local", pois todo objeto em Java, sem exceção, é acessado por uma variável referência. Esse código nos deixa na seguinte situação: Conta c1; c1 = new Conta(); Conta c2; c2 = new Conta(); Internamente, c1 e c2 vão guardar um número que identifica em que posição da memória aquela Conta se encontra. Dessa maneira, ao utilizarmos o "." para navegar, o Java vai acessar a Conta que se encontra naquela posição de memória, e não uma outra. Para quem conhece, é parecido com um ponteiro, porém você não pode manipulá-lo como um número e nem utilizá-lo para aritmética, ela é tipada. Um outro exemplo: class TestaReferencias { public static void main(String args[]) { Conta c1 = new Conta(); c1.deposita(100); Conta c2 = c1; // linha importante! c2.deposita(200); System.out.println(c1.saldo); System.out.println(c2.saldo); } } Qual é o resultado do código acima? O que aparece ao rodar? O que acontece aqui? O operador = copia o valor de uma variável. Mas qual é o valor da variável c1? É o objeto? Não. Na verdade, o valor guardado é a referência (endereço) de onde o objeto se encontra na memória principal. Na memória, o que acontece nesse caso: Conta c1 = new Conta(); Conta c2 = c1; Quando fizemos c2 = c1, c2 passa a fazer referência para o mesmo objeto que c1referencia nesse instante. Então, nesse código em específico, quando utilizamos c1 ou c2 estamos nos referindo exatamente ao mesmo objeto! Elas são duas referências distintas, porém apontam para o mesmo objeto! Compará-las com "==" vai nos retornar true, pois o valor que elas carregam é o mesmo! Outra forma de perceber, é que demos apenas um new, então só pode haver um objeto Conta na memória. Atenção: não estamos discutindo aqui a utilidade de fazer uma referência apontar pro mesmo objeto que outra. Essa utilidade ficará mais clara quando passarmos variáveis do tipo referência como argumento para métodos. new O que exatamente faz o new? O new executa uma série de tarefas, que veremos mais adiante. Mas, para melhor entender as referências no Java, saiba que o new, depois de alocar a memória para esse objeto, devolve uma "flecha", isto é, um valor de referência. Quando você atribui isso a uma variável, essa variável passa a se referir para esse mesmo objeto. Continuando... Podemos então ver outra situação: public static void main(String args[]) { Conta c1 = new Conta(); c1.dono = "Duke"; c1.saldo = 227; Conta c2 = new Conta(); c2.dono = "Duke"; c2.saldo = 227; if (c1 == c2) { System.out.println("Contas iguais"); } } O operador == compara o conteúdo das variáveis, mas essas variáveis não guardam o objeto, e sim o endereço em que ele se encontra. Como em cada uma dessas variáveis guardamos duas contas criadas diferentemente, elas estão em espaços diferentes da memória, o que faz o teste no if valer false. As contas podem ser equivalentes no nosso critério de igualdade, porém elas não são o mesmo objeto. Quando se trata de objetos, pode ficar mais fácil pensar que o == compara se os objetos (referências, na verdade) são o mesmo, e não se são iguais. Para saber se dois objetos têm o mesmo conteúdo, você precisa comparar atributo por atributo. Veremos uma solução mais elegante para isso também. O método transfere() E se quisermos ter um método que transfere dinheiro entre duas contas? Podemos ficar tentados a criar um método que recebe dois parâmetros: conta1 e conta2 do tipo Conta. Mas cuidado: assim estamos pensando de maneira procedural. A ideia é que, quando chamarmos o método transfere, já teremos um objeto do tipo Conta (o this), portanto o método recebe apenas um parâmetro do tipo Conta, a Conta destino (além do valor): class Conta { // atributos e métodos... void transfere(Conta destino, double valor) { this.saldo = this.saldo - valor; destino.saldo = destino.saldo + valor; } } Para deixar o código mais robusto, poderíamos verificar se a conta possui a quantidade a ser transferida disponível. Para ficar ainda mais interessante, você pode chamar os métodos deposita e saca já existentes para fazer essa tarefa: class Conta { // atributos e métodos... boolean transfere(Conta destino, double valor) { boolean retirou = this.saca(valor); if (retirou == false) { // não deu pra sacar! return false; } else { destino.deposita(valor); return true; } } } Quando passamos uma Conta como argumento, o que será que acontece na memória? Será que o objeto é clonado? No Java, a passagem de parâmetro funciona como uma simples atribuição como no uso do "=". Então, esse parâmetro vai copiar o valor da variável do tipo Conta que for passado como argumento. E qual é o valor de uma variável dessas? Seu valor é um endereço, uma referência, nunca um objeto. Por isso não há cópia de objetos aqui. Esse último código poderia ser escrito com uma sintaxe muito mais sucinta. Como? Transfere Para Perceba que o nome deste método poderia ser transferePara ao invés de só transfere. A chamada do método fica muito mais natural, é possível ler a frase em português que ela tem um sentido: conta1.transferePara(conta2, 50); A leitura deste código seria "Conta1 transfere para conta2 50 reais". Continuando com atributos As variáveis do tipo atributo, diferentemente das variáveis temporárias (declaradas dentro de um método), recebem um valor padrão. No caso numérico, valem 0, no caso de boolean, valem false. Você também pode dar valores default, como segue: class Conta { int numero = 1234; String dono = "Duke"; String cpf = "123.456.789-10"; double saldo = 1000; double limite = 1000; } Nesse caso, quando você criar uma conta, seus atributos já estão "populados" com esses valores colocados. Imagine que comecemos a aumentar nossa classe Conta e adicionar nome, sobrenome e cpf do cliente dono da conta. Começaríamos a ter muitos atributos... e, se você pensar direito, uma Conta não tem nome, nem sobrenome nem cpf, quem tem esses atributos é um Cliente. Então podemos criar uma nova classe e fazer uma composição Seus atributos também podem ser referências para outras classes. Suponha a seguinte classe Cliente: lass Cliente { String nome; String sobrenome; String cpf; } class Conta { int numero; double saldo; double limite; Cliente titular; // .. } E dentro do main da classe de teste: class Teste { public static void main(String[] args) { Conta minhaConta = new Conta(); Cliente c = new Cliente(); minhaConta.titular = c; // ... } } Aqui, simplesmente houve uma atribuição. O valor da variável c é copiado para o atributo titular do objeto ao qual minhaConta se refere. Em outras palavras, minhaContatem uma referência ao mesmo Cliente que c se refere, e pode ser acessado através deminhaConta.titular. Você pode realmente navegar sobre toda essa estrutura de informação, sempre usando o ponto: Cliente clienteDaMinhaConta = minhaConta.titular; clienteDaMinhaConta.nome = "Duke"; Ou ainda, pode fazer isso de uma forma mais direta e até mais elegante: minhaConta.titular.nome = "Duke"; Um sistema orientado a objetos é um grande conjunto de classes que vai se comunicar, delegando responsabilidades para quem for mais apto a realizar determinada tarefa. A classe Banco usa a classe Conta que usa a classe Cliente, que usa a classe Endereco. Dizemos que esses objetos colaboram, trocando mensagens entre si. Por isso acabamos tendo muitas classes em nosso sistema, e elas costumam ter um tamanho relativamente curto. Mas, e se dentro do meu código eu não desse new em Cliente e tentasse acessá-lo diretamente? class Teste { public static void main(String[] args) { Conta minhaConta = new Conta(); minhaConta.titular.nome = "Manoel"; // ... } } Quando damos new em um objeto, ele o inicializa com seus valores default, 0 para números, false para boolean e null para referências. null é uma palavra chave em java, que indica uma referência para nenhum objeto. Se, em algum caso, você tentar acessar um atributo ou método de alguém que está se referenciando para null, você receberá um erro durante a execução (NullPointerException, que veremos mais à frente). Da para perceber, então, que o newnão traz um efeito cascata, a menos que você dê um valor default (ou use construtores, que também veremos mais a frente): class Conta { int numero; double saldo; double limite; Cliente titular = new Cliente(); // quando chamarem new Conta, //havera um new Cliente para ele. } Com esse código, toda nova Conta criada já terá um novo Cliente associado, sem necessidade de instanciá-lo logo em seguida da instanciação de uma Conta. Qual alternativa você deve usar? Depende do caso: para toda nova Conta você precisa de um novo Cliente? É essa pergunta que deve ser respondida. Nesse nosso caso a resposta é não, mas depende do nosso problema. Atenção: para quem não está acostumado com referências, pode ser bastante confuso pensar sempre em como os objetos estão na memória para poder tirar as conclusões de o que ocorrerá ao executar determinado código, por mais simples que ele seja. Com tempo, você adquire a habilidade de rapidamente saber o efeito de atrelar as referências, sem ter de gastar muito tempo para isso. É importante, nesse começo, você estar sempre pensando no estado da memória. E realmente lembrar que, no Java "uma variável nunca carrega um objeto, e sim uma referência para ele" facilita muito. Para saber mais: Uma Fábrica de Carros Além do Banco que estamos criando, vamos ver como ficariam certas classes relacionadas a uma fábrica de carros. Vamos criar uma classe Carro, com certos atributos, que descrevem suas características, e com certos métodos, que descrevem seu comportamento. class Carro { String cor; String modelo; double velocidadeAtual; double velocidadeMaxima; //liga o carro void liga() { System.out.println("O carro está ligado"); } //acelera uma certa quantidade void acelera(double quantidade) { double velocidadeNova = this.velocidadeAtual + quantidade; this.velocidadeAtual = velocidadeNova; } //devolve a marcha do carro int pegaMarcha() { if (this.velocidadeAtual < 0) { return -1; } if (this.velocidadeAtual >= 0 && this.velocidadeAtual < 40) { return 1; } if (this.velocidadeAtual >= 40 && this.velocidadeAtual < 80) { return 2; } return 3; } } Vamos testar nosso Carro em um novo programa: class TestaCarro { public static void main(String[] args) { Carro meuCarro; meuCarro = new Carro(); meuCarro.cor = "Verde"; meuCarro.modelo = "Fusca"; meuCarro.velocidadeAtual = 0; meuCarro.velocidadeMaxima = 80; // liga o carro meuCarro.liga(); // acelera o carro meuCarro.acelera(20); System.out.println(meuCarro.velocidadeAtual); } } Nosso carro pode conter também um Motor: class Motor { int potencia; String tipo; } class Carro { String cor; String modelo; double velocidadeAtual; double velocidadeMaxima; Motor motor; // .. } Podemos, criar diversos Carros e mexer com seus atributos e métodos, assim como fizemos no exemplo do Banco. Um pouco mais... Quando declaramos uma classe, um método ou um atributo, podemos dar o nome que quisermos, seguindo uma regra. Por exemplo, o nome de um método não pode começar com um número. Pesquise sobre essas regras. Como você pode ter reparado, sempre damos nomes às variáveis com letras minúsculas. É que existem convenções de código, dadas pela Oracle, para facilitar a legibilidade do código entre programadores. Essa convenção é muito seguida. Leia sobre ela pesquisando por "java code conventions". É necessário usar a palavra chave this quando for acessar um atributo? Para que, então, utilizá-la? O exercício a seguir pedirá para modelar um "funcionário". Existe um padrão para representar suas classes em diagramas, que é amplamente utilizado, chamado UML. Pesquise sobre ele.
  5. Uai cara aconteceu um monte de problema na minha familia e na minha vida, serio se quiser saber so chamar pv pra não ficarmos fazendo flood no post
  6. Sou rancoroso tá, veio me zuar só porque sumi passando altos problemas kkkk
  7. Lembro sim, e você me ama né. kkkk vi nos meus status vc me zuando só pq sumi kkkk
  8. Estou de volta, depois de um tempo afastado do fórum por problemas de saúde e família. Mas como diz o ditado um bom filho a casa torna.
  9. E ai Galera! Estou voltando a ativa, quem não sabe quem sou me chamo Pedro sou Desenvolvedor Python e Cientista de Dados (Data Science), Sou aluno de Extensão e Pesquisa de Inteligência Artificial e GDE. Ai embaixo vai umas fotos desse gordo delicia! Confiram na infozone estou publicando um curso completo de Java em breve trarei vídeos! Inscrevam-se no meu canal do youtube estarei trazendo conteudo sobre Inteligencia Artificial e Programação em breve! TECNOPATAS O gordo: Dando Palestra sobre Machine Learning: Sensualizando:
  10. Olá Galera, aqui é o panda! Vamos para Aula de Numero 04, Variáveis e fluxo! Comentem e deixe o feedback de vocês! Dentro de um bloco, podemos declarar variáveis e usá-las. Em Java, toda variável tem um tipo que não pode ser mudado, uma vez que declarado: tipoDaVariavel nomeDaVariavel; Por exemplo, é possível ter uma idade que guarda um número inteiro: int idade; Com isso, você declara a variável idade, que passa a existir a partir daquela linha. Ela é do tipo int, que guarda um número inteiro. A partir daí, você pode usá-la, primeiramente atribuindo valores. A linha a seguir é a tradução de: "idade deve valer quinze". idade = 15; Comentários em Java Para fazer um comentário em java, você pode usar o // para comentar até o final da linha, ou então usar o /* */ para comentar o que estiver entre eles. /* comentário daqui, ate aqui */ // uma linha de comentário sobre a idade int idade; Além de atribuir, você pode utilizar esse valor. O código a seguir declara novamente a variável idade com valor 15 e imprime seu valor na saída padrão através da chamada a System.out.println. // declara a idade int idade; idade = 15; // imprime a idade System.out.println(idade); Por fim, podemos utilizar o valor de uma variável para algum outro propósito, como alterar ou definir uma segunda variável. O código a seguir cria uma variável chamada idadeNoAnoQueVem com valor de idade mais um. / calcula a idade no ano seguinte int idadeNoAnoQueVem; idadeNoAnoQueVem = idade + 1; No mesmo momento que você declara uma variável, também é possível inicializá-la por praticidade: int idade = 15; Você pode usar os operadores +, -, / e * para operar com números, sendo eles responsáveis pela adição, subtração, divisão e multiplicação, respectivamente. Além desses operadores básicos, há o operador % (módulo) que nada mais é que o resto de uma divisão inteira. Veja alguns exemplos: nt quatro = 2 + 2; int tres = 5 - 2; int oito = 4 * 2; int dezesseis = 64 / 4; int um = 5 % 2; // 5 dividido por 2 dá 2 e tem resto 1; // o operador % pega o resto da divisão inteira Como rodar esses códigos? Você deve colocar esses trechos de código dentro do bloco main que vimos no capítulo anterior. Isto é, isso deve ficar no miolo do programa. Use bastante System.out.println, dessa forma você pode ver algum resultado, caso contrário, ao executar a aplicação, nada aparecerá. Por exemplo, para imprimir a idade e a idadeNoAnoQueVem podemos escrever o seguinte programa de exemplo: class TestaIdade { public static void main(String[] args) { // imprime a idade int idade = 20; System.out.println(idade); // gera uma idade no ano seguinte int idadeNoAnoQueVem; idadeNoAnoQueVem = idade + 1; // imprime a idade System.out.println(idadeNoAnoQueVem); } } Representar números inteiros é fácil, mas como guardar valores reais, tais como frações de números inteiros e outros? Outro tipo de variável muito utilizado é o double, que armazena um número com ponto flutuante (e que também pode armazenar um número inteiro). double pi = 3.14; double x = 5 * 10; O tipo boolean armazena um valor verdadeiro ou falso, e só: nada de números, palavras ou endereços, como em algumas outras linguagens. boolean verdade = true; true e false são palavras reservadas do Java. É comum que um boolean seja determinado através de uma expressão booleana, isto é, um trecho de código que retorna um booleano, como o exemplo: int idade = 30; boolean menorDeIdade = idade < 18; O tipo char guarda um, e apenas um, caractere. Esse caractere deve estar entre aspas simples. Não se esqueça dessas duas características de uma variável do tipo char! Por exemplo, ela não pode guardar um código como '' pois o vazio não é um caractere! char letra = 'a'; System.out.println(letra); Variáveis do tipo char são pouco usadas no dia a dia. Veremos mais a frente o uso das Strings, que usamos constantemente, porém estas não são definidas por um tipo primitivo. Tipos primitivos e valores Esses tipos de variáveis são tipos primitivos do Java: o valor que elas guardam são o real conteúdo da variável. Quando você utilizar o operador de atribuição = o valor será copiado. int i = 5; // i recebe uma cópia do valor 5 int j = i; // j recebe uma cópia do valor de i i = i + 1; // i vira 6, j continua 5 Aqui, i fica com o valor de 6. Mas e j? Na segunda linha, j está valendo 5. Quando i passa a valer 6, será que j também muda de valor? Não, pois o valor de um tipo primitivo sempre é copiado. Apesar da linha 2 fazer j = i, a partir desse momento essas variáveis não tem relação nenhuma: o que acontece com uma, não reflete em nada com a outra. Outros tipos primitivos Vimos aqui os tipos primitivos que mais aparecem. O Java tem outros, que são o byte, short,long e float. Cada tipo possui características especiais que, para um programador avançado, podem fazer muita diferença. Casting e promoção Alguns valores são incompatíveis se você tentar fazer uma atribuição direta. Enquanto um número real costuma ser representado em uma variável do tipo double, tentar atribuir ele a uma variável int não funciona porque é um código que diz: "i deve valer d", mas não se sabe se d realmente é um número inteiro ou não. double d = 3.1415; int i = d; // não compila O mesmo ocorre no seguinte trecho: int i = 3.14; O mais interessante, é que nem mesmo o seguinte código compila: double d = 5; // ok, o double pode conter um número inteiro int i = d; // não compila Apesar de 5 ser um bom valor para um int, o compilador não tem como saber que valor estará dentro desse double no momento da execução. Esse valor pode ter sido digitado pelo usuário, e ninguém vai garantir que essa conversão ocorra sem perda de valores. Já no caso a seguir, é o contrário: int i = 5; double d2 = i; O código acima compila sem problemas, já que um double pode guardar um número com ou sem ponto flutuante. Todos os inteiros representados por uma variável do tipo int podem ser guardados em uma variável double, então não existem problemas no código acima. Às vezes, precisamos que um número quebrado seja arredondado e armazenado num número inteiro. Para fazer isso sem que haja o erro de compilação, é preciso ordenar que o número quebrado seja moldado (casted) como um número inteiro. Esse processo recebe o nome de casting. double d3 = 3.14; int i = (int) d3; O casting foi feito para moldar a variável d3 como um int. O valor de i agora é 3. O mesmo ocorre entre valores int e long. long x = 10000; int i = x; // não compila, pois pode estar perdendo informação E, se quisermos realmente fazer isso, fazemos o casting: long x = 10000; int i = (int) x; Alguns castings aparecem também: float x = 0.0; O código acima não compila pois todos os literais com ponto flutuante são considerados double pelo Java. E float não pode receber um double sem perda de informação, para fazer isso funcionar podemos escrever o seguinte: float x = 0.0f; A letra f, que pode ser maiúscula ou minúscula, indica que aquele literal deve ser tratado como float. Outro caso, que é mais comum: double d = 5; float f = 3; float x = f + (float) d; Você precisa do casting porque o Java faz as contas e vai armazenando sempre no maior tipo que apareceu durante as operações, no caso o double. E, uma observação: no mínimo, o Java armazena o resultado em um int, na hora de fazer as contas. Até casting com variáveis do tipo char podem ocorrer. O único tipo primitivo que não pode ser atribuído a nenhum outro tipo é o boolean. Castings possíveis Abaixo estão relacionados todos os casts possíveis na linguagem Java, mostrando a conversão de um valor para outro. A indicação Impl. quer dizer que aquele cast é implícito e automático, ou seja, você não precisa indicar o cast explicitamente (lembrando que o tipo boolean não pode ser convertido para nenhum outro tipo). Tamanho dos tipos Na tabela abaixo, estão os tamanhos de cada tipo primitivo do Java. O if e o else A sintaxe do if no Java é a seguinte: if (condicaoBooleana) { codigo; } Uma condição booleana é qualquer expressão que retorne true ou false. Para isso, você pode usar os operadores <, >, <=, >= e outros. Um exemplo: int idade = 15; if (idade < 18) { System.out.println("Não pode entrar"); } Além disso, você pode usar a cláusula else para indicar o comportamento que deve ser executado no caso da expressão booleana ser falsa: int idade = 15; if (idade < 18) { System.out.println("Não pode entrar"); } else { System.out.println("Pode entrar"); } Você pode concatenar expressões booleanas através dos operadores lógicos "E" e "OU". O "E" é representado pelo && e o "OU" é representado pelo ||. Um exemplo seria verificar se ele tem menos de 18 anos e se ele não é amigo do dono: int idade = 15; boolean amigoDoDono = true; if (idade < 18 && amigoDoDono == false) { System.out.println("Não pode entrar"); } else { System.out.println("Pode entrar"); } Esse código poderia ficar ainda mais legível, utilizando-se o operador de negação, o !. Esse operador transforma o resultado de uma expressão booleana de false para truee vice versa. int idade = 15; boolean amigoDoDono = true; if (idade < 18 && !amigoDoDono) { System.out.println("Não pode entrar"); } else { System.out.println("Pode entrar"); } Repare na linha 3 que o trecho amigoDoDono == false virou !amigoDoDono. Eles têm o mesmo valor. Para comparar se uma variável tem o mesmo valor que outra variável ou valor, utilizamos o operador ==. Repare que utilizar o operador = dentro de um if vai retornar um erro de compilação, já que o operador = é o de atribuição. int mes = 1; if (mes == 1) { System.out.println("Você deveria estar de férias"); } O While O while é um comando usado para fazer um laço (loop), isto é, repetir um trecho de código algumas vezes. A ideia é que esse trecho de código seja repetido enquanto uma determinada condição permanecer verdadeira. int idade = 15; while (idade < 18) { System.out.println(idade); idade = idade + 1; } O trecho dentro do bloco do while será executado até o momento em que a condição idade < 18 passe a ser falsa. E isso ocorrerá exatamente no momento em que idade == 18, o que não o fará imprimir 18. int i = 0; while (i < 10) { System.out.println(i); i = i + 1; } Já o while acima imprime de 0 a 9. O For Outro comando de loop extremamente utilizado é o for. A ideia é a mesma do while: fazer um trecho de código ser repetido enquanto uma condição continuar verdadeira. Mas além disso, o for isola também um espaço para inicialização de variáveis e o modificador dessas variáveis. Isso faz com que fiquem mais legíveis, as variáveis que são relacionadas ao loop: for (inicializacao; condicao; incremento) { codigo; } Um exemplo é o a seguir: for (int i = 0; i < 10; i = i + 1) { System.out.println("olá!"); } Repare que esse for poderia ser trocado por: int i = 0; while (i < 10) { System.out.println("olá!"); i = i + 1; } Porém, o código do for indica claramente que a variável i serve, em especial, para controlar a quantidade de laços executados. Quando usar o for? Quando usar o while? Depende do gosto e da ocasião. Pós incremento ++ i = i + 1 pode realmente ser substituído por i++ quando isolado, porém, em alguns casos, temos essa instrução envolvida em, por exemplo, uma atribuição: int i = 5; int x = i++; Qual é o valor de x? O de i, após essa linha, é 6. O operador ++, quando vem após a variável, retorna o valor antigo, e incrementa (pós incremento), fazendo x valer 5. Se você tivesse usado o ++ antes da variável (pré incremento), o resultado seria 6: int i = 5; int x = ++i; // aqui x valera 6 Controlando loops Apesar de termos condições booleanas nos nossos laços, em algum momento, podemos decidir parar o loop por algum motivo especial sem que o resto do laço seja executado. for (int i = x; i < y; i++) { if (i % 19 == 0) { System.out.println("Achei um número divisível por 19 entre x e y"); break; } } O código acima vai percorrer os números de x a y e parar quando encontrar um número divisível por 19, uma vez que foi utilizada a palavra chave break. Da mesma maneira, é possível obrigar o loop a executar o próximo laço. Para isso usamos a palavra chave continue. for (int i = 0; i < 100; i++) { if (i > 50 && i < 60) { continue; } System.out.println(i); } O código acima não vai imprimir alguns números. (Quais exatamente?) Escopo das variáveis No Java, podemos declarar variáveis a qualquer momento. Porém, dependendo de onde você as declarou, ela vai valer de um determinado ponto a outro. // aqui a variável i não existe int i = 5; // a partir daqui ela existe O escopo da variável é o nome dado ao trecho de código em que aquela variável existe e onde é possível acessá-la. Quando abrimos um novo bloco com as chaves, as variáveis declaradas ali dentro só valem até o fim daquele bloco. // aqui a variável i não existe int i = 5; // a partir daqui ela existe while (condicao) { // o i ainda vale aqui int j = 7; // o j passa a existir } // aqui o j não existe mais, mas o i continua dentro do escopo No bloco acima, a variável j pára de existir quando termina o bloco onde ela foi declarada. Se você tentar acessar uma variável fora de seu escopo, ocorrerá um erro de compilação. O mesmo vale para um if: if (algumBooleano) { int i = 5; } else { int i = 10; } System.out.println(i); // cuidado! Aqui a variável i não existe fora do if e do else! Se você declarar a variável antes do if, vai haver outro erro de compilação: dentro do if e do else a variável está sendo redeclarada! Então o código para compilar e fazer sentido fica: int i; if (algumBooleano) { i = 5; } else { i = 10; } System.out.println(i); Uma situação parecida pode ocorrer com o for: for (int i = 0; i < 10; i++) { System.out.println("olá!"); } System.out.println(i); // cuidado! Neste for, a variável i morre ao seu término, não podendo ser acessada de fora do for, gerando um erro de compilação. Se você realmente quer acessar o contador depois do loop terminar, precisa de algo como: int i; for (i = 0; i < 10; i++) { System.out.println("olá!"); } System.out.println(i); Um bloco dentro do outro Um bloco também pode ser declarado dentro de outro. Isto é, um if dentro de um for, ou um for dentro de um for, algo como: while (condicao) { for (int i = 0; i < 10; i++) { // código } } Para saber mais Vimos apenas os comandos mais usados para controle de fluxo. O Java ainda possui o do..while e o switch. Pesquise sobre eles e diga quando é interessante usar cada um deles. Algumas vezes, temos vários laços encadeados. Podemos utilizar o break para quebrar o laço mais interno. Mas, se quisermos quebrar um laço mais externo, teremos de encadear diversos ifs e seu código ficará uma bagunça. O Java possui um artifício chamado labeled loops; pesquise sobre eles. O que acontece se você tentar dividir um número inteiro por 0? E por 0.0? Existe um caminho entre os tipos primitivos que indicam se há a necessidade ou não de casting entre os tipos. Por exemplo, int -> long -> double (um int pode ser tratado como um double, mas não o contrário). Pesquise (ou teste), e posicione os outros tipos primitivos nesse fluxo. Além dos operadores de incremento, existem os de decremento, como --i e i--. Além desses, você pode usar instruções do tipo i += x e i -= x, o que essas instruções fazem? Teste.
  11. Olá Galera, aqui é o panda! Vamos para Aula de Numero 03, IMeu primeiro programa Java! Comentem e deixe o feedback de vocês! Compilando o primeiro programa Vamos para o nosso primeiro código! O programa que imprime uma linha simples. Para mostrar uma linha, podemos fazer: System.out.println("Minha primeira aplicação Java!"); Mas esse código não será aceito pelo compilador java. O Java é uma linguagem bastante burocrática, e precisa de mais do que isso para iniciar uma execução. Veremos os detalhes e os porquês durante os próximos capítulos. O mínimo que precisaríamos escrever é algo como: class MeuPrograma { public static void main(String[] args) { System.out.println("Minha primeira aplicação Java!"); } } Após digitar o código acima, grave-o como MeuPrograma.java em algum diretório. Para compilar, você deve pedir para que o compilador de Java da Oracle, chamado javac, gere o bytecode correspondente ao seu código Java. javac MeuPrograma.java Depois de compilar, o bytecode foi gerado. Quando o sistema operacional listar os arquivos contidos no diretório atual, você poderá ver que um arquivo .class foi gerado, com o mesmo nome da sua classe Java. Executando seu primeiro programa Os procedimentos para executar seu programa são muito simples. O javac é o compilador Java, e o java é o responsável por invocar a máquina virtual para interpretar o seu programa. java MeuPrograma Ao executar, pode ser que a acentuação resultante saia errada devido a algumas configurações que deixamos de fazer. Sem problemas. O que aconteceu? class MeuPrograma {[/b][/b] [b][b] public static void main(String[] args) { // miolo do programa começa aqui! System.out.println("Minha primeira aplicação Java!!"); // fim do miolo do programa } } O miolo do programa é o que será executado quando chamamos a máquina virtual. Por enquanto, todas as linhas anteriores, onde há a declaração de uma classe e a de um método, não importam para nós nesse momento. Mas devemos saber que toda aplicação Java começa por um ponto de entrada, e este ponto de entrada é o método main. Ainda não sabemos o que é método, mas veremos no capítulo 4. Até lá, não se preocupe com essas declarações. Sempre que um exercício for feito, o código que nos importa sempre estará nesse miolo. No caso do nosso código, a linha do System.out.println faz com que o conteúdo entre aspas seja colocado na tela. Para saber mais: como é o bytecode? O MeuPrograma.class gerado não é legível por seres humanos (não que seja impossível). Ele está escrito no formato que a virtual machine sabe entender e que foi especificado que ela entendesse. É como um assembly, escrito para esta máquina em específico. Podemos ler os mnemônicos utilizando a ferramenta javap que acompanha o JDK: javap -c MeuPrograma.class E a saída: MeuPrograma(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #3; //String Minha primeira aplicação Java!! 5: invokevirtual #4; //Method java/io/PrintStream.println: (Ljava/lang/String;)V 8: return } É o código acima, que a JVM sabe ler. É o "código de máquina", da máquina virtual. Um bytecode pode ser revertido para o .java original (com perda de comentários e nomes de variáveis locais). Caso seu software vá virar um produto de prateleira, é fundamental usar um ofuscador no seu código, que vai embaralhar classes, métodos e um monte de outros recursos (O Panda aqui indica https://www.guardsquare.com/en/proguard). VAMOS FAZER UM EXERCICIO! Agora, usando um editor de texto de sua preferência (Bloco de Notas, Sublime, Notepad++, etc) crie o seu primeiro programa Java imprimindo uma mensagem diferente. Comece criando a class MeuProgramaModificado: class MeuProgramaModificado { } Lembre-se que todo o código será inserido dentro das chaves. Dentro da classe coloque o método main: public static void main(String[] args) { } Dentro do método coloque um System.out.println("sua mensagem aqui"); para imprimir uma mensagem. Salve o arquivo como "MeuProgramaModificado.java". Compile o programa com a linha de comando: javac MeuProgramaModificado.java E execute o programa usando o java: java MeuProgramaModificado Compartilhe aqui o código de sua classe.
  12. Olá Galera, aqui é o panda! Vamos para Aula de Numero 02, Instalando o Java! Comentem e deixe o feedback de vocês! Há muitas empresas que implementam uma VM do Java, como a própria Oracle, a IBM, a Apache e outros. Apesar da VM da Oracle ser a mais usada e possuir versões para Windows, Linux e Solaris, para cada OS diferente o processo de instalação varia. Siga aqui os passos de instalação de uma VM no sistema operacional que você usa: Linux, Mac OSX ou Windows: Linux No Ubuntu o processo de instalação mais rápido e simples é o do open-jdk, uma implementação open source do JDK: sudo apt-get install openjdk-7-jdk No Linux Fedora você pode instalar com: su -c "yum install java-1.7.0-openjdk" Após a instalação no seu Linux teste seu java com os comandos: javac -version java -version Mac OSX No Mac OSX você pode baixar a versão 1.7 do Java SDK em http://jdk7.java.net/macportpreview/ Após executar o instalador, será necessário entrar no painel de Preferences, Java Preferences e alterar a versão do Java para a nova que você acaba de instalar. Após a instalação no seu Mac OSX teste seu java com os comandos : javac -version java -version Windows Por fim, para instalar o SDK do Windows, acesse: http://www.oracle.com/technetwork/java/ Dentre os top downloads, escolha o Java SE: http://www.oracle.com/technetwork/java/javase/downloads/index.html Escolha então o JDK (Java Development Kit) e por fim a versão de seu sistema operacional. Execute o arquivo jdk-versão-windows-arquitetura-p.exe e passe pelo wizard de instalação. O registro de sua VM no site da Oracle é opcional. Clique agora com o botão da direita sobre o Computador, escolha Propriedades. Na aba Configurações Avançadas do Sistema clique em Variáveis de Ambiente. Aqui, dependendo da sua versão do Windows, as coisas podem variar um pouco, mas se tiver alguma dúvida entre em contato conosco pelo fórum! Clique no botão Novo para adicionar uma nova variável do sistema: seu nome é JAVA_HOME (tudo maiúsculo) e seu valor será o diretório onde instalou o Java (provavelmente algo como C:\Program Files\Java\jdk1.7.0_03). Agora vamos alterar a variável do sistema PATH (ou Path). Não crie uma variável nova, altere a variável PATH que já existe. Escolha ela e clique em Editar. No final do valor atual complemente com o valor %JAVA_HOME%\bin. Não se esqueça do ponto e vírgula que separa o path anterior desse novo path que estamos colocando. Caso já houvesse, por exemplo, o valor %SystemRoot%\system32 na variável do sistema PATH, o valor final ficaria %SystemRoot%\system32;%JAVA_HOME%\bin. Pronto, feche todas as janelas e abra o prompt, indo em Iniciar, Executar e digite cmd. Após a instalação no seu Windows teste seu java com os comandos: java -version javac -version
  13. Fala galera, andei sumido do fórum, mas estou voltando com força total, irei postar uma serie de postagens que é um curso completo de java. Iremos iniciar com java primeiros passos, passar para Orientação a Objetos e analise de erros. Será apenas textual por hora, mas em breve todos esses textos iremos te vídeos. E em cada texto terá um Questionário ou exercícios para vocês fazerem lab, afinal só aprendemos a programar praticando. Irei postar ainda hoje todo conteúdo de java primeiros passos, e ja estou preparando o Orientação a Objeto. A linguagem Java Entender um pouco da história da plataforma Java é muito importante para enxergar os motivos que a levaram ao sucesso. Quais eram os maiores problemas para programadores na década de 1990? ponteiros? gerenciamento de memória? organização? falta de bibliotecas? ter de reescrever parte do código ao mudar de sistema operacional? custo financeiro de usar a tecnologia? A linguagem Java resolve bem esses problemas, que até então apareciam com frequência nas outras linguagens. Alguns desses problemas foram particularmente atacados porque uma das grandes motivações para a criação da plataforma Java era de que essa linguagem fosse usada em pequenos dispositivos, como tvs, videocassetes, aspiradores, liquidificadores e outros. Apesar disso a linguagem teve seu lançamento focado no uso em clientes web (browsers) para rodar pequenas aplicações (applets). Hoje em dia esse não é o grande mercado do Java: apesar de ter sido idealizado com um propósito e lançado com outro, o Java ganhou destaque no lado do servidor. O Java foi criado pela Sun (http://www.sun.com) e mantida através de um comitê (http://www.jcp.org). Seu site principal era o java.sun.com, e java.com um site mais institucional, voltado ao consumidor de produtos e usuários leigos, não desenvolvedores. Com a compra da Sun pela Oracle em 2009, muitas URLs e nomes tem sido trocados para refletir a marca da Oracle. A página principal do Java é: http://www.oracle.com/technetwork/java/. No Brasil, diversos grupos de usuários se formaram para tentar disseminar o conhecimento da linguagem. Um deles é o GUJ (http://www.guj.com.br), uma comunidade virtual com artigos, tutoriais e fórum para tirar dúvidas, o maior em língua portuguesa com mais de cem mil usuários e 1 milhão de mensagens. Encorajamos todos os alunos a usar muito os fóruns do mesmo, pois é uma das melhores maneiras para achar soluções para pequenos problemas que acontecem com grande frequência. Máquina Virtual Em uma linguagem de programação como C e Pascal, temos a seguinte situação quando vamos compilar um programa: o código fonte é compilado para código de máquina específico de uma plataforma e sistema operacional. Muitas vezes o próprio código fonte é desenvolvido visando uma única plataforma! Esse código executável (binário) resultante será executado pelo sistema operacional e, por esse motivo, ele deve saber conversar com o sistema operacional em questão. Isto é, temos um código executável para cada sistema operacional. É necessário compilar uma vez para Windows, outra para o Linux, e assim por diante, caso a gente queira que esse nosso software possa ser utilizado em várias plataformas. Esse é o caso de aplicativos como o OpenOffice, Firefox e outros. Na maioria das vezes, a sua aplicação se utiliza das bibliotecas do sistema operacional, como, por exemplo, a de interface gráfica para desenhar as "telas". A biblioteca de interface gráfica do Windows é bem diferente das do Linux: como criar então uma aplicação que rode de forma parecida nos dois sistemas operacionais? Precisamos reescrever um mesmo pedaço da aplicação para diferentes sistemas operacionais, já que eles não são compatíveis. Já o Java utiliza do conceito de máquina virtual, onde existe, entre o sistema operacional e a aplicação, uma camada extra responsável por "traduzir" - mas não apenas isso - o que sua aplicação deseja fazer para as respectivas chamadas do sistema operacional onde ela está rodando no momento. Dessa forma, a maneira com a qual você abre uma janela no Linux ou no Windows é a mesma: você ganha independência de sistema operacional. Ou, melhor ainda, independência de plataforma em geral: não é preciso se preocupar em qual sistema operacional sua aplicação está rodando, nem em que tipo de máquina, configurações, etc. Repare que uma máquina virtual é um conceito bem mais amplo que o de um interpretador. Como o próprio nome diz, uma máquina virtual é como um "computador de mentira": tem tudo que um computador tem. Em outras palavras, ela é responsável por gerenciar memória, threads, a pilha de execução, etc. Sua aplicação roda sem nenhum envolvimento com o sistema operacional! Sempre conversando apenas com a Java Virtual Machine (JVM). Essa característica é interessante: como tudo passa pela JVM, ela pode tirar métricas, decidir onde é melhor alocar a memória, entre outros. Uma JVM isola totalmente a aplicação do sistema operacional. Se uma JVM termina abruptamente, só as aplicações que estavam rodando nela irão terminar: isso não afetará outras JVMs que estejam rodando no mesmo computador, nem afetará o sistema operacional. Essa camada de isolamento também é interessante quando pensamos em um servidor que não pode se sujeitar a rodar código que possa interferir na boa execução de outras aplicações. Essa camada, a máquina virtual, não entende código java, ela entende um código de máquina específico. Esse código de máquina é gerado por um compilador java, como o javac, e é conhecido por "bytecode", pois existem menos de 256 códigos de operação dessa linguagem, e cada "opcode" gasta um byte. O compilador Java gera esse bytecode que, diferente das linguagens sem máquina virtual, vai servir para diferentes sistemas operacionais, já que ele vai ser "traduzido" pela JVM. Momento lab! 1- Qual a Importancia do Java? 2- Cite Três Aplicações do Java!
  14. Gente em breve teremos Novidades!
    1. vitorGOMES13

      vitorGOMES13

      nudes dá maria joaquina, na zona adultera ?
    2. vitorGOMES13

      vitorGOMES13

      ué e num é que é verdura, ficou nem um ano kkkkk
×
×
  • Create New...