Java

De ROMHackingWiki

Tabela de conteúdo

Histórico

Em 1991, na Sun Microsystems, foi iniciado o Green Project, o berço do Java uma linguagem de programação orientada a objetos. Os mentores do projeto eram Patrick Naughton, Mike Sheridan, e James Gosling. O objetivo do projeto não era a criação de uma nova linguagem de programação, mas antecipar e planejar a “próxima onda” do mundo digital. Eles acreditavam que em algum tempo haveria uma convergência dos computadores com os equipamentos e eletrodomésticos comumente usados pelas pessoas no seu dia-a-dia.

Para provar a viabilidade desta idéia, 13 pessoas trabalharam arduamente durante 18 meses. No verão de 1992 eles emergiram de um escritório de Sand Hill Road no Menlo Park com uma demonstração funcional da idéia inicial. O protótipo se chamava *7 (leia-se “StarSeven”), um controle remoto com uma interface gráfica touchscreen. Para o *7 foi criado um mascote, hoje amplamente conhecido no mundo Java, o Duke. O trabalho do Duke no *7 era ser um guia virtual ajudando e ensinando o usuário a utilizar o equipamento. O *7 tinha a habilidade de controlar diversos dispositivos e aplicações. James Gosling especificou uma nova linguagem de programação para o *7. Gosling decidiu batizá-la de “Oak”, que quer dizer carvalho, uma árvore que ele podia observar quando olhava pela sua janela.

O próximo passo era encontrar um mercado para o *7. A equipe achava que uma boa idéia seria controlar televisões e vídeo por demanda com o equipamento. Eles construíram um demo chamado MovieWood, mas infelizmente era muito cedo para que o vídeo por demanda bem como as empresas de TV a cabo pudessem viabilizar o negócio. A idéia que o *7 tentava vender, hoje já é realidade em programas interativos e também na televisão digital. Permitir ao telespectador interagir com a emissora e com a programação em uma grande rede cabos, era algo muito visionário e estava muito longe do que as empresas de TV a cabo tinham capacidade de entender e comprar. A idéia certa, na época errada.

A sorte é que o boom da Internet aconteceu, e rapidamente uma grande rede interativa estava se estabelecendo. Era este tipo de rede interativa que a equipe do *7 estava tentando vender para as empresas de TV a cabo. E, da noite para o dia, não era mais necessário construir a infra-estrutura para a rede, em um golpe de sorte, ela simplesmente esta lá. Gosling foi incumbido de adaptar o Oak para a Internet e em janeiro 1995 foi lançada uma nova versão do Oak que foi rebatizada para Java. A tecnologia Java tinha sido projetada para se mover através de redes de dispositivos heterogêneos, redes como a Internet. Agora aplicações poderiam ser executadas dentro dos Browsers nos Applets Java e tudo seria disponibilizado pela Internet instantaneamente. Foi o estático HTML dos Browsers que promoveu a rápida disseminação da dinâmica tecnologia Java. A velocidade dos acontecimentos seguintes foi assustadora, o número de usuários cresceu rapidamente, grandes players, como a IBM anunciaram suporte para a tecnologia Java.

Desde seu lançamento, em maio de 1995, a plataforma Java foi adotada mais rapidamente do que qualquer outra linguagem de programação na história da computação. Em 2003 Java atingiu a marca de 4 milhões de desenvolvedores em todo mundo. Java continuou e continua crescendo e hoje é com certeza um padrão para o mercado oferecendo qualidade, performance e segurança ainda sem nenhum competidor a altura. Java tornou-se popular pelo seu uso na Internet e hoje possui seu ambiente de execução presente em web browsers, mainframes, SOs, celulares, palmtops e cartões inteligentes, entre outros.

Principais Características da Linguagem Java

