Posts de Março, 2007

Configuração básica do FluxBox

Março 30, 2007


http://fluxbox.sourceforge.net/

Fluxbox é um gerenciador de janelas livre, pequeno, rápido e leve para X Window System baseado no código do BlackBox 0.61.1. O Fluxbox se encontra na versão 1.0rc3. É escrito em C++.

Uma de suas capacidades é o suporte para abas de janelas (janelas diferentes podem ser agrupadas em abas de uma mesma janela).
Ele também pode executar ações (como minimizar uma janela ou executar um comando pré-determinado) em resposta a seqüências de teclas, de maneira semelhante ao Emacs. Essas e outras funcionalidades podem ser configuradas.
Outras funcionalidades estão descritas na página principal do seu website.

Configuração:

Todos os arquivos de configuração do fluxbox encontram-se na pasta do usuário:

~/.fluxbox

(~/.fluxbox – significa que os arquivos encontram-se no diretorio /home/usuario/fluxbox, sendo que este diretório, está oculto, para facilitar a operação de configuração você poderá configurar o seu navegador de arquivos para visualizar os arquivos ocultos).

Dentro do diretorio /fluxbox, você encontrara vários arquivos de configuração e subdiretórios, sendo os mais importantes para a configuração:

menu: (Configura o menu da interface).

init: (Configuração da interface).

styles: Diretório onde você poderá adicionar temas para sua interface.

~/.fluxbox/styles

backgrounds: Diretório onde você poderá adicionar papéis de parede.

~/.fluxbox/backgrounds

Configuração do menu:

O menu apresenta uma estrutura simples de comandos, basta ver como estão esses comandos e acrescentar entradas para os programas que se desejar.

[begin] (Titulo do menu) {} – Titulo do menu.

[end] – Finaliza um submenu.

[submenu] (Titulo – Submenu) {} – Cria submenus para se inserir links para aplicativos.

[exec] (Titulo – Aplicativo) {Comando} – Executa um aplicativo.

[exec] (Titulo – Serviço) {sudo /etc/init.d/serviço Opção} – Starta ou para um serviço.

[config] (Configurar) {} – Gera um submenu com as opções default de configuração do fluxbox.

[reconfig] (Reconfigurar) {} – Reconfigura a interface sem reiniciar.

[restart] (Reiniciar) {} – Reinicia o fluxbox sem fazer logof.

[exit] (Sair do Fluxbox) {} – Sair do Fluxbox

[separator] () {} – Gera uma linha separando ítens no menu.

[stylesdir] (~/.fluxbox/styles) {} – Gera uma entrada de menu que mostra os styles que estão na pasta especificada (~/.fluxbox/styles) , o local dos styles pode ser modificado a vontade , desde que o caminho da pasta dos styles esteja corretamente indicado no comando .

[wallpapers] (~/.fluxbox/backgrounds) {} – Gera uma entrada de menu que mostra os papéis de parede que estão na pasta especificada (~/.fluxbox/backgrounds) , o local dos papéis de parede pode ser modificado a vontade , desde que o caminho da pasta dos papéis de parede esteja corretamente indicado no comando.

Configuração da interface:

A configuração da interface pode ser feita diretamente pelo menu do fluxbox (Utilizando a entrada de menu [config]) ou através da edição do arquivo init (~/.fluxbox/init).

Configuração do visual do fluxbox : Styles

Todo o visual do fluxbox é definido nos arquivos de styles , são esses arquivos que definem como será o visual da barra de tarefa , botões da barra de tarefa , barra de título das janelas , botões das janelas , menu , borda das janelas , bordas da barra de tarefa , bordas do menu , etc

O próprio menu de configuração do fluxbox também tem algumas opções de configurações importantes que afetam de forma siguinificativa o visual da interface , são elas :

AntiAlias – Ativa o uso de fontes truetype na interface (deve ser mantido ligado sempre)

Menu Alpha – Ativa a transparencia no menu da interface , é um número que vai de 0-255 , quanto menor o número mais transparencia , 0 = transparencia total
255 = sem transparencia alguma.

