Projetando banco de dados orientado a documento

Estou passando a estudar Node JS e MongoDB. Estas duas tecnologias estão me conquistando e vou passar a utilizá-las profissionalmente. Com Javascript eu já estava acostumado, porém, banco de dados orientado a documento é novo para mim. Então este artigo vem a ajudar desenvolvedores que ainda estão se adaptando aos banco de dados orientado a documento que trazem o conceito de NoSQL(Not only SQL).

Andei pesquisando sobre normalização e banco de dados orientado a documento. Entrei perfisdiversos artigos na internet e estou passando a me acostumar a este novo paradigma. Percebi que normalização e orientação a documento não combinam muito bem. Mas, calma ai, isto não significa que é ruim. No mundo relacional vivemos querendo desnormalizar as tabelas para conseguimos performance nas diversas consultas que queremos fazer. O bancos orientado a documento oferecem formas de estar com os dados integrados e ainda assim, fornecer a respostas extremamente rápidas.

Sobre a integridade, umas das coisas que venho pensando bastante é sobre duplicidade dos dados e o relacionamento entre as coleções. Quais objetos merecem suas próprias coleções ? É viável manter uma coleção com tipos de dados diferentes, onde cada documento(um registro) pode ter campos diferentes? Quando começamos surgem estas diversas perguntas em nossa mente e isto nos atrasa porque temos que estudar bastante para poder projetar da forma correta. Andei pensando sobre e cheguei a algumas conclusões.

Algumas comparações com a estrutura de bancos relacionais: Objetos que podem ser utilizados em diversos cantos merecem uma coleção própria. Como exemplo relações N-N(muitos para muitos), ou 1-N(um para muitos). Os objetos que podem ser referenciado varias vezes em outras coleções, merecem uma coleção própria. No caso de relacionamentos 1-1, não vale a pena, uma vez que os documentos de uma coleção podem ter uma quantidade diferente de “campos”. Então como exemplo, se tivermos em um banco de dados relacional as tabelas usuarios e perfis, onde existe um relacionamento 1-1, não é vantagem ter duas coleções usuarios e perfis em um banco orientado a documentos. É mais interessante ter apenas uma coleção com todos os dados, mesmo que alguns registros(documentos) tenham mais campos que os outros, você deve tratar essa divergência no código.

Vamos utilizar por exemplo artigos(posts) e comentários. Temos um relacionamento 1-N. Penso que é inviável ter uma coleção apenas para os comentários. Pois, um comentário pertence apenas a aquele artigo, não será referenciado por outro artigo ou qualquer outro documento. Então, os comentários não merecem uma coleção própria e sim podem ser embarcados dentro da coleção de artigos. Apenas contendo uma referencia para o usuário que comentou. Ganhamos ainda em algumas operações, como na remoção do artigo que removerá os comentários deste em cascata. Na consulta por artigos não precisaremos de um INNER JOIN para trazer os comentários, pois estes já estarão embarcados no artigo, garantindo performance bem mais elevada que pesquisar em outra coleção.

Vejo que os bancos orientados a documentos vem oferecendo diversas vantagens. A escabilidade é a principal delas. Mas, também temos performance e linguagem de consulta simples. Podemos projetar rapidamente nossos dados e crescer sem muitas restrições e manter a performance em alto nível com muita simplicidade.

Para concluir e não estender muito o artigo. É isso, estou apenas iniciando vou pesquisar mais e mais, espero comentários de suas experiências, dessa forma podemos criar uma crítica minuciosa sobre como projetar nossos bancos orientado a documento.

Como desenvolver um plugin WordPress – Introdução

Sadjow diz — Este post foi escrito como parte da série “Como desenvolver um plugin WordPress”  traduzido por Sadjow Medeiros Leão de “How to write a WordPress plugin – Introduction” do site Devlounge escrito por Ronald Huereca.

Sadjow diz — Boa leitura e bons estudos.