A linguagem Java foi projetada tendo em vista os seguintes objetivos:

  • Orientação a objeto - Baseado no modelo de Smalltalk e Simula67;
  • Portabilidade - Independência de plataforma - "write once run anywhere";
  • Recursos de Rede - Possui extensa biblioteca de rotinas que facilitam a cooperação com protocolos TCP/IP, como HTTP e FTP;
  • Segurança - Pode executar programas via rede com restrições de execução;
  • Bytecode interpretado, ao invés de compilado.

Além disso, podem-se destacar outras vantagens apresentadas pela linguagem:

  • Sintaxe similar a Linguagem C/C++.
  • Facilidades de Internacionalização - Suporta nativamente caracteres Unicode;
  • Simplicidade na especificação, tanto da linguagem como do "ambiente" de execução (JVM);
  • É distribuída com um vasto conjunto de bibliotecas (ou APIs);
  • Possui facilidades para criação de programas distribuídos e multitarefa (múltiplas linhas de execução num mesmo programa);
  • Desalocação de memória automática por processo de coletor de lixo;
  • Carga Dinâmica de Código - Programas em Java são formados por uma coleção de classes armazenadas independentemente e que podem ser carregadas no momento de utilização.

Máquina Virtual Java

Programas Java não são traduzidos para a linguagem de máquina como outras linguagens estaticamente compiladas e sim para uma representação intermediária, chamada de bytecodes.

Os bytecodes são interpretados pela máquina virtual Java (JVM - Java Virtual Machine). Muitas pessoas acreditam que por causa desse processo, o código interpretado Java tem baixo desempenho. Durante muito tempo esta foi uma afirmação verdadeira. Porém novos avanços tem tornado o compilador dinâmico (a JVM), em muitos casos, mais eficiente que o compilador estático.

Java hoje já possuiu uma performace próxima do C++. Isto é possível graças a otimizações como a compilação especulativa, que aproveita o tempo ocioso do processador para pré-compilar bytecode para código nativo. Outros mecanismos ainda mais elaborados como o HotSpot da Sun, que guarda informações disponíveis somente em tempo de execução (ex.: número de usuários, processamento usado, memória disponível), para otimizar o funcionamento da JVM, possibilitando que a JVM vá "aprendendo" e melhorando seu desempenho. Isto é uma realidade tão presente que hoje é fácil encontrar programas corporativos e de missão crítica usando tecnologia Java. No Brasil, por exemplo, a maioria dos Bancos utiliza a tecnologia Java para construir seus home banks, que são acessados por milhares de usuários diariamente. Grandes sites como o eBay utilizam Java para garantir alta performace. E a cada ano Java tem se tornado mais rápido, na medida que se evolui o compilador dinâmico.

Os bytecodes produzidos pelos compiladores Java podem ser usados num processo de engenharia reversa para a recuperação do programa-fonte original. Esta é uma característica que atinge em menor grau todas as linguagens compiladas. No entanto já existem hoje tecnologias que "embaralham" e até mesmo criptografam os bytecodes praticamente impedindo a engenharia reversa.

Exemplos de código

Metodo main

O método main é onde o programa inicia. Pode estar presente em qualquer classe. Os parâmetros de linha de comando são enviados para a array args[], do tipo String.

public class OlaMundo {
   public static void main(String args[]) {
      System.out.println("Olá Mundo!");
   }
}

Classes e a criação de Classes

Definimos uma Classe como sendo um gabarito para a definição de objetos. Por meio da definição de uma Classe, descreve-se quais propriedades ou atributos e seus métodos, o objeto terá. PS: Todas as classes em java derivam de Object. Exemplos:

Atributos de Classe

Atributo ou o conjunto de Atributos descreve as propriedades da classe, e cada atributo é identificado por um nome e um tipo.

Exemplo:

String macaco;

nota: em JAVA, existem tipos primitivos como: int, double, boolean. mas para a manipulação de textos utilizamos a classe String que é nativa do java.

Métodos de Classe

Os métodos definem as funcionalidades da classe, ou seja, o que será possível fazer com objetos dessa classe. Cada método é identificado por um nome, um valor de retorno e a lista de argumentos, sendo que cada argumento deverá ter uma identificação própria.