Slit – Ativa a transparencia no slit seguindo o mesmo funcionamento do
Menu Alpha , slit é um recurso do fluxbox para ter compatibilidade com as dockapps do windowmaker.

Você poderá configurar o seu desktop utilizando uma ferramenta gráfica, que é instalada junto com o Fluxbox, para isso, abra um console e digite:

#fluxbare

Esta ferramenta lhe dará varias opções de configuração, como teclas de atalhos, configuração de locais para arquivos de temas, papeis de paredes, e uma ferramenta para se montar o menu.

Exemplo de Menu:

[begin] (BlogEtilico) {}
[submenu] (Configuracao) {}
[exec] (FluxBare) {fluxbare}
[workspaces] (Areas de trabalho) {}
[config] (Configurar o Fluxbox) {}
[reconfig] (Reconfigurar o Fluxbox) {}
[restart] (Reiniciar o Fluxbox) {}
[end]
[separator] () {}
[submenu] (Papeis de parede) {}
[wallpapers] (~/.fluxbox/backgrounds) {}
[end]
[separator] () {}
[submenu] (Aplicativos) {}
[exec] (Terminal) {gnome-terminal}
[exec] (Gedit) {gedit}
[exec] (Netbeans) {/home/usuario/netbeans/bin/netbeans}
[exec] (Terminal – Root) {sudo gnome-terminal}
[exec] (Nautilus) {nautilus –no-desktop}
[end]
[separator] () {}
[submenu] (Serviços) {}
[exec] (Apache START) {sudo /etc/init.d/apache start}
[exec] (Apache STOP) {sudo /etc/init.d/apache stop}
[end]
[separator] () {}
[submenu] (Desligar – Reiniciar – Sair) {}
[exit] (Sair do Fluxbox) {}
[exec] (Reiniciar o computador) {sudo /sbin/reboot}
[exec] (Desligar o computador) {sudo /sbin/halt}
[end]
[end]

(Para utilizar o Nautilus, como gerenciador de arquivos no Fluxbox, use o comando –no-desktop)

Introdução a Orientação a Objetos – Primeira parte

Março 30, 2007

A orientação a objetos, é um paradigma de análise, projeto e programação de sistemas de software baseado na composição e interação entre diversas unidades de software chamadas de objetos.
O termo orientação a objetos pressupõe uma organização de software em termos de coleção de objetos discretos incorporando estrutura e comportamento próprios.
O enfoque de modelagem por objetos, vê o mundo como uma coletânea de objetos que interagem entre si, apresentam características próprias que são representadas pelos seus atributos (dados) e operações (métodos ou serviços).
Resumidamente, a mudança de enfoque (entre estruturado e orientado a objetos) é justificada pelo fato de que objetos existem na natureza muito antes de haver qualquer tipo de aplicação deles pelo negócio. Equipamento, pessoas, minerais, petróleo, etc., existem por si só e apresentam características peculiares representadas pelos seus atributos e, adiante, pelo seu comportamento no mundo real.

Este tipo de abordagem, oferece os seguintes benefícios:

Manter a modelagem do sistema, e em decorrência, sua automação o mais próximo possível de uma visão conceitual do mundo real;
Servir de base à decomposição e modelagem do sistema nos dados, que é o elemento mais estável de todos aqueles que compõem um sistema de informação e
Oferecer maior transparência na passagem da fase de modelagem para a de construção através da introdução de detalhes, não requerendo uma reorganização do modelo.

Um aspecto interessante da teoria de objetos é a sua característica intríseca de analisar o mundo como ele é, permitindo organizar resultados de maneira mais fácil e natural. Procura representar o mundo real como o vemos, pessoas, lugares e coisas existentes que se comportam como objetos e que possuem características próprias de atributos e operações. Por definição, a teoria de objetos espelha o mundo de forma mais simples do que modelos algorítmicos ou estruturados.

Principais palavras chaves na Teoria da Orientação a Objetos:

Atributo:
Característica particular de uma ocorrência da classe.
(Indivíduo possui nome, sexo, data de nascimento)

Classe:
Agrupamento de objetos similares que apresentam os mesmos atributos e métodos.
(Indivíduo, caracterizando as pessoas do mundo)

Encapsulamento:
Combinação de atributos e métodos em uma classe.
Atributo: data do nascimento.
Método: cálculo da idade a partir da data do nascimento.

Especificação:
Atributos e métodos diferentes de uma subclasse, acrescentando ou substituindo características herdadas da classe pai.
Subclasses [Organização] e [indivíduo] acrescentam atributos e métodos distintos da superclasse.

Estado:
Situação de um objeto em um dado instante de tempo.
(Emitindo nota fiscal)

Evento:
Uma ocorrência significativa no mundo real que deve ser tratada.
(Pedido tomado, entrega efetuada, ponto de solicitação de material atingido)

Generalização:
Atributos e operações comuns compartilhados por classes.
Superclasse [Parte] ou [Pessoa] como generalização das subclasses [Organização] e Indivíduo.

Herança:
Compartilhamento pela subclasse dos atributos e operações da classe pai.
Subclasse Eucalipto compartilha atributos e operações da classe Árvore.

Instância de classe:
Uma ocorrência específica de uma classe.
É o mesmo que objeto. Uma pessoa, uma organização, um equipamento, uma localização geográfica.

Mensagem:
Uma solicitação entre objetos para invocar certo método.
Informar a idade da pessoa.

Objeto:
Elemento do mundo real (natureza).
Sinônimo de instância de classe.
Uma pessoa: “Fulano de Tal”.

Métodos (serviços):
Lógica contida em uma classe para designar-lhe um comportamento.
Cálculo da idade de uma pessoa em uma classe.

Polimorfismo (sobrecarga):
Habilidade para usar a mesma mensagem para invocar comportamentos diferentes do objeto.
Chamada da operação: “calcularSaldo” de correntista. Invoca as derivações correspondentes para cálculo de saldo de poupança, renda fixa, fundo de ações, etc.

SubClasse:
Característica particular de uma classe.
Classe Árvore -> subclasses Ipê, Jacarandá, Eucalipto, etc.

Conceitos de Orientação a Objetos:

Abstração OO:

Habilidade mental que permite aos seres humanos visualizarem os problemas do mundo real com vários graus de detalhe, dependendo do contexto corrente do problema.
[Rumbaugh]

Abstração é a habilidade de concentrar nos aspectos essenciais de um contexto qualquer, ignorando características menos importantes ou acidentais. Em modelagem orientada a objetos, uma classe é uma abstração de entidades existentes no domínio do sistema de software.
(Um objeto é uma ocorrência específica (instância) de uma classe).

Por exemplo, imaginamos a abstração referente a classe Animais. Há várias entidades na classe Animais como Anfíbios, Répteis e Mamíferos que são também sub-classes da classe Animais, onde há objetos que contêm cada sub-classe como Ser humano, Jacaré e outros.

Objeto:

Um objeto é uma ocorrência específica (instância) de uma classe e é similar a uma entidade/tabela no modelo relacional, somente até o ponto onde representa uma coleção de dados relacionados com um tema comum.
A diferença entre objeto e entidade/tabela é que o primeiro é uma ocorrência de uma classe, que, por sua vez, é um conjunto de objetos similares em atributos e métodos onde a estrutura de classe define como o objeto é criado e se comporta durante a vida. Um objeto possui todo o que é necessário para conhecer a si próprio, há o encapsulamento de métodos e atributos atribuindo-lhe vida própria.
É uma abstração de alguma coisa em um domínio do problema, de maneira autocontida e identificável, refletindo a capacidade de manter um estado de si, encapsulando valores de atributos e serviços exclusivos.
Não muda de identidade, comportamento ou atributos definidos por sua classe, podendo conter dados privados ou atributos que são alterados para representar o estado atual do objeto.
Atributos e operações utilizados para controlar seu comportamento, são encapsulados dentro do objeto, às vezes fora do alcance dos demais objetos.