Para qualquer usuário WordPress, plugins são essenciais. Plugins WordPress permite aqueles que tem pouca ou nenhuma habilidade de programação extender a funcionalidade de seus blogs. Existem plugins de todas as formas e tamanhos, e até mesmo, há plugins que não fazem nada para WordPress.

O WordPress é tão bom quanto uma aplicação independente, ainda há coisas que falta no WordPress. Os usuários estão pedindo mais e mais recursos para o WordPress que seriam viáveis para serem escritos como um plugin. Existem várias idéias inexploradas lá fora. E algumas criadas todos os dias.

Para quem é esta série?

Esta série é para qualquer usuário WordPress que é curioso sobre ou quer aprender a escrever seu plugin WordPress. Leitores dessa série devem possuir um conhecimento intermediário em PHP. Conhecer um pouco JavaScript, e ser digno no CSS (Cascading Style Sheets).

Esta série sobre plugins irá beneficiar artistas de temas (theme designers), aqueles que gostam de mecher(modificar, adaptar) com código de plugins, e aqueles que gostam de escrever seus próprios plugins a partir do zero.

Ferramentas para ter o trabalho feito.

Para escrever plugins, qualquer editor de texto pode fazer isto. Aqui está algumas ferramentas que eu(Ronald Huereca) pessoalmente uso para criar plugins.

Esta série assume que você tem o WordPress 2.1.x ou uma versão mais moderna instalada.

Exemplos de código

Todos os códigos que eu usar estarão disponíveis para download em cada post após a sessão de conclusão. Eu estarei criando o código de acordo com o percurso, desse modo cada download será diferente. Eu estarei criando um plugin que realmente não faz nada do que mostrar a você o básico de como um plugin funciona.

Mesmo que esta série de posts estejam sendo feita um por cima do outro(com páginas diferentes, separados, em dias diferentes), eu recomendo ler a série na ordem que é apresentada.

Eu altamente recomendo que não use o plugin de teste em uma instalação do WordPress em produção(no ar). Ao invés disso, utilize uma instalação WordPress local.

Tópicos

Eu planejo inciar realmente básico e mover rápidamente para dentro das mais “hard-core”funções (as funções mais complexas) de plugins do WordPress. Este série não será compreensíva a nível de detalhes sobre desenvolvimento de plugins, mas dará esperançosamente uma ótima fundamentação para começar a desenvolver o seu próprio plugin. Se você tiver algumas questão ou sugestão, por favor preferencialmente deixe um comentário, mas também é possível enviar um email utilizando o Devlounge contact form em inglês para Ronald, ou envie para o tradutor, para o email sadjow@gmail.com. Ou então vá aos fóruns de suporte do WordPress.

Técnicas

Algumas das técnicas que eu uso nos meus exemplos de código talvez não seja o melhor jeito de apresentar o código e você pode ser crítico(cringing, acertei na tradução? ) porque eu não tenho um monte de atalhos. Então eu adianto e  peço desculpas, pois todo mundo tem seu estilo de codificação.

No que fiz respeito a técnicas de plugins, estrutura, comportamento, e outros incómodos, se existe uma forma melhor e mais fácil que eu negligenciei, eu sou todo ouvidos (ou, olhos).

Programação da publicação da série

Os posts dessa série estão planejados para serem publicados a cada dois dias. Para ficar atento na série, eu sugiro a você para se inscrever no RSS do blog ou me seguir no twitter, http://twitter.com/sadjow.

Conclusão

Obrigado por ler a introdução da série. Minha esperança é que esta série traga benefícios para os leitores. Qualquer feedback é bem-vindo. Obrigado.

Lista de repositórios oficiais Ubuntu

Olá linux users,

Sei que muita gente tem dificuldade em encontrar a lista de repositórios oficiais ativos do ubuntu. Então, resolvi colocar aqui a dica do site na plataforma de colaboração de software, A launchpad.