Exemplo 1:

void baterNoMacaco();//método sem retorno e sem passagem de parâmetros.

Exemplo 2:

double calcularSoma(double x,double y);//método com retorno e com passagem de parâmetros.

PS: Utilizando o mecanismo de sobrecarga (overloading), dois métodos de uma classe podem ter o meno nome, mas devem se diferenciar em suas assinaturas.

Exemplo:

void baterNoMacaco(Porrete x);
void baterNoMacaco(Travesseiro x);

Visibilidade

O Modificador de visibilidade pode estar presente tanto na criação de classes (como uma classe interna), atributos e ou métodos.

Em princípio, três categorias de visibilidade podem ser definidas:

  • public (Público) - Todos podem acessar um atributo ou método com essa visibilidade.
  • private (Privado) - Ninguém (a não ser a própria classe que a detém) podem acessar um atributo ou método com essa visibilidade (diretamente).
  • protected (Protegido) - Apenas as classes derivadas (Herança) podem acessar um atributo ou método com essa visibilidade.

nota: a omissão da visibilidade implica que o atributo ou método é público.

Exemplo de uma classe completa.

public class Aluno {
   private int matricula;
   private String nome;
   private double nota1,nota2;

   public double calcularMedia(){
      return (x+y)/2;
   } 
}

Herança

Este mecanismo permite que uma classe consiga usar os métodos e atributos exixtentes em uma classe pai (super classe).

Exemplo:

public class Pessoa{
    private String nome;
    private int idade;
}
public class Aluno extends Pessoa{
   private String matricula;
   private String turma;
   private double nota1,nota2;
   //método acessa o atributo nome diretamente
   public String obterNome(){
       return nome;
   }
}

Interfaces

Uma interface modela um comportamento esperado. Pode-se entende-la como uma classe que contenha apenas métodos abstratos. Embora uma classe não possa conter mais de uma superclasse, a classe pode implementar mais de uma interface. Exemplo:

nota: toda classe que implementa uma interface DEVE implementar seus métodos abstratos.

public interface Calculadora {
   public double soma(double x,double y);
   public double multiplicacao(double x,double y);
   public double subtracao(double x,double y);
   public double divisao(double x,double y);
}
public class Matematica implements Calculadora {
   //Implementação da interface Calculadora 
   public double soma(double x,double y){
        return x+y;
   }
   public double multiplicacao(double x,double y){
        return x*y;
   }
   public double subtracao(double x,double y){
        return x-y;
   }
   public double divisao(double x,double y){
        return x/y;
   }
}

Classes internas

Uma das principais diferenças do C++ é que o Java pode ter classes internas. Exemplos:

public class Cavalo extends Animal {
   public void fazerBarulho() {
       System.out.println("RIINCH!");
   }

   //Classe interna e privada. Existe só no contexto do cavalo.
   private class Parasita extends Animal { 
       public void fazerBarulho() {
           System.out.println("SQRRT");
       }
   }
}   

Objetos

Objetos são basicamente instâncias de classe. A maior parte das operações de sistemas orientados a objetos ocorre por meio de objetos.

Objetos podem representar também uma entidade (abstrata ou concreta).

No momento da criação de um objeto (palavra reservada new) é reservado um espaço em memória para a sua criação contendo: seu endereço em memória (a própria linguagem se encarrega deste processo), seu estado e seus atributos e metodos.

'Exemplo:'

Macaco macaco = new Macaco(); // criando um objeto macaco

Objetos e classes anônimos

Podemos também objetos e ou classes anônimas, exemplo:

public class MostraBarulho {
   public static void main(String args[]) {
       new Cavalo().fazerBarulho(); //Objeto anônimo.

       //Abaixo um objeto e classe anônimos!
       new Animal() {
           public void fazerBarulho() {
               System.out.println("QUAC!");
           }
       }.fazerBarulho();
   }
}