mensagem:

Objetos se comunicam através de mensagens, isto é, um sinal enviado de um objeto a outro requisitando serviços através da execução de uma operação. Trata-se de um ciclo completo onde uma mensagem é enviada a um objeto, métodos são executados dentro desse com base nos dados de seu alcance na hierarquia de classes, e uma mensagem contendo o resultado da operação é enviada ao objeto solicitante. Funciona como uma fábrica que recebe uma ordem de produção (mensagem de solicitação), processa esta ordem (métodos) utilizando matéria-prima (atributos) e gera um produto final (mensagem de resposta).

Polimorfismo:

Adjacente ao conceito de mensagem, há o conceito de polimorfismo, cuja palavra é originária do grego “muitas formas”. Tais formas se referem aos vários comportamentos que uma mesma operação pode assumir, assim como à capacidade de uma variável referir-se a objetos diferentes que preenchem certas responsabilidades como um conceito em teoria de tipo no qual um nome (como uma declaração de variável) pode denotar objetos de muitas subclasses diferentes que estão relacionadas por alguma superclasse comum, assim, qualquer objeto denotado por esse nome tem a capacidade de responder a algum conjunto comum de métodos de formas diferentes.

Classe:

Classe é uma coleção de objetos que podem ser descritos com os mesmos atributos e os mesmos métodos. Representa a idéia ou um conceito simples e categoriza objetos que possuem propriedades similares, configurando-se em um modelo para a criação de novas instâncias.

Na construção de classes, há a possibilidade de ocorrer uma conexão semântica de elementos de modelo entre pai e filho na qual uma classe filha (subclasse) herda as propriedades de seu pai (super classe) direta ou indiretamente. Cada classe pode ter suas propriedades particulares herdadas diretamente da classe pai ou substituída / mascarada nessa transição, assim somente propriedades diferentes serão declaradas na classe filha. Quando é criada uma nova classe a partir de uma existente, a nova classe (uma subclasse) automaticamente herda todas as propriedades e comportamentos da classe base (a super classe).
Uma classe base estabelece uma interface comum para um grupo de classes ou descreve o alcance de mensagens para os objetos dentro de uma classe. Esse mecanismo retrata mais um conceito da orientação a objetos: a herança.

Herança:

Herança é a capacidade de um novo objeto tomar atributos e operações de um objeto existente, permitindo criar classes complexas sem repetir código, a nova classe simplesmente herda seu nível base de características de um antepassado na hierarquia de classe. Também pode reimplementar (ou sobreescrever) métodos selecionados, já que subclasses tiram proveito do comportamento das classes acima na hierarquia passando propriedades de uma classe pai a uma classe filha.

Por exemplo, a classe Automóvel pode conter propriedades genéricas incluindo potência, capacidade de passageiros, etc. A subclasse Automóvel Esportivo pode herdar as propriedades da classe Automóvel e então modificar as propriedades. A subclasse Porsche pode herdar todas as propriedades da classe Automóvel Esportivo e assim modificar ou adicionar as propriedades específicas a objeto “Porsche”. Se uma classe herda comportamentos (métodos) e atributos de mais de uma classe é denominado de herança múltipla, uma variação semântica de generalização na qual um tipo pode ter mais de um supertipo.

Dependência e Coesão de classes:

Dependência refere-se ao conhecimento que uma classe possui de outra – o objetivo é o de minimizar a dependência para evitar impactos em uma classe decorrentes de modificações em outra classe. Coesão é uma medida de integridade conceitual de uma nova classe – o objetivo nesse caso, é o de maximizar a coesão pra assegurar agrupamento de métodos e com isso reduzir esforços de manutenção.

JAVA – Conceitos básicos – Terceira parte

Março 23, 2007

Incremento e Decremento.

São operadores utilizados em Java para facilitar o processo de desenvolvimento. Sua estrutura é semelhante ao incremento e decremento da linguagem C. Abaixo, é apresentado um exemplo de utilização destes operadores no qual o incremento e o decremento são realizados antes da atribuição.