É possível encontrar a lista de repositórios em https://launchpad.net/ubuntu/+archivemirrors . Então, esta é uma dica boa para qualquer um que não sabia que existia isto. Geralmente, o pessoal que sabe pensa que todo mundo conhece como eles, e acabam deixando de informar algumas boas dicas.

Para quem não sabe editar o arquivo sources.list, arquivo do repositório, é possível selecionar o repositório a parti de uma interface gráfica do gnome. Leia este post: Selecionando o repositório mais rápido no Ubuntu

Valeu, é isso.

Selecionando o repositório mais rápido no Ubuntu Linux

Quando eu estava iniciando a mecher com Linux, eu sempre encontrava problemas quando estava instalando programas. Um desses problemas era a seleção do melhor repositório, o mais próximo, para diminuir a latencia e aumentar a velocidade de download dos programas. É muito complicado ter que ir toda vez atualizar o arquivo sources.list manualmente.

Eu achei no Ubuntu a ferramenta certa para este problema. Esta ferramenta pinga todos os repositórios oficiais existentes de sua versão Ubuntu, no caso a minha é a 10.4, o lucid lynx. E então, após os pings, seleciona o melhor para sua máquina.

Segue os passos:

  • Passo 1: Sistemas > Administração > Canais de Software.
  • Passo 2: Baixar de : Outro…
  • Passo 3: Selecionar melhor servidor
  • Passo 4 : Escolher servidor.
  • Passo 5: Fechar
  • Passo 6: Recarregar

Infelizmente não tive tempo de colocar com printscreens. Mas. aí está minha dica!

Até!

Instalando o HipHop for PHP no Ubuntu

Opa,

HipHop é um transformador de código-fonte que transforma código-fonte PHP em código C++ altamente otimizado e compila este usando g++. Para instalar o HipHop for PHP é necessário uma máquina 64-bits.

Instalando os pacotes requeridos.

sudo apt-get install cmake g++ libboost-dev flex bison re2c libmysqlclient-dev libxml2-dev libmcrypt-dev libicu-dev openssl binutils-dev libcap-dev libgd2-xpm-dev zlib1g-dev libtbb-dev libonig-dev libpcre3-dev git-core autoconf libtool libcurl4-openssl-dev libboost-system-dev libboost-program-options-dev libboost-filesystem-dev

Baixando o código-fonte do HipHop

mkdir hiphop
cd hiphop
git clone git://github.com/facebook/hiphop-php
cd hiphop-php
export CMAKE_PREFIX_PATH=`/bin/pwd`/../
export HPHP_HOME=`/bin/pwd`
export HPHP_LIB=`/bin/pwd`/bin
git submodule init
git submodule update
cd ..

Compilando bibliotecas de terceiros

libevent

wget http://www.monkey.org/~provos/libevent-1.4.13-stable.tar.gz
tar -xzvf libevent-1.4.13-stable.tar.gz
cd libevent-1.4.13-stable
cp ../hiphop-php/src/third_party/libevent.fb-changes.diff .
patch < libevent.fb-changes.diff
./configure --prefix=$CMAKE_PREFIX_PATH
make
make install
cd ..

ICU4

wget http://download.icu-project.org/files/icu4c/4.2.1/icu4c-4_2_1-src.tgz
tar -xvzf icu4c-4_2_1-src.tgz
cd icu/source
./configure --prefix=$CMAKE_PREFIX_PATH
make
make install
cd ../../

libCurl

wget http://curl.haxx.se/download/curl-7.20.0.tar.gz
tar -xvzf curl-7.20.0.tar.gz
cd curl-7.20.0
cp ../hiphop-php/src/third_party/libcurl.fb-changes.diff .
patch -p0 < libcurl.fb-changes.diff
./configure --prefix=$CMAKE_PREFIX_PATH
make
make install
cd ..

Compilando o HipHop

cd hiphop-php
cmake .
make

Estarei escrevendo mais sobre o HipHop.
Espero que tenha ajudado. =)

Benefícios de se tornar um Zend Certified Engineer (ZCE)