Exemplo

public class Pessoa {

	private String nome;
	private int cpf;
	private int idade;
 
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public int getCpf() {
		return cpf;
	}
	public void setCpf(int cpf) {
		this.cpf = cpf;
	}
	public int getIdade() {
		return idade;
	}
	public void setIdade(int idade) {
		this.idade = idade;
	}
}
public class Gerente extends Pessoa {

	private double salarioBruto;
 
	public double getSalarioBruto() {
		return salarioBruto;
	}
	public void setSalarioBruto(double salarioBruto) {
		this.salarioBruto = salarioBruto;
	}
	
	public double calcularSalarioLiquido(){
		return (getSalarioBruto()+(getSalarioBruto()*0.5));
 
	}
}
import java.util.Scanner;
public class ClassePrincipal {
 
	public static void main(String[] args) {
 
		Scanner entrada = new Scanner(System.in);
 
		Gerente gerente = new Gerente();
 
		System.out.println("-----COMEÇO-----");
		//inserindo os dados
		System.out.println("INFORME O NOME: ");
		gerente.setNome(entrada.next());
 
               System.out.println("INFORME O CPF: ");
		gerente.setCpf(entrada.nextInt());
 
		System.out.println("INFORME O IDADE: ");
		gerente.setIdade(entrada.nextInt());
 
		System.out.println("INFORME O SALARIO BRUTO: ");
		gerente.setSalarioBruto(entrada.nextDouble());
 
 		//exibindo os dados
 
		System.out.println("-----------------");
		System.out.println("Nome           : "+gerente.getNome());
		System.out.println("CPF            : "+gerente.getCpf());
		System.out.println("IDADE          : "+gerente.getIdade());
		System.out.println("SALARIO BRUTO  : "+gerente.getSalarioBruto());
		System.out.println("SALARIO LIQUIDO: "+gerente.calcularSalarioLiquido());
		System.out.println("------FIM--------");
 }
}

Extensões

Extensões em Java:

  • J2SE (Standard Edition)
  • J2EE (Enterprise Edition)
  • J2ME (Micro-Edition for PDAs and cellular phones)
  • JMF (Java Media Framework)
  • JNDI (Java Naming and Directory Interface)
  • JSML (Java Speech API Markup Language)
  • JDBC (Java Database Connectivity)
  • JDO (Java Data Objects)
  • JAIN (Java API for Integrated Networks)
  • JDMK (Java Dynamic Management Kit)
  • Jini (a network architecture for the construction of distributed systems)
  • Jiro
  • JXTA (open source-based peer-to-peer infrastructure)
  • Java Card
  • JavaSpaces
  • JMI (Java Metadata Interface)
  • JMX (Java Management Extensions)
  • JSP (JavaServer Pages)
  • JSF (JavaServer Faces)
  • JNI (Java Native Interface)
  • J3D (A high level API for 3D graphics programming)
  • JOGL (A low level API for 3D graphics programming, using OpenGL)
  • OSGi (Dynamic Service Management and Remote Maintenance)
  • SuperWaba (JavaVMs for handhelds)
  • MARF (Modular Audio Recognition Framework)

Comunidade

A comunidade de desenvolvedores Java reúne-se em grupo denominados JUGs (Java User Groups). No Brasil o movimento de grupos de usuários expandiu-se bastante e tem formado alguns dos maiores grupos de usuários Java do mundo.

Curiosidades

O número mágico de uma classe Java, quando representado em Hexadecimal fica 0xCAFEBABE. Leia abaixo:

"Strangely enough the magic number for .class files was chosen long before the name Java was ever uttered in reference to this language. We were looking for something fun, unique and easy to remember. 0xcafebabe was better than the second runner-up, 0xdeadbabe. :-)

It is only a coincidence that the oblique reference to the cute barristas at Peet's Coffee was foreshadowing for the name Java."

Patrick Naughton

Predefinição:Links Externos

Ferramentas pessoais