Operadores que incrementam ou decrementam valores antes da atribuição:

int a = 10;
int b = 5;
int x = ++a;
int y = ++b;

Neste caso, o valor de x e y seria 11 e 6.

Operadores que incrementam ou decrementam valores depois da atribuição:

int a = 10;
int b = 5;
int x = a++;
int y = b++;

Neste caso, o valor de x e y seria 10 e 5.

Operadores Relacionais.

São os operadores utilizados para realizar comparações matemáticas e lógicas. Abaixo uma tabela que apresenta os principais operadores:

!= – Diferente de
== – Igual a
> – Maior que
= – Maior ou igual a

Operador Ternário.

Este operador é considerado uma contração do IF. Considere a fórmula abaixo, caso “expressão” for verdadeiro, “variável” recebe o valor definido em “true”, caso contrário, “variável” recebe o valor definido em false.

Sintaxe:

variavel = expressao? true:false;

Utilização do Operador Ternário:

int y = 100;
int x = (y != 0) ? 50 : 500;

Sintaxe da Linguagem.

Comando if-else.

Neste comando, é definida uma expressão booleana que, ao ser avaliada, pode gerar um resultado verdadeiro ou falso.
Se o resultado for verdadeiro, a instrução é executada. Caso contrário, se o resultado for falso, a instrução definida em “else” é executada. Contudo, o else é opcional, caso nenhuma ação venha a ser executada quando a comparação for falsa, basta apenas omiti-la. Além disso, é permitido aninhar vários comandos “if” definindo outra expressão booleana a ser avaliada.

if (expressão booleana){
instruções;
}else if (expressão booleana){
instruções;
}else{
instruções;
}

Comando while

Estrutura de repetição na qual uma instrução é executada de acordo com o resultado da avaliação de uma expressão booleana. Quando a expressão booleana for verdadeira, a instrução é executada. Caso contrário, a instrução não é executada. No while, o valor da expressão booleana deve ser alterada a partir de uma instrução. Caso contrário, pode ocorrer um laço-infinito no qual o comando não deixará de ser executado travando outras execuções do código.

while (expressão booleana){
instruções;
}

Comando for.

Estrutura de repetição na qual uma instrução é executada de acordo com uma expressão condicional.
Em “inicialização”, é inicializada a variável a ser avaliada na expressão booleana. Se o resultado for verdadeiro, a instrução é executada e o valor da variável é atualizado na seção “passo de repetição”.

for (inicialização; expressões booleanas; passo da repetição){
instruções;
}

Comandos break e continue.

O comando ‘go-to’ definido em algumas linguagens para sair de laços em alguma condição excepcional não foram definidos no Java. A justificativa é que este tipo de estrutura tornar a leitura dos códigos uma tarefa complexa. O Java trata esta situação com as declarações break e continue para sair de laços ou de um método.

break: interrompe a execução do bloco de repetição, o programa continua com a próxima instrução, logo após o bloco.

continue: interrompe a execução da iteração, testa a condição e reinicia o bloco com a próxima iteração.

Comando Switch.

No Switch, é definida uma expressão que deve retornar um valor inteiro ou char. Em seguida, é
selecionado o bloco de instrução a ser executado de acordo com o resultado da expressão.

switch (seletor inteiro){
case valor inteiro 1:
instruções;
break;
case valor inteiro 2:
instruções;
break;
default:
instruções;
}

JAVA – Conceitos básicos – Segunda parte

Março 21, 2007

Tipos de Dados.

A linguagem Java oferece diversos tipos tipos de dados com os quais podemos trabalhar.
Na verdade há basicamente duas categorias em que se encaixam os tipos de dados: tipos primitivos e tipos de referências. Os tipos primitivos correspondem a dados mais simples ou escalares e serão abordados em detalhe no que segue, enquanto os tipos de referências consistem em arrays, classes e interfaces.

Tipos primitivos.