Recompensas em sua Carreira
  • Diferenciar-se dos concorrentes, quando a procura de novo emprego.
  • Aumente o valor do seu salário.
  • Comece o seu currículo.
  • Conquistar o reconhecimento do seu empregador.
  • Ter seu perfil exibido nas Páginas Amarelas da Zend para Profissionais PHP.
  • Junte-se ao Grupo Linkedin Exclusivamente para ZCE’s.
  • Garanta a oportunidade de emprego para trabalhar com PHP em qualquer lugar do mundo.
Recompensas pessoais
  • Ser reconhecido como um apoiante orgulhoso e dedicado do PHP.
  • Mostre o seu compromisso com o crescimento e propagação do PHP.
  • Ajuda provar que a comunidade PHP é fiável, estável e confiável.
Recompensas da Zend

  • Está nas Páginas Amarelas da Zend para profissionais PHP.

Utilizado por empregadores e recrutadores para encontrar programadores PHP mundialmente
Personalize a sua página fazendo o upload da sua fotografia, introduzindo as informações da sua empresa, detalhes do seu  CV.

  • Obtenha descontos especiais nas conferências mundiais da Zend PHP.

Saiba mais!

PHP: Instalando o servidor web XAMPP

Muitas pessoas tem difículdade para instalar em sua máquina um servidor web que rode PHP e MySQL. Vocês iniciantes, que querem se tornar fera em PHP, as vezes querem saber instalar o Apache, PHP e o MySQL sem ajuda de um ferramenta. Mas isto, dependendo do seu nível, pode ficar difícil de fazer, acabando , algumas vezes, deixando os estudos da linguagem de programação PHP.

A minha dica é instalar o XAMPP, que em alguns cliques faz você ter seu servidor web:

  • Apache
  • MySQL
  • PHP
  • phpMyAdmin
  • FileZilla FTP Server
  • Mercury Mail Transport System
  • OpenSSL

Baixar o XAMPP para Windows

Baixar o XAMPP para Linux

O resto é muito fácil, é apenas Next, Next, Next e Finish! Ir no menu iniciar e XAMPP Control Panel, e colocar para rodar.

Lá você irá ter a pasta htdocs, é onde vc pode colocar seus “Documentos de Hipertexto”(os arquivos php, html imagens, seu site/sistema).

Dica: Estudar PHP e Inglês é uma boa, tem emprego de US$ 10.000,00 por mês nos EUA pra quem sabe.

Google: Rede de Internet via Satélite O3b

Fala pessoal,

Olha que massa que eu encontrei na internet falando das Redes de Internet via Satélite(Rede O3B) (Others Three Bilion) que o Google e HSBC vão disponibilizar de baixo custo. E a velocidade de internet promete alcançar a casa dos Gigabits!!

Achei excelente essa iniciativa. Quem não acha? Ter internet de baixo custo na casa dos Gigabits. Já pensou nas novas oportunidades e idéias que irão surgir com a internet desse porte. Será possível assistir filmes de alta qualidade online. Já pensou um Cinema Online ? Os ambientes 3D como SecondLife, irão com certeza ganhar mais espaço. Pois, a internet irá proporcionar o perfeito uso deles.

Agora entendi porque o Google disse que todos os seus arquivos irão ser guardados nas nuvens…. hehehe.

Eles estão construindo 16 satélites que irão ficar geo-sincronizados. Que irá entrar em funcionamento em 2010.

A missão do projeto O3B é fornecer conexão de internet de alta velocidade e de baixo custo para “outros 3 bilhões” de pessoas em mercados emergentes na Ásia, África, América Latina e no Oriente Médio.

Vejam o vídeo:

 

Vocês podem saber mais no site oficial em inglês:
http://www.o3bnetworks.com/

Adeus provedores e servidores de internet careiros do Brasil, e bem vindo as novas oportunidades!!

Valeu pessoal, comentem!!!!!!

Video Aula: Criando sua primeira página HTML

Ae pessoal,

Criei minha primeira video aula, resolvi falar sobre a criação de uma página básica HTML. É muito simples criar! Mas ta ai a video aula pra quem tiver interesse!

Aviso logo que a vídeo aula foi improvisada!

Fiz para grupo de estudos UnPHP

Link para assistir a video aula online.

Download da video aula.

Valeu, abraço.

Java: O que é Interface ?

[Dica: Leia os comentários do código e implemente-os para melhor entendimento.]

Como você já aprendeu na Orientação a Objetos, os objetos representam algo do mundo real através de seus atributos e métodos. Uma interface no java pode representar uma superfície como o botão de liga e desliga de um equipamento eletrônico. Este botão, por padrão, esta obrigatóriamente presente em todos os aparelhos de televisão.

No mais comum, uma interface, é um conjunto de métodos relacionados que não tem corpo, ou seja, sem implementação. Se um comportamento básico de qualquer aparelho eletrônico for especificado como uma interface, poderia ser como o código abaixo:

package estudos;

public interface Eletronico {
    void ligar();
    void desligar();
}

Todos os métodos das interfaces são implicitamente public e abstract , sendo que muitas pessoas gostam usualmente de explicitar o public. E as constantes são public static e final.

package estudos;

String teste = "t123";

public interface Eletronico {
    void ligar();
    void desligar();
}

É a mesma coisa que:

package estudos;

public static final String teste = "t123";

public interface Eletronico {
    public abstract void ligar();
    public void desligar();
}

Se você quiser implementar um aparelho eletrônico seguindo o padrão básico de comportamento, você terá que usar a palavra-chave implements na declaração da classe deste aparelho:

package estudos;

public class Televisao implements Eletronico {

    // Temos obrigatóriamete que implementar os métodos
    // da interface Eletronico.

    public void ligar() {
        System.out.println("Liguei a televisão");
        // Aqui você implementaria os códigos para ligar a televisão
    }

    public void desligar() {
        System.out.println("Desliguei a televisão");
        // Aqui você implementaria os códigos para desligar a televisão
    }

}

Como vemos no código, para se implementar a televisão, que é um aparelho eletrônico, seguimos o padrão criado por nós para aparelhos eletrônicos. Usamos a palavra-chave implements para implementar obrigatóriamente os métodos da interface Eletronico , fazendo uso do padrão criado. É como um contrato entre diversas classes, quase que criando até um tipo de dado.

Quando você precisa criar funções que manipulam outros objetos, é necessário, as vezes, garantir que esta função esta realmente recebendo um objeto que tenha determinados atributos e métodos, os quais esta irá fazer uso. Vou mostrar um exemplo:

Criamos um interface Imprimivel:

package estudos2;

public interface Imprimivel {

    void imprimir();

}

Vamos criar uma classe Impressora que implementa a interface Eletronico, e que só imprime objetos que implementam a interface Imprimivel.

package estudos;

public class Impressora implements Eletronico {

    // Impressora desligada por padrão
    private boolean ligada = false;

    // Método para imprimir uma nota, veja o parâmetro
    // Imprimivel objImprimivel
    // O metodo espera um objeto que possua uma função imprimir()
    // gerou um contrato da impressora .. o método somente
    // aceita objetos que implementa a interface Imprimivel.
    public void imprimirNotaFiscal(Imprimivel objImprimivel){
        // Verifica se a impressora esta ligada!
        if(this.ligada){
            objImprimivel.imprimir();
            // Se o objeto passado não fosse Imprimivel
        } else {
            System.out.println("Problema: Impressora desligada!");
        }
    }

    // implementamos o método da interface Eletronico
    // Ligamos a impressora ....
    public void ligar() {
        this.ligada = true;
        System.out.println("Impressora ligada!");
    }

    public void desligar() {
        this.ligada = false;
        System.out.println("Impressora desligada!");
    }

}

Agora vamos criar dois tipos de nota fiscal, uma é imprimivel na impressora e a outra não aceita imprimir pela impressora do seu sistema, porque a segunda é somente para visualização.