Em Java, são oferecidos tipos literais primitivos (não objetos) para representar valores booleanos (verdadeiro ou falso), caracteres, valores numéricos inteiros e valores numéricos em ponto flutuante.

Tipo Boolean

Este é o tipo de dado mais simples encontrado em Java. Uma variável booleana pode assumir apenas um entre dois valores: true ou false.

Tipos de dados inteiros

Os tipos de dados primitivos byte, int, char, short e long constituem tipos de dados inteiros. Isso porque variáveis desses tipos podem conter um valor numérico inteiro dentro da faixa estabelecida para cada tipo individual. Por exemplo, um byte pode conter um inteiro entre -128 e 127, enquanto um short pode conter um valor entre -32.768 e 32.767. Já o tipo long é de um tamanho muito extenso.

Há diversas razões para se utilizar um ou outro dos tipos inteiros em uma aplicação. Em geral, não é sensato declarar todas as variáveis inteiras do programa como long. Raramente os programas necessitam trabalhar com dados inteiros que permitam fazer uso da máxima capacidade de armazenagem de um long. Além disso, variáveis grandes consomem mais memória do que variáveis menores, como short.

Tipo caracter

Uma variável do tipo char armazena um caractere Unicode. Um caractere Unicode é um caractere de 8 bits, sendo que de 0 a 225 correspondem aos caracteres do código ASCII (a tabela ASCII é uma tabela padronizada internacionalmente de associações entre caractere e a sua representação numérica no computador).

Tipos de ponto flutuante

Em Java, existem duas categorias de de variáveis de ponto flutuante:

Float: armazena valores numéricos em ponto flutuante de precisão simples.
Double: de precisão dupla.

Ambas seguem norma: IEEE Standard for Binary Floating Point Arithmetic, ANSI/IEEE Std. 754-1985 (IEEE, New York). O fato de obedecer a essa norma é que torna os tipos de dados aceitos pela linguagem Java tão portáveis. Esses dados serão aceitos por qualquer plataforma, independendo do tipo de sistema operacional e do fabricante do computador.

A Tabela abaixo apresenta os tipos:

Tipo (int) – Tamanho em bytes (4 bytes)
Tipo (short) – Tamanho em bytes (2 bytes)
Tipo (byte) – Tamanho em bytes (1 byte)
Tipo (long) – Tamanho em bytes (8 bytes)
Tipo (float) – Tamanho em bytes (4 bytes)
Tipo (double) – Tamanho em bytes (8 bytes)
Tipo (boolean) – Tamanho em bytes (1 bit)
Tipo (char) – Tamanho em bytes (8 bytes)

Tipo (int) – Intervalo Inclusivo (-2147483648 a 2147483648)
Tipo (short) – Intervalo Inclusivo (-32768 a 32767)
Tipo (byte) – Intervalo Inclusivo (-128 a 127)
Tipo (long) – Intervalo Inclusivo (-922372036854775808 a 922372036854775807)
Tipo (float) – Intervalo Inclusivo (depende da precisão)
Tipo (double) – Intervalo Inclusivo (depende da precisão)
Tipo (boolean) – Intervalo Inclusivo (true, false)
Tipo (char) – Intervalo Inclusivo (Todos os caracteres unicode)

Tipos Referência.

Classes, interfaces e arrays são conhecidos como tipos referência em Java. Quando você declara uma variável de um tipo referência, você está especificando que a variável irá referenciar, ou apontar, para um objeto em vez de guardar um valor simples como no caso de um primitivo.

Isto faz sentido para classes porque instâncias de classes são objetos que possuem comportamento e estado associados que podem ser representados com muitos valores em vez de apenas um. Contudo, pode parecer estranho para você ver os arrays nesta mesma categoria. Veremos os detalhes mais para frente, mas arrays em Java são na verdade objetos cujos elementos podem ser ou primitivos ou referências para outros objetos.

Para utilizar uma classe de referência, é necessário instanciar um objeto da classe correspondente ao tipo. Por exemplo, para instanciar o nome de uma pessoa como String basta utilizar o operador new.

String nome = new String();

Desta forma, não se pode simplesmente referenciar um objeto, como é feito com uma variável.

String nome;
System.out.println(nome);

A saida da rotina acima será “Null”

Null será impresso, pois o objeto nome não foi instanciado e apenas referenciado. Além disso todos os objetos instanciados em Java são inicializados com null. Isso deve ser dito pois quando se instancia um objeto String o desenvolvedor tem a tendência de entender que será atribuído um espaço em branco (“”) ao conteúdo.

JAVA – Conceitos básicos – Primeira parte

Março 20, 2007

O que é JAVA:

JAVA é uma tecnologia.
Basicamente constitui-se de uma linguagem de programação e um programa para execução chamado de máquina virtual ou virtual machine.

A linguagem de programação Java:

Java é uma linguagem de programação orientada a objeto desenvolvida na década de 90 pela empresa Sun Microsystems. Diferentemente das linguagens convencionais, que são compiladas para código nativo, a linguagem Java é compilada para um “bytecode” que é executado por uma máquina virtual.
Em 13 de novembro de 2006. A Sun liberou partes de Java como software livre, sob a licença GNU General Public License (GPL). A liberação completa esta ocorrendo gradualmente.

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

* Orientação a objeto.
* Portabilidade – Independência de plataforma.
* Recursos de Rede.
* Segurança.

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).
A máquina virtual é a responsável por criar um ambiente multiplataforma, ou seja, se alguém construir um sistema operacional novo, basta criar uma máquina virtual java que traduza os bytecodes para código nativo e pronto! Todas as aplicações java estarão rodando sem problemas.

Entre outras funções, a máquina virtual java também é responsável por carregar de forma segura todas as classes do programa, verificar se os bytecodes aderem a especificação JVM e se eles não violam a integridade e a segurança do sistema.

Desvantagens de Java:

A pré-compilação exige tempo, o que faz com que programas Java demorem um tempo significativamente maior para começarem a funcionar. Isso não é um grande problema para programas que rodam em servidores. No entanto isso pode ser bastante indesejável para computadores pessoais.

O padrão java tem uma especificação rígida de como devem funcionar os tipos numéricos. Essa especificação não condiz com a implementação de pontos flutuantes na maioria dos processadores o que faz com que o java seja significativamente mais lento para aplicações que utilizem bastante processamento numérico quando comparado a outras linguagens.

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.

As desvantagens de Java em relação a performance não significam que as aplicações Java sejam lentas ao ponto de não serem viáveis para utilização em desktops. Java hoje já possui uma performance 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 para otimizar o funcionamento da JVM, possibilita 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 performance. E a cada ano Java tem se tornado mais rápido, na medida que se evolui o compilador dinâmico.
A grande diferença na performance das aplicações escritas em Java em relação as outras linguagens pré-compiladas se dá no “Start” da aplicação, quando ocorre a geração dos bytecodes.

O que Java não faz:

Java não suporta herança múltipla de implementação.
Java não suporta aritmética de ponteiros.

Edições da plataforma Java:

Java 2 Standard Edition (J2SE) – É a tecnologia Java para computadores pessoais.
Possui duas divisões:
Java Development Kit (JDK) ou Standard Development Kit (SDK): um conjunto para desenvolvimento em Java.
Java Runtime Edition JRE: Ambiente de execução, ou seja, é esta versão que executará os sistemas construídos com a SDK.

Java 2 Mobile Edition (J2ME): É a tecnologia Java para dispositivos móveis com limitações de memória ou processamento.
Possui duas divisões:
Connected Limited Device Configuration (CLDC): Para celulares e smartphones, que são mais limitados.
Connected Device Configuration (CDC): Para Palmtops e Pocket pcs e alguns dispositívos com performance mais elevada.

Java 2 Enterprise Edition (J2EE): É a tecnologia Java para aplicações corporativas. Possui um grande número de APIs onde a segurança é a principal preocupação. É ideal para a construção de servidores de aplicação, integração de sistemas ou distribuição de serviços para terceiros.

Pagina oficial da linguagem.