Classe NotaFiscal que implementa a interface Imprimivel:

package estudos;

public class NotaFiscal implements Imprimivel {

    private int numero;
    private double valor;

    public NotaFiscal(int numero, double valor){
        this.numero = numero;
        this.valor  = valor;
    }

    public void imprimir() {
        System.out.println("Número: " + this.getNumero() + ", Valor: "+ this.getValor());
    }

    public double getValor() {
        return valor;
    }

    public void setValor(double valor) {
        this.valor = valor;
    }

    public int getNumero() {
        return numero;
    }

    public void setNumero(int numero) {
        this.numero = numero;
    }

}

>

A Classe de nota fiscal que é somente para visualização. Não é obrigada a implementar a função imprimir().

package estudos;

public class NotaFiscalOnline {
    private int numero;
    private double valor;

    public NotaFiscalOnline(int numero, double valor){
        this.numero = numero;
        this.valor  = valor;
    }

    public double getValor() {
        return valor;
    }

    public void setValor(double valor) {
        this.valor = valor;
    }

    public int getNumero() {
        return numero;
    }

    public void setNumero(int numero) {
        this.numero = numero;
    }
}

Criamos um classe executável “main” para fazer uma demonstração:

package estudos;

public class Main {

    public static void main(String[] args) {

        // Instânciamos uma impressora
        Impressora impressora1510 = new Impressora();

        // Ligamos a impressora!
        impressora1510.ligar();

        // Fazemos um for para simular a criação de 10 notas fiscais
        for (int i = 1; i <= 10; i++) {
            // numero da nota atual recebe o valor de i
            int numeroNota = i;
            // Criamos um valor i * 10, só para esta demonstração
            // 10.0 , 20.0, 30.0, 40.0, 50.0 .... 100.0
            double valor = (double) (10 * i);
            // Criamos um nota fiscal aqui dentro do for...
            // utilizando o valores gerados com a ajuda da variável i
            NotaFiscal notaf = new NotaFiscal(numeroNota, valor);
            // Como passamos um objeto que implementa a classe Imprimivel para
            // o método da impressora que espera um objeto Imprimivel
            // não terá problemas...
            impressora1510.imprimirNotaFiscal(notaf);
        }
    }

}

Primeiro criamos a interface Imprimivel, depois uma Classe Impressora que implementa a interface Eletronico. Criamos duas classes de nota fiscal, uma é Imprimivel e a outra não. Então veio o teste na classe executável:

O resultado foi:

Impressora ligada!
Número: 1, Valor: 10.0
Número: 2, Valor: 20.0
Número: 3, Valor: 30.0
Número: 4, Valor: 40.0
Número: 5, Valor: 50.0
Número: 6, Valor: 60.0
Número: 7, Valor: 70.0
Número: 8, Valor: 80.0
Número: 9, Valor: 90.0
Número: 10, Valor: 100.0

Vou comentar um pouco sobre a linha 24 do código da Classe executável “Main”:

impressora1510.imprimirNotaFiscal(notaf);

Se tivessemos passado um objeto que não fosse do “tipo” Imprimivel, aconteceria um erro na hora da compilação! Não chegava nem ao ponto de compilar. Isso é ótimo para obrigar ao programador a passar pelo parâmetro um objeto que tenha realmente a função imprimir(), a qual a Classe Impressora necessita.

Tente alterar , passando um objeto que não implemente a interface Imprimivel, para ver o que acontece!

As regras de nomenclatura para interfaces são as mesmas que para as classes, embora seja usual o emprego de nomes que denotem, ou indiquem, suas funcionalidades ali definidas. Ou seja, uma interface chamada Imprimivel, somente terá métodos relacionados com impressão, e uma interface Editavel terá métodos relacionados a edição.

As interfaces também fazem uso do mecanismo de herança! Sim, isto mesmo … extends. Suas funcionálidades podem ser reescritas, ou podem ganhar mais funcionalides através da herança.

package estudos;
public interface Editavel {

    void editar(String conteudo);

}
package estudos;
public interface EmailEditavel extends Editavel {

    void editarAssunto(String assunto);
    void editarDe(String de);
    void editarPara(String para);

}

A interface ficou mais especialista , ganhou funções relacionadas a edição de emails, ficou com 4 funções, uma já era de edição do conteúdo, editar(String conteudo), herdado da interface “Pai” (Editavel).

Uma classe pode implementar diversas interfaces, por exemplo:

Um e-mail pode ser Imprimivel e Editavel…

package estudos2;

public class Email implements Imprimivel, EmailEditavel {

    private String de;
    private String para;
    private String assunto;
    private String mensagem;

    // Implementamos o método imprimir() da interface Imprimivel
    public void imprimir() {
        System.out.println(
                "De:" + this.getDe() + ",\n" +
                "Para:" + this.getPara() + ",\n" +
                "Assunto: " + this.getAssunto() + ",\n" +
                "Mensagem:" + this.getMensagem());
    }

    // E implementamos os métodos da interface EmailEditavel!
    public void editarAssunto(String assunto) {
        this.setAssunto(assunto);
    }

    public void editarDe(String de) {
        this.setDe(de);
    }

    public void editarPara(String para) {
        this.setPara(para);
    }

    public void editar(String conteudo) {
        this.setMensagem(conteudo);
    }

    public String getDe() {
        return de;
    }

    public void setDe(String de) {
        this.de = de;
    }

    public String getPara() {
        return para;
    }

    public void setPara(String para) {
        this.para = para;
    }

    public String getAssunto() {
        return assunto;
    }

    public void setAssunto(String assunto) {
        this.assunto = assunto;
    }

    public String getMensagem() {
        return mensagem;
    }

    public void setMensagem(String mensagem) {
        this.mensagem = mensagem;
    }

}

Com isto, podemos ver que diferente do C++, o java não tem herança multipla “extends Classe1, Classe2″, mas uma classe pode implementar mais de uma interface. O Java não permite a herança multipla, porque se tivemos duas classes, que cada uma tem exatamente o mesmo método(mesma assinatura) e com corpo diferente, qual dos dois métodos a JVM irá usar?

Exemplo:

Se pudessemos fazer herança multipla no java ficaria assim:

Classe PortuguesBrasil:

package estudos;

public class PortuguesBrasil {
    public void falarPalavraFiladeBanco(){
        System.out.println("Fila!");
    }
}

Classe PortuguesPortugal:

package estudos;

public class PortuguesPortugal {
    public void falarPalavraFiladeBanco(){
        System.out.println("Bicha!");
    }
}

Classe Pessoa:

package estudos;

public class Pessoa extends PortuguesBrasil, PortuguesPortugal {
    public Pessoa(){
        this.falarPalavraFiladeBanco();
    }
}

Isto é impossível no java! Este código não pode ser compilado! Qual dos dois métodos a JVM irá usar? falarPalavraFiladeBanco() da classe PortuguesBrasil ou PortuguesPortugal ? A interface veio para resolver esse tipo problema.

Algumas últimas pergutas:

É possível declarar Atributos privados em uma Interface?
Não. As interfaces não podem ter atributos privados, todos os seus atributos são public final e static. O objetivo das interfaces é que sejam implementadas, as classes que a implementa irá fazer uso de seus atributos, se tivesse atributos private seria inútil, pois a classe que implementará não enxegará o atributo. Por este motivo que não é permitido criar atributos ou métodos private em interfaces.

É possível declarar métodos static em uma interface.
Não. Uma interface não pode ter métodos com corpo. Para que um método static ? Se os métodos de interfaces não podem ter corpo. Os métodos das interfaces, serão implementados em outras classes.

Termino aqui! Mais tarde quando for falar de Design Patterns comento mais sobre interfaces.

Comentem!

Valeu!