<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5856286885704734621</id><updated>2025-07-17T03:15:13.209-03:00</updated><category term="java"/><category term="scjp"/><category term="android"/><category term="cast"/><category term="casting"/><category term="eclipse"/><category term="html"/><category term="javascript"/><category term="js"/><category term="postgresql"/><category term="sobrecarga"/><category term="sobrescrita"/><category term="Controle de Acesso"/><category term="JComboBox"/><category term="JMenuBar"/><category term="JPA"/><category term="JTextField"/><category term="Recursividade"/><category term="assincrona"/><category term="binding"/><category term="coleta de lixo"/><category term="construtor"/><category term="conversão"/><category term="default"/><category term="design patterns"/><category term="digital"/><category term="dinâmico"/><category term="enum"/><category term="exceções"/><category term="garbage collector"/><category term="gc"/><category term="hd sata"/><category term="herança"/><category term="humor"/><category term="ilha de isolamento"/><category term="island of isolation"/><category term="j2me"/><category term="jtable"/><category term="lookandfeel"/><category term="menu"/><category term="midlet"/><category term="modificadores de acesso"/><category term="mount"/><category term="mysql"/><category term="ntfs"/><category term="overhead"/><category term="overloading"/><category term="overrinding"/><category term="polimorfismo"/><category term="primitivos"/><category term="private"/><category term="protected"/><category term="public"/><category term="redes"/><category term="sincrona"/><category term="subclasse"/><category term="superclasse"/><category term="swing"/><category term="threads"/><category term="ubuntu"/><category term="variáveis"/><category term="visual editor"/><title type='text'>Java com café</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://marciosouzajunior.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://marciosouzajunior.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Márcio de Souza Júnior</name><uri>http://www.blogger.com/profile/01965624113971008303</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>29</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5856286885704734621.post-8417556786083059926</id><published>2013-03-21T15:21:00.001-03:00</published><updated>2013-03-21T15:33:57.723-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="android"/><title type='text'>ProgressBar dentro de uma ActionBar - Android</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: left; margin-right: 1em; text-align: left;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhhHaeQ0KFJLa9sF-g0U20CGanZi7SGTbKBUvKTJ5SC0ksLQfMslm7V9u6wXbI-q7Z-ZrPiYCn8Wd7UaLEEaUJ0_gc6o5yxY-oNrpoIEYSjIW0SvXOfqw5PbxiycjbKCuDu9RU5wStp4ka/s1600/gmail_app.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;178&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhhHaeQ0KFJLa9sF-g0U20CGanZi7SGTbKBUvKTJ5SC0ksLQfMslm7V9u6wXbI-q7Z-ZrPiYCn8Wd7UaLEEaUJ0_gc6o5yxY-oNrpoIEYSjIW0SvXOfqw5PbxiycjbKCuDu9RU5wStp4ka/s200/gmail_app.png&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Olá! Hoje vou mostrar como adicionar uma &lt;i&gt;progressbar&lt;/i&gt; dentro de uma &lt;i&gt;actionbar&lt;/i&gt;. Um bom exemplo de implementação deste recurso é o aplicativo do Gmail, onde você tem um item de menu (usado para atualizar seus e-mails) que quando clicado, é substituído pela &lt;i&gt;progressbar&lt;/i&gt; até o procedimento ser concluído e então volta novamente a ser o item.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Para utilizar este recurso, a versão mínima requerida do sdk é a 11. Você também vai precisar dos ícones, que podem variar de acordo com o tema (baixe o pacote &lt;a href=&quot;http://developer.android.com/downloads/design/Android_Design_Icons_20120814.zip&quot; target=&quot;_blank&quot;&gt;neste link&lt;/a&gt;). Para o exemplo estarei utilizando estes que são adequados para o tema &lt;i&gt;Holo Light&lt;/i&gt;:&lt;/div&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzX7Hv6z09OyaLqz6OlQ2nkXfsGSXOcixgLANLgR9nUgi1SSt8DQhlsAZU9Qzwo16KorKA9BJ4FqBP2rT1fBsYMTpbTwx5CMKwmtL4ZOIDNyXLG5jEuV9fAzjhCZopslRK6rjKtiDAAc2v/s1600/ic_menu_refresh.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzX7Hv6z09OyaLqz6OlQ2nkXfsGSXOcixgLANLgR9nUgi1SSt8DQhlsAZU9Qzwo16KorKA9BJ4FqBP2rT1fBsYMTpbTwx5CMKwmtL4ZOIDNyXLG5jEuV9fAzjhCZopslRK6rjKtiDAAc2v/s1600/ic_menu_refresh.png&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;i&gt;res/drawable-mdpi&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkk0D_7Pt6T1StTE2dveAxWdYE4zfZHMhkygGSH3CvO-6JLL26RdqGs9JbaUgo_op4yjY7IeBFJpGT_vcyvg_JpGjZiufaJQilRVW8LG1Fbd2rrp2eYcNDBrDto2gsJcTYPoeEM_uGKiAH/s1600/ic_menu_refresh.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkk0D_7Pt6T1StTE2dveAxWdYE4zfZHMhkygGSH3CvO-6JLL26RdqGs9JbaUgo_op4yjY7IeBFJpGT_vcyvg_JpGjZiufaJQilRVW8LG1Fbd2rrp2eYcNDBrDto2gsJcTYPoeEM_uGKiAH/s1600/ic_menu_refresh.png&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;i&gt;res/drawable-hdpi&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjt5R0NmV4Mb7Dy0sJIlMbuiqdMaYMD0m2qabgKpOHqtGVnRNk53eWgeGqPLFe6rchDUI94e-Ddba-WgBm5By6ZJu-NUTSASG2FIT7a1L9J8UNqmRjlbqbfTdTbdTmop3UDiYd-wkiATrao/s1600/ic_menu_refresh.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjt5R0NmV4Mb7Dy0sJIlMbuiqdMaYMD0m2qabgKpOHqtGVnRNk53eWgeGqPLFe6rchDUI94e-Ddba-WgBm5By6ZJu-NUTSASG2FIT7a1L9J8UNqmRjlbqbfTdTbdTmop3UDiYd-wkiATrao/s1600/ic_menu_refresh.png&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;i&gt;res/drawable-xhdpi&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;
Para começar salve os ícones nas respectivas pastas de acordo com as legendas nas imagens. Agora vamos precisar de dois arquivos xml, um para o item de menu e outro para a &lt;i&gt;progressbar&lt;/i&gt;. Para o item, dentro da pasta &lt;i&gt;res/menu&lt;/i&gt;, crie um arquivo chamado &lt;i&gt;atualizar.xml&lt;/i&gt; com o seguinte conteúdo:&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;&amp;lt;menu xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot; &amp;gt;
    &amp;lt;item
        android:id=&quot;@+id/action_atualizar&quot;
        android:icon=&quot;@drawable/ic_menu_refresh&quot;
        android:showAsAction=&quot;always&quot;
        android:title=&quot;Atualizar&quot;/&amp;gt;
&amp;lt;/menu&amp;gt;
&lt;/pre&gt;
&lt;/div&gt;
E na pasta &lt;i&gt;res/layout&lt;/i&gt; o arquivo &lt;i&gt;actionbar_atualizar.xml&lt;/i&gt;:&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;ProgressBar xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    android:layout_width=&quot;wrap_content&quot;
    android:layout_height=&quot;30dp&quot;
    android:layout_gravity=&quot;right&quot;
    android:paddingRight=&quot;5dp&quot; /&amp;gt;
&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Para controlar quando vai aparecer o item ou a &lt;i&gt;progressbar&lt;/i&gt;, a estrutura da classe deverá ser parecida com a que segue (odeio colar trechos muito grandes de código no site, mas paciência que vou explicar tudo lá embaixo):&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

public class MainActivity extends Activity {

 private boolean atualizando = false;
 private Menu mOptionsMenu;

 @Override
 protected void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  getActionBar().setDisplayHomeAsUpEnabled(true);

 }

 @Override
 public void onBackPressed() {

  if (atualizando == true) {
   Toast.makeText(this, &quot;Aguarde...&quot;, Toast.LENGTH_LONG).show();
  } else {
   super.onBackPressed();
  }

 }

 private void atualizar() {

  atualizando = true;
  setAtualizando(atualizando);

  new Operacao().execute();

 }

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {

  switch (item.getItemId()) {

  case android.R.id.home:
   onBackPressed();
   break;

  case R.id.action_atualizar:
   atualizar();
   break;

  }

  return true;

 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {

  super.onCreateOptionsMenu(menu);
  mOptionsMenu = menu;
  getMenuInflater().inflate(R.menu.atualizar, menu);
  // atualizar();
  return true;

 }

 public void setAtualizando(boolean atualizando) {

  if (mOptionsMenu == null) {
   return;
  }

  MenuItem atualizarItem = mOptionsMenu.findItem(R.id.action_atualizar);

  if (atualizarItem != null) {

   if (atualizando) {
    atualizarItem.setActionView(R.layout.actionbar_atualizar);
   } else {
    atualizarItem.setActionView(null);
   }

  }

 }

 class Operacao extends AsyncTask&amp;lt;Void, Void, Void&amp;gt; {

  Exception exception = null;

  @Override
  protected Void doInBackground(Void... params) {

   try {

    // Neste bloco vocẽ executa suas operações
    Thread.sleep(2000);

   } catch (Exception e) {
    exception = e;
   }

   return null;

  }

  @Override
  protected void onPostExecute(Void result) {
   super.onPostExecute(result);

   if (exception == null) {
    atualizando = false;
    setAtualizando(atualizando);
   } else {
    Toast.makeText(MainActivity.this,
      &quot;Ocorreu um erro: &quot; + exception.getMessage(),
      Toast.LENGTH_LONG).show();
   }

  }

 }

}
&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Bom, no começo temos duas variáveis: &lt;i&gt;atualizando&lt;/i&gt; e &lt;i&gt;mOptionsMenu&lt;/i&gt;. A primeira é simplesmente para identificar se a atualização está ocorrendo ou não em determinado momento. A segunda receberá o menu assim que ele for criado e permitirá a troca entre o item e a &lt;i&gt;progressbar &lt;/i&gt;quando necessário.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Em seguida temos os seguintes métodos:&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;/div&gt;
&lt;ul style=&quot;text-align: justify;&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;i&gt;onCreate&lt;/i&gt;&lt;/b&gt;: Não tem nada de especial além do comando &lt;i&gt;getActionBar().setDisplayHomeAsUpEnabled(true)&lt;/i&gt;, que adiciona o item &quot;voltar&quot; na &lt;i&gt;actionbar&lt;/i&gt;.&amp;nbsp; &lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;text-align: justify;&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;i&gt;onBackPressed&lt;/i&gt;&lt;/b&gt;: É tratado se a atualização está ocorrendo e não permitirá voltar se for verdade. &lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;text-align: justify;&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;i&gt;atualizar&lt;/i&gt;&lt;/b&gt;: Configura a barra com o &lt;i&gt;setAtualizando&lt;/i&gt; e executa a tarefa que executará as operações de atualização. Falo sobre a classe que executa a tarefa logo abaixo. &lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;text-align: justify;&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;i&gt;onOptionsItemSelected&lt;/i&gt;&lt;/b&gt;: Verifica qual item do menu foi clicado e executa a ação correspondente. &lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;text-align: justify;&quot;&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;onCreateOptionsMenu&lt;/b&gt;:&lt;/i&gt; A variável recebe o menu e caso queira que a &lt;i&gt;Activity&lt;/i&gt; já inicie atualizando, basta descomentar o comando &lt;i&gt;atualizar()&lt;/i&gt;. &lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;text-align: justify;&quot;&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;setAtualizando&lt;/b&gt;:&lt;/i&gt; É o responsável por mostrar o item ou a &lt;i&gt;progressbar&lt;/i&gt; na &lt;i&gt;actionbar&lt;/i&gt;.&amp;nbsp; &lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Por fim temos a classe interna &lt;i&gt;Operacao&lt;/i&gt;, uma subclasse de &lt;i&gt;&lt;a href=&quot;http://developer.android.com/reference/android/os/AsyncTask.html&quot; target=&quot;_blank&quot;&gt;AsyncTask&lt;/a&gt;&lt;/i&gt; que nos permite executar tarefas em &lt;i&gt;background&lt;/i&gt; e atualizar a interface sem precisar de &lt;i&gt;threads&lt;/i&gt;. Não vou entrar em detalhes sobre este tipo de classe, apenas saiba que o método &lt;i&gt;doInBackground&lt;/i&gt; é usado para executar as operações (no exemplo chamei &lt;i&gt;Thread.sleep(2000)&lt;/i&gt; apenas pra simular um procedimento rápido) e &lt;i&gt;onPostExecute&lt;/i&gt; é executado quando &lt;i&gt;doInBackground &lt;/i&gt;finalizar. E temos a variável &lt;i&gt;exception&lt;/i&gt; que é usada pelos métodos para descobrir se a operação finalizou com sucesso.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Qualquer dúvida deixe nos comentários!&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://marciosouzajunior.blogspot.com/feeds/8417556786083059926/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://marciosouzajunior.blogspot.com/2013/03/progressbar-dentro-de-uma-actionbar.html#comment-form' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/8417556786083059926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/8417556786083059926'/><link rel='alternate' type='text/html' href='http://marciosouzajunior.blogspot.com/2013/03/progressbar-dentro-de-uma-actionbar.html' title='ProgressBar dentro de uma ActionBar - Android'/><author><name>Márcio de Souza Júnior</name><uri>http://www.blogger.com/profile/01965624113971008303</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhhHaeQ0KFJLa9sF-g0U20CGanZi7SGTbKBUvKTJ5SC0ksLQfMslm7V9u6wXbI-q7Z-ZrPiYCn8Wd7UaLEEaUJ0_gc6o5yxY-oNrpoIEYSjIW0SvXOfqw5PbxiycjbKCuDu9RU5wStp4ka/s72-c/gmail_app.png" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5856286885704734621.post-2534476804657452705</id><published>2013-01-18T13:23:00.000-02:00</published><updated>2016-06-10T10:25:21.881-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="android"/><title type='text'>Android + ksoap2: Recebendo um Array de Objetos</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Neste tutorial pretendo mostrar de forma simples como criar um &lt;i&gt;Web Service &lt;/i&gt;em Java utilizando o NetBeans e uma aplicação cliente para consumir o serviço no Android. O &lt;i&gt;Web Service&lt;/i&gt; vai implementar uma operação que deverá retornar um &lt;i&gt;array&lt;/i&gt; de objetos. Na aplicação Android esse &lt;i&gt;array&lt;/i&gt; será recebido e utilizado para preencher uma lista de itens (&lt;i&gt;ListView&lt;/i&gt;).&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Ferramentas utilizadas:&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;NetBeans 7.1 + Tomcat 7 (servidor)&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Eclipse + ADT - Android Developer Tools v21.0.1-543035 (cliente)&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Criando o Web Service&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Não vou entrar em detalhes sobre a criação da aplicação no NetBeans porque já existe um bom tutorial disponível &lt;a href=&quot;http://netbeans.org/kb/docs/websvc/jax-ws_pt_BR.html&quot; target=&quot;_blank&quot;&gt;aqui&lt;/a&gt;. Após criar o projeto, crie também uma classe para o objeto que será retornado. Para fins de exemplo vou utilizar a seguinte classe:&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;public class Fornecedor {

    int codigo;
    String razaoSocial;
    String cpfCnpj;

    public Fornecedor() {
    }

    public Fornecedor(int codigo, String razaoSocial, String cpfCnpj) {
        this.codigo = codigo;
        this.razaoSocial = razaoSocial;
        this.cpfCnpj = cpfCnpj;
    }

    public int getCodigo() {
        return codigo;
    }

    public void setCodigo(int codigo) {
        this.codigo = codigo;
    }

    public String getCpfCnpj() {
        return cpfCnpj;
    }

    public void setCpfCnpj(String cpfCnpj) {
        this.cpfCnpj = cpfCnpj;
    }

    public String getRazaoSocial() {
        return razaoSocial;
    }

    public void setRazaoSocial(String razaoSocial) {
        this.razaoSocial = razaoSocial;
    }

    @Override
    public String toString() {
        return getCodigo() + &quot;. &quot; + getRazaoSocial();
    }
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;É importante que sua classe tenha um construtor padrão, sem argumentos. Pode parecer inútil mas o Tomcat não vai implantar o projeto sem ele. O método &lt;i&gt;toString&lt;/i&gt; deverá ser sobrescrito na classe, mas isto será útil apenas na aplicação cliente ao preencher a lista, pois será utilizada a mesma classe.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Seguindo o tutorial que foi sugerido, você deve criar uma operação que não receberá parâmetros e que a saída será do tipo &lt;i&gt;List&amp;lt;Fornecedor&amp;gt;&lt;/i&gt;. Para o exemplo vou chamar esta operação de &lt;i&gt;getFornecedores&lt;/i&gt;. O código deverá ser parecido com este:&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;@WebService(serviceName = &quot;GetFornecedores&quot;)
public class GetFornecedores {

    @WebMethod(operationName = &quot;getFornecedores&quot;)
    public List&amp;lt;Fornecedor&amp;gt; getFornecedores() {

        List&amp;lt;Fornecedor&amp;gt; listFornecedores = new ArrayList&amp;lt;Fornecedor&amp;gt;();

        listFornecedores.add(new Fornecedor(1, &quot;Fornecedor 1&quot;, &quot;0123456789&quot;));
        listFornecedores.add(new Fornecedor(2, &quot;Fornecedor 2&quot;, &quot;0123456789&quot;));
        listFornecedores.add(new Fornecedor(3, &quot;Fornecedor 3&quot;, &quot;0123456789&quot;));

        return listFornecedores;

    }
    
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Após implantar e executar o projeto, o arquivo &lt;i&gt;wsdl&lt;/i&gt; pode ser acessado através do &lt;i&gt;browser&lt;/i&gt;, de acordo com suas configurações&lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;http://localhost:8080/TestWSApp/GetFornecedores?wsdl&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Com o projeto rodando vamos para a segunda parte.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Criando o cliente Android&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Crie um projeto no Eclipse com uma &lt;i&gt;Activity&lt;/i&gt; principal e adicione a &lt;i&gt;lib&lt;/i&gt; &lt;a href=&quot;http://ksoap2-android.googlecode.com/svn/m2-repo/com/google/code/ksoap2-android/ksoap2-android-assembly/3.0.0-RC.4/ksoap2-android-assembly-3.0.0-RC.4-jar-with-dependencies.jar&quot; target=&quot;_blank&quot;&gt;ksoap2&lt;/a&gt; no &lt;i&gt;Build Path&lt;/i&gt;. Copie a classe &lt;i&gt;Fornecedor&lt;/i&gt; citada anteriormente e cole no pacote do projeto. Então crie uma classe chamada &lt;i&gt;ConexaoWS&lt;/i&gt; com o seguinte código:&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;

public class ConexaoWS {

 private static final String NAMESPACE = &quot;http://testws.me.org/&quot;;
 private static final String METHOD_NAME = &quot;getFornecedores&quot;;
 private static final String SOAP_ACTION = &quot;http://testws.me.org/getFornecedores&quot;;
 private static final String URL = &quot;http://10.1.0.116:8080/TestWSApp/GetFornecedores?wsdl&quot;;

 public Fornecedor[] getFornecedores() throws Exception {

  SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

  SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
  envelope.dotNet = true;
  envelope.setOutputSoapObject(request);

  HttpTransportSE ht = new HttpTransportSE(URL);
  ht.call(SOAP_ACTION, envelope);

  SoapObject response = (SoapObject) envelope.bodyIn;

  Fornecedor[] fornecedores = new Fornecedor[response.getPropertyCount()];

  for (int c = 0; c &amp;lt; fornecedores.length; c++) {

   SoapObject soapObject = (SoapObject) response.getProperty(c);

   Fornecedor f = new Fornecedor();
   f.codigo = Integer.parseInt(soapObject.getProperty(0).toString());
   f.cpfCnpj = soapObject.getProperty(1).toString();   
   f.razaoSocial = soapObject.getProperty(2).toString();
   fornecedores[c] = f;

  }

  return fornecedores;

 }

}
&lt;/pre&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;As principais alterações a serem feitas são nas constantes:&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;b&gt;NAMESPACE&lt;/b&gt;: Pode ser encontrado no arquivo &lt;i&gt;wsdl&lt;/i&gt;, mas normalmente é &lt;i&gt;&quot;http://&quot; + pacote + &quot;/&quot;&amp;nbsp;&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;b&gt;METHOD_NAME&lt;/b&gt;: Mesmo nome dado a operação&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;b&gt;SOAP_ACTION&lt;/b&gt;: &lt;i&gt;NAMESPACE&lt;/i&gt; + &lt;i&gt;METHOD_NAME&lt;/i&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;b&gt;URL&lt;/b&gt;: Endereço do arquivo &lt;i&gt;wsdl&lt;/i&gt; (&lt;span style=&quot;color: red;&quot;&gt;nos meus testes a conexão foi recusada quando utilizei localhost ou 127.0.0.1, portanto use o IP real da sua máquina&lt;/span&gt;)&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Com isto fica faltando o &lt;i&gt;layout&lt;/i&gt; da aplicação e a chamada do método. Para o &lt;i&gt;layout&lt;/i&gt; utilize a seguinte definição:&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;&amp;lt;RelativeLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    xmlns:tools=&quot;http://schemas.android.com/tools&quot;
    android:layout_width=&quot;match_parent&quot;
    android:layout_height=&quot;match_parent&quot;
    tools:context=&quot;.MainActivity&quot; &amp;gt;

    &amp;lt;ListView
        android:id=&quot;@android:id/list&quot;
        android:layout_width=&quot;match_parent&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:layout_alignParentLeft=&quot;true&quot;
        android:layout_alignParentTop=&quot;true&quot; &amp;gt;

    &amp;lt;/ListView&amp;gt;

&amp;lt;/RelativeLayout&amp;gt;
&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;E para a classe principal utilize o seguinte código:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
public class MainActivity extends ListActivity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  // Operações de rede não podem ser realizadas na thread principal
  new MyAsyncTask().execute();

 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  getMenuInflater().inflate(R.menu.activity_main, menu);
  return true;
 }

 private class MyAsyncTask extends AsyncTask&amp;lt;Void, Void, Fornecedor[]&amp;gt; {

  boolean erro = false;

  private final ProgressDialog dialog = new ProgressDialog(
    MainActivity.this);

  @Override
  protected void onProgressUpdate(Void... values) {

   this.dialog.setMessage(&quot;Aguarde...&quot;);
   this.dialog.show();

  }

  @Override
  protected Fornecedor[] doInBackground(Void... params) {

   Fornecedor[] retorno = null;

   try {

    ConexaoWS conexao = new ConexaoWS();
    retorno = conexao.getFornecedores();

   } catch (Exception e) {
    erro = true;
    e.printStackTrace();
   }

   return retorno;

  }

  @Override
  protected void onPostExecute(Fornecedor[] result) {

   if (this.dialog.isShowing()) {
    this.dialog.dismiss();
   }

   if (erro == false) {

    List&amp;lt;Fornecedor&amp;gt; listaFornecedores = Arrays.asList(result);
    ArrayAdapter&amp;lt;Fornecedor&amp;gt; adapter = new ArrayAdapter&amp;lt;Fornecedor&amp;gt;(
      MainActivity.this, android.R.layout.simple_list_item_1,
      listaFornecedores);
    setListAdapter(adapter);

   } else {
    
    Toast.makeText(MainActivity.this,
      &quot;Ocorreu um erro ao acessar o Web Service.&quot;,
      Toast.LENGTH_LONG).show();
    
   }

  }

 }

}
&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Se você é leigo em programação para Android, recomendo que procure entender como funcionam as classes &lt;i&gt;ListActivity&lt;/i&gt; e &lt;i&gt;AsyncTask&lt;/i&gt; para melhor compreensão do exemplo. O resultado da aplicação será este:

&lt;foto&gt;&amp;nbsp;&lt;/foto&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;
&lt;/span&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUklQCELDZxtsmaFoESRbyTPmKyO49qoy-4mx5R7WQatzmqhyT0jCJwwo8RtDrvhKR0Br6mZYmLIUYa3ELNxgJmZGT96-WS2airr8X-bGkmrEJubVEjAHMO1u7SHiU28KILMctOn58NZQP/s1600/testws.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUklQCELDZxtsmaFoESRbyTPmKyO49qoy-4mx5R7WQatzmqhyT0jCJwwo8RtDrvhKR0Br6mZYmLIUYa3ELNxgJmZGT96-WS2airr8X-bGkmrEJubVEjAHMO1u7SHiU28KILMctOn58NZQP/s320/testws.png&quot; width=&quot;195&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;foto&gt;Espero que tenham gostado. Qualquer dúvida deixe nos comentários.&lt;/foto&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://marciosouzajunior.blogspot.com/feeds/2534476804657452705/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://marciosouzajunior.blogspot.com/2013/01/android-ksoap2-recebendo-um-array-de.html#comment-form' title='8 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/2534476804657452705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/2534476804657452705'/><link rel='alternate' type='text/html' href='http://marciosouzajunior.blogspot.com/2013/01/android-ksoap2-recebendo-um-array-de.html' title='Android + ksoap2: Recebendo um Array de Objetos'/><author><name>Márcio de Souza Júnior</name><uri>http://www.blogger.com/profile/01965624113971008303</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUklQCELDZxtsmaFoESRbyTPmKyO49qoy-4mx5R7WQatzmqhyT0jCJwwo8RtDrvhKR0Br6mZYmLIUYa3ELNxgJmZGT96-WS2airr8X-bGkmrEJubVEjAHMO1u7SHiU28KILMctOn58NZQP/s72-c/testws.png" height="72" width="72"/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5856286885704734621.post-183538460921584383</id><published>2012-09-19T17:32:00.002-03:00</published><updated>2012-09-27T08:20:46.028-03:00</updated><title type='text'>Os sistemas legados</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana,sans-serif;&quot;&gt;É muito comum hoje em dia o profissional da área de sistemas passar anos na faculdade estudando linguagens modernas e quando entra no mercado de trabalho se vê diante de tecnologias totalmente obsoletas. Muitas empresas ainda mantém sistemas antigos rodando e pode ser difícil encontrar um lugar para trabalhar com tecnologias novas.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5kqyr3leej0OKUnZYOhiKqa9vgiLshQAHf-NiANqenLQyk4Y20NjgnCnoYt-1_qxcXoqyuVBZ0ENpC4xz0KuyKSUj0nxuwkLh2lh_Vvt3dalFbCeg5Rh-2DbePVW_bajOE_7Tmig5u0dm/s1600/suporte.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;277&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5kqyr3leej0OKUnZYOhiKqa9vgiLshQAHf-NiANqenLQyk4Y20NjgnCnoYt-1_qxcXoqyuVBZ0ENpC4xz0KuyKSUj0nxuwkLh2lh_Vvt3dalFbCeg5Rh-2DbePVW_bajOE_7Tmig5u0dm/s320/suporte.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana,sans-serif;&quot;&gt;É notável a velocidade em que as coisas caminham no mundo da informática. Uma das &quot;leis&quot; na programação de computadores diz que &lt;span class=&quot;st&quot;&gt;&lt;i&gt;Qualquer dado programa, quando rodando, é obsoleto&lt;/i&gt;. Mas mesmo com todas atualizações, novas versões com mais recursos e facilidades, as empresas ainda mantém seus antigos sistemas rodando por vários anos.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Verdana,sans-serif;&quot;&gt;&lt;span class=&quot;st&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;b&gt;&lt;span style=&quot;font-family: Verdana,sans-serif;&quot;&gt;&lt;span class=&quot;st&quot;&gt;Por que as empresas mantém sistemas legados?&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana,sans-serif;&quot;&gt;&lt;span class=&quot;st&quot;&gt;Muitas empresas acreditam que não devem trocar o sistema simplesmente porque ele está funcionando, mas na verdade é importante avaliar as desvantagens de mantê-lo como &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Verdana,sans-serif;&quot;&gt;&lt;span class=&quot;st&quot;&gt;&lt;span style=&quot;font-family: Verdana,sans-serif;&quot;&gt;&lt;span class=&quot;st&quot;&gt; por exemplo&lt;/span&gt;&lt;/span&gt; a dificuldade na integração&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Verdana,sans-serif;&quot;&gt;&lt;span class=&quot;st&quot;&gt;. Desvantagem esta que foi observada após a obrigatoriedade de emitir nota fiscal eletrônica, visto que muitos sistemas não possuem recursos para comunicação via web. Ainda nesse aspecto, com o avanço no desenvolvimento de dispositivos móveis e a alta disponibilidade de serviços de internet, esses sistemas não estão preparados para aproveitar tais recursos. Mesmo que apresentem soluções para contornar estes problemas, o resultado final não é dos mais elegantes.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana,sans-serif;&quot;&gt;&lt;span class=&quot;st&quot;&gt;Outro motivo pelo qual as empresas optam por não trocam o sistema é o alto custo despendido com o desenvolvimento de um novo sistema. Sim, existem soluções prontas a todos custos mas é preciso que a empresa veja isso como um investimento e entenda a importância de ter um sistema que realmente atenda suas necessidades.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana,sans-serif;&quot;&gt;&lt;span class=&quot;st&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span style=&quot;font-family: Verdana,sans-serif;&quot;&gt;&lt;span class=&quot;st&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-family: Verdana,sans-serif;&quot;&gt;&lt;span class=&quot;st&quot;&gt;Compensa trabalhar com uma tecnologia obsoleta?&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7ji5TrD7JGgvZT7T6BoAqnxIN70UZPoTT9kIHc4aMF8Y5b1E3eljxYxeMRbs36oiqvlUxKr6cYg7OSg4Vizr4GOiCP5PV9B5br57fFm6EYfh_vV84CSPI0V8iWyES_rUmVjSPkknfcZVb/s1600/fita_disquete.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;224&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7ji5TrD7JGgvZT7T6BoAqnxIN70UZPoTT9kIHc4aMF8Y5b1E3eljxYxeMRbs36oiqvlUxKr6cYg7OSg4Vizr4GOiCP5PV9B5br57fFm6EYfh_vV84CSPI0V8iWyES_rUmVjSPkknfcZVb/s320/fita_disquete.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span style=&quot;font-family: Verdana,sans-serif;&quot;&gt;&lt;span class=&quot;st&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana,sans-serif;&quot;&gt;&lt;span class=&quot;st&quot;&gt;O importante é ter conhecimento e não ficar fora do mercado, independente da tecnologia. As empresas tem dificuldade de encontrar profissionais para trabalhar com determinados sistemas e geralmente são vagas com uma boa remuneração.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana,sans-serif;&quot;&gt;&lt;span class=&quot;st&quot;&gt;É necessário se manter atualizado pois muitos sistemas estão sendo construídos e outros sendo migrados, mas acredito que é preciso saber aproveitar as oportunidades e fazer o que tem que ser feito.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://marciosouzajunior.blogspot.com/feeds/183538460921584383/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://marciosouzajunior.blogspot.com/2012/09/os-sistemas-legados.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/183538460921584383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/183538460921584383'/><link rel='alternate' type='text/html' href='http://marciosouzajunior.blogspot.com/2012/09/os-sistemas-legados.html' title='Os sistemas legados'/><author><name>Márcio de Souza Júnior</name><uri>http://www.blogger.com/profile/01965624113971008303</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5kqyr3leej0OKUnZYOhiKqa9vgiLshQAHf-NiANqenLQyk4Y20NjgnCnoYt-1_qxcXoqyuVBZ0ENpC4xz0KuyKSUj0nxuwkLh2lh_Vvt3dalFbCeg5Rh-2DbePVW_bajOE_7Tmig5u0dm/s72-c/suporte.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5856286885704734621.post-648137409253631937</id><published>2012-09-04T08:38:00.001-03:00</published><updated>2012-09-04T08:38:34.449-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="humor"/><title type='text'>Cantada Nerd</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIBUrvm67jUIc_G44H10o9yTgCRWAACrDG-C3y-kk_beN0N_luQWUgVEWDha3JyweSwZApp7YWiEMV0xnUTsdLbHHE2AtkEMVsS-4gInydYTM4AdSzmEEu0Tm_er4Hka68kaK90lKMDhua/s1600/cheiadeclasse.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIBUrvm67jUIc_G44H10o9yTgCRWAACrDG-C3y-kk_beN0N_luQWUgVEWDha3JyweSwZApp7YWiEMV0xnUTsdLbHHE2AtkEMVsS-4gInydYTM4AdSzmEEu0Tm_er4Hka68kaK90lKMDhua/s320/cheiadeclasse.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://marciosouzajunior.blogspot.com/feeds/648137409253631937/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://marciosouzajunior.blogspot.com/2012/09/cantada-nerd.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/648137409253631937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/648137409253631937'/><link rel='alternate' type='text/html' href='http://marciosouzajunior.blogspot.com/2012/09/cantada-nerd.html' title='Cantada Nerd'/><author><name>Márcio de Souza Júnior</name><uri>http://www.blogger.com/profile/01965624113971008303</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIBUrvm67jUIc_G44H10o9yTgCRWAACrDG-C3y-kk_beN0N_luQWUgVEWDha3JyweSwZApp7YWiEMV0xnUTsdLbHHE2AtkEMVsS-4gInydYTM4AdSzmEEu0Tm_er4Hka68kaK90lKMDhua/s72-c/cheiadeclasse.jpg" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5856286885704734621.post-5383016992596456831</id><published>2012-09-02T12:31:00.000-03:00</published><updated>2012-09-02T14:44:10.513-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="postgresql"/><title type='text'>Window Function - PostgreSQL </title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTRNFaqkPQsEltDjgaU1yqjS6eHl-Z99Z5dXICBO20as8YxXyK-383fMccQjmrEBXweifLuYONtdCxh-3gBfee4aErn6fsG1Kd4g5Z3jPMgdmmU4lfCBmOf4syJGeC2RwDmOkvG6Z4Q7fV/s1600/window.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTRNFaqkPQsEltDjgaU1yqjS6eHl-Z99Z5dXICBO20as8YxXyK-383fMccQjmrEBXweifLuYONtdCxh-3gBfee4aErn6fsG1Kd4g5Z3jPMgdmmU4lfCBmOf4syJGeC2RwDmOkvG6Z4Q7fV/s200/window.jpg&quot; width=&quot;173&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;i&gt;Window function&lt;/i&gt; é um recurso muito útil porque nos permite realizar cálculos que antes só poderiam ser feitos com &lt;i&gt;functions&lt;/i&gt; ou &lt;i&gt;subquerys&lt;/i&gt;, assim podemos escrever menos código e evitar &lt;i&gt;joins&lt;/i&gt;. Uma &lt;i&gt;window function&lt;/i&gt; consegue particionar as linhas de uma consulta e fazer cálculos dentro destas partições. É como fazemos com funções agregadas, porém sem agrupar e mantendo as linhas separadas.
Pra começar, disponibilizo as sentenças para criar e popular uma tabela com dados que vão servir de exemplo:&lt;/div&gt;
&lt;br /&gt;
&lt;pre class=&quot;sql&quot; name=&quot;code&quot;&gt;CREATE TABLE formula1
(
  posicao integer NOT NULL,
  piloto character varying(100),
  equipe character varying(100),
  pontos integer,
  CONSTRAINT pk_formula1 PRIMARY KEY (posicao)
);

INSERT INTO formula1 VALUES (1, &#39;FERNANDO ALONSO&#39;, &#39;FERRARI&#39;, 164);
INSERT INTO formula1 VALUES (2, &#39;MARK WEBBER&#39;, &#39;RED BULL&#39;, 124);
INSERT INTO formula1 VALUES (3, &#39;SEBASTIAN VETTEL&#39;, &#39;RED BULL&#39;, 122);
INSERT INTO formula1 VALUES (4, &#39;LEWIS HAMILTON&#39;, &#39;MCLAREN&#39;, 117);
INSERT INTO formula1 VALUES (5, &#39;KIMI RAIKKONEN&#39;, &#39;LOTUS&#39;, 116);
INSERT INTO formula1 VALUES (6, &#39;NICO ROSBERG&#39;, &#39;MERCEDES BENZ&#39;, 77);
INSERT INTO formula1 VALUES (7, &#39;JENSON BUTTON&#39;, &#39;MCLAREN&#39;, 76);
INSERT INTO formula1 VALUES (8, &#39;ROMAIN GROSJEAN&#39;, &#39;LOTUS&#39;, 76);
INSERT INTO formula1 VALUES (9, &#39;SERGIO PEREZ&#39;, &#39;SAUBER&#39;, 47);
INSERT INTO formula1 VALUES (10, &#39;KAMUI KOBAYASHI&#39;, &#39;SAUBER&#39;, 33);
&lt;/pre&gt;
&lt;br /&gt;
Fazendo um simples &lt;i&gt;select&lt;/i&gt; temos o seguinte resultado:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;span style=&quot;font-size: medium;&quot;&gt; posicao |      piloto      |    equipe     | pontos 
---------+------------------+---------------+--------
       1 | FERNANDO ALONSO  | FERRARI       |    164
       2 | MARK WEBBER      | RED BULL      |    124
       3 | SEBASTIAN VETTEL | RED BULL      |    122
       4 | LEWIS HAMILTON   | MCLAREN       |    117
       5 | KIMI RAIKKONEN   | LOTUS         |    116
       6 | NICO ROSBERG     | MERCEDES BENZ |     77
       7 | JENSON BUTTON    | MCLAREN       |     76
       8 | ROMAIN GROSJEAN  | LOTUS         |     76
       9 | SERGIO PEREZ     | SAUBER        |     47
      10 | KAMUI KOBAYASHI  | SAUBER        |     33
&lt;/span&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Analisando os dados, imagine uma forma de inserir mais uma coluna que mostrará a soma de pontos por equipes. Poderia usar uma &lt;i&gt;subquery&lt;/i&gt;:&lt;/div&gt;
&lt;br /&gt;
&lt;pre class=&quot;sql&quot; name=&quot;code&quot;&gt;SELECT *, 
 (SELECT SUM(pontos) FROM formula1 aux
 WHERE formula1.equipe = aux.equipe
 GROUP BY equipe) AS pontos_equipe
FROM formula1
ORDER BY posicao
&lt;/pre&gt;
&lt;br /&gt;
Poderia usar uma &lt;i&gt;function&lt;/i&gt; também, mas fica melhor com uma &lt;i&gt;window function&lt;/i&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;sql&quot; name=&quot;code&quot;&gt;SELECT *, SUM(pontos) OVER (PARTITION BY equipe) AS pontos_equipe 
FROM formula1
ORDER BY posicao
&lt;/pre&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;span style=&quot;font-size: small;&quot;&gt; posicao |      piloto      |    equipe     | pontos | pontos_equipe 
---------+------------------+---------------+--------+---------------
       1 | FERNANDO ALONSO  | FERRARI       |    164 |           164
       2 | MARK WEBBER      | RED BULL      |    124 |           246
       3 | SEBASTIAN VETTEL | RED BULL      |    122 |           246
       4 | LEWIS HAMILTON   | MCLAREN       |    117 |           193
       5 | KIMI RAIKKONEN   | LOTUS         |    116 |           192
       6 | NICO ROSBERG     | MERCEDES BENZ |     77 |            77
       7 | JENSON BUTTON    | MCLAREN       |     76 |           193
       8 | ROMAIN GROSJEAN  | LOTUS         |     76 |           192
       9 | SERGIO PEREZ     | SAUBER        |     47 |            80
      10 | KAMUI KOBAYASHI  | SAUBER        |     33 |            80
&lt;/span&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;div style=&quot;text-align: right;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihbHea8whoqL5V2l9_bIcmHPzf1rbG8dYVxJJetjnulaal_xznjTdp8mOcpOqBlz2uoPLgxY_9z1x-3Or6uQN4x6OYcmzHh8RW4ur2ENmX1EagklMRmdKXElW0CKw79cguJYojGvT9vzG3/s1600/2-grid-girls.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;160&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihbHea8whoqL5V2l9_bIcmHPzf1rbG8dYVxJJetjnulaal_xznjTdp8mOcpOqBlz2uoPLgxY_9z1x-3Or6uQN4x6OYcmzHh8RW4ur2ENmX1EagklMRmdKXElW0CKw79cguJYojGvT9vzG3/s200/2-grid-girls.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
A chamada da função deve vir acompanhada da cláusula &lt;i&gt;OVER&lt;/i&gt;. É isto que determina quais linhas estarão disponíveis para o processamento da função. A outra instrução, &lt;i&gt;PARTITION BY&lt;/i&gt;, divide as linhas em grupos para que a função seja aplicada sobre elas. Também podemos definir a ordem que as linhas serão processadas pela função usando &lt;i&gt;ORDER BY&lt;/i&gt;. A &lt;i&gt;window function&lt;/i&gt; processa as linhas independente da ordem em que estão sendo exibidas, portanto deve-se ter cuidado para que os dados sejam processados na ordem desejada. 
Suponhamos que queremos saber quem é o piloto número 1 e 2 de cada equipe, sendo o número 1 com a maior quantidade de pontos:&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;pre class=&quot;sql&quot; name=&quot;code&quot;&gt;SELECT *, row_number() OVER (PARTITION BY equipe ORDER BY posicao) AS numero_piloto
FROM formula1
ORDER BY posicao
&lt;/pre&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;span style=&quot;font-size: medium;&quot;&gt; posicao |      piloto      |    equipe     | pontos | numero_piloto 
---------+------------------+---------------+--------+---------------
       1 | FERNANDO ALONSO  | FERRARI       |    164 |             1
       2 | MARK WEBBER      | RED BULL      |    124 |             1
       3 | SEBASTIAN VETTEL | RED BULL      |    122 |             2
       4 | LEWIS HAMILTON   | MCLAREN       |    117 |             1
       5 | KIMI RAIKKONEN   | LOTUS         |    116 |             1
       6 | NICO ROSBERG     | MERCEDES BENZ |     77 |             1
       7 | JENSON BUTTON    | MCLAREN       |     76 |             2
       8 | ROMAIN GROSJEAN  | LOTUS         |     76 |             2
       9 | SERGIO PEREZ     | SAUBER        |     47 |             1
      10 | KAMUI KOBAYASHI  | SAUBER        |     33 |             2
&lt;/span&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
A ordenação foi necessária neste caso porque apesar da consulta ser ordenada pela posição, a &lt;i&gt;window function&lt;/i&gt; processa os dados de acordo com sua própria ordenação.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Nesta última &lt;i&gt;query&lt;/i&gt; temos o uso da função &lt;i&gt;row_number&lt;/i&gt;, que é uma &lt;i&gt;window function&lt;/i&gt; embutida. Funções deste tipo devem ser chamadas somente usando a sintaxe da &lt;i&gt;window function&lt;/i&gt; (onde a cláusula &lt;i&gt;OVER&lt;/i&gt; é obrigatória).&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Tanto as funções embutidas quanto as de agregação podem ser usadas como &lt;i&gt;window functions&lt;/i&gt;, mas as de agregação somente se comportam como &lt;i&gt;window functions&lt;/i&gt; quando chamadas com a cláusula &lt;i&gt;OVER&lt;/i&gt;, caso contrário serão apenas funções de agregação regulares. Outras funções embutidas podem ser encontradas &lt;a href=&quot;http://www.postgresql.org/docs/9.1/static/functions-window.html&quot; target=&quot;_blank&quot;&gt;aqui&lt;/a&gt;, mas vou apresentar algumas:&amp;nbsp;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;&lt;i&gt;lag(coluna, deslocamento)&lt;/i&gt; &lt;/b&gt;- Usada para retornar valores de linhas anteriores onde o deslocamento determina quantas linhas antes.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;lead(coluna, deslocamento)&lt;/b&gt; &lt;/i&gt;- Parecida com a função anterior, mas para linhas posteriores.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;i&gt;first_value(coluna)&lt;/i&gt;&lt;/b&gt; - Retorna o valor da primeira linha.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;last_value(coluna)&lt;/b&gt; &lt;/i&gt;- Retorna o valor da última linha.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
E pra finalizar, caso uma &lt;i&gt;query&lt;/i&gt; tenha mais de uma &lt;i&gt;window function&lt;/i&gt; com o mesmo comportamento, é possível utilizar uma cláusula &lt;i&gt;WINDOW&lt;/i&gt; que será referenciada em &lt;i&gt;OVER&lt;/i&gt;:&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;pre class=&quot;sql&quot; name=&quot;code&quot;&gt;SELECT *, row_number() OVER w AS numero_piloto
FROM formula1
WINDOW w AS (PARTITION BY equipe ORDER BY posicao)
ORDER BY posicao
&lt;/pre&gt;
&lt;br /&gt;
Referência: &lt;a href=&quot;http://www.postgresql.org/docs/9.1/static/tutorial-window.html&quot;&gt;http://www.postgresql.org/docs/9.1/static/tutorial-window.html&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://marciosouzajunior.blogspot.com/feeds/5383016992596456831/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://marciosouzajunior.blogspot.com/2012/09/window-functions-postgresql.html#comment-form' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/5383016992596456831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/5383016992596456831'/><link rel='alternate' type='text/html' href='http://marciosouzajunior.blogspot.com/2012/09/window-functions-postgresql.html' title='Window Function - PostgreSQL '/><author><name>Márcio de Souza Júnior</name><uri>http://www.blogger.com/profile/01965624113971008303</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTRNFaqkPQsEltDjgaU1yqjS6eHl-Z99Z5dXICBO20as8YxXyK-383fMccQjmrEBXweifLuYONtdCxh-3gBfee4aErn6fsG1Kd4g5Z3jPMgdmmU4lfCBmOf4syJGeC2RwDmOkvG6Z4Q7fV/s72-c/window.jpg" height="72" width="72"/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5856286885704734621.post-2381529022317637206</id><published>2012-06-29T16:39:00.002-03:00</published><updated>2012-06-29T16:48:39.702-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="postgresql"/><title type='text'>Exemplo de função no PostgreSQL</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
Esta semana precisei criar uma função no banco de dados &lt;i&gt;PostgreSQL&lt;/i&gt; que me retornasse o menor valor dentre outros cotados. Nesta função eu passo dois parâmetros: codigo do material e codigo da cotação (ambos do tipo inteiro).&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
A função me retorna um tipo &lt;i&gt;NUMERIC(20, 2)&lt;/i&gt;, que é o tipo no qual venho trabalhando com valores monetários pois segundo a própria documentação do &lt;a href=&quot;http://www.postgresql.org/docs/9.1/static/datatype-numeric.html&quot;&gt;&lt;i&gt;PostgreSQL&lt;/i&gt;&lt;/a&gt;:&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt; It is especially recommended for storing monetary
    amounts and other quantities where exactness is required.&lt;/i&gt;&lt;/blockquote&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Outro detalhe importante que podemos observar é que na &lt;i&gt;query&lt;/i&gt;, os valores contidos nos parâmetros são lidos utilizando &lt;i&gt;$1&lt;/i&gt; e &lt;i&gt;$2&lt;/i&gt; respectivamente. Vejamos:&lt;/div&gt;
&lt;br /&gt;
&lt;pre class=&quot;sql&quot; name=&quot;code&quot;&gt;CREATE FUNCTION func_menor_valor(codigo_material INT, codigo_cotacao INT)
RETURNS NUMERIC(20, 2) AS $$ 

 SELECT MIN(valor_total) AS menor_valor FROM view_cotacoes
 WHERE codigo_material = $1 AND codigo_cotacao = $2
 GROUP BY codigo_material;

$$ LANGUAGE SQL;
&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Enfim, isso é apenas um exemplo básico de função. Mais informações podem ser encontradas na &lt;a href=&quot;http://www.postgresql.org/docs/9.1/static/sql-createfunction.html&quot;&gt;documentação&lt;/a&gt;. Também é importante lembrar que a versão do &lt;i&gt;PostgreSQL&lt;/i&gt; utilizada foi a 9.1.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marciosouzajunior.blogspot.com/feeds/2381529022317637206/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://marciosouzajunior.blogspot.com/2012/06/exemplo-de-funcao-no-postgresql.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/2381529022317637206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/2381529022317637206'/><link rel='alternate' type='text/html' href='http://marciosouzajunior.blogspot.com/2012/06/exemplo-de-funcao-no-postgresql.html' title='Exemplo de função no PostgreSQL'/><author><name>Márcio de Souza Júnior</name><uri>http://www.blogger.com/profile/01965624113971008303</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5856286885704734621.post-2819359068159407927</id><published>2012-06-22T15:57:00.000-03:00</published><updated>2014-09-20T15:20:48.315-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="jtable"/><title type='text'>JTable - Selecionar todo texto quando editar uma célula</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
Olá, hoje vou dar início a uma série de postagens rápidas. Normalmente quando abordo um assunto, sempre procuro introduzir os conceitos e explicar detalhadamente cada passo para realizar o procedimento. Mas como não estou tendo tempo pra fazer estas postagens mais elaboradas, resolvi mudar o estilo e tornar esse blog em algo parecido com um depósito de códigos. Assim mantenho o blog ativo e mantenho uma biblioteca com meus códigos pra quem quiser copiar (as vezes eu mesmo preciso de um código que fiz e não acho).&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Então vamos ao que interessa.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Quando temos uma célula editável numa &lt;i&gt;JTable&lt;/i&gt; e clicamos na mesma para fazer a edição, normalmente temos que selecionar e apagar o valor presente na célula para entrar com outro. Para melhorar isto e já selecionar todo conteúdo da célula quando ela entrar em edição, sobrescrevemos o método &lt;i&gt;changeSelection&lt;/i&gt; da &lt;i&gt;JTable&lt;/i&gt; conforme abaixo:&lt;/div&gt;
&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;tbExemplo = new javax.swing.JTable()
{
    // Selecionar o conteúdo da célula quando editar
    public void changeSelection(int row, int column, boolean toggle, boolean extend)
    {
        super.changeSelection(row, column, toggle, extend);

        if (editCellAt(row, column))
        {
            Component editor = getEditorComponent();
            editor.requestFocusInWindow();

            if (editor instanceof JTextComponent){
                ((JTextComponent) editor).selectAll();          
            }
        }
    }
};&lt;/pre&gt;
&lt;br /&gt;
P.S.: Todos códigos foram testados por mim e são funcionais. Qualquer dúvida pergunte nos comentários.</content><link rel='replies' type='application/atom+xml' href='http://marciosouzajunior.blogspot.com/feeds/2819359068159407927/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://marciosouzajunior.blogspot.com/2012/06/jtable-selecionar-todo-texto-quando.html#comment-form' title='9 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/2819359068159407927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/2819359068159407927'/><link rel='alternate' type='text/html' href='http://marciosouzajunior.blogspot.com/2012/06/jtable-selecionar-todo-texto-quando.html' title='JTable - Selecionar todo texto quando editar uma célula'/><author><name>Márcio de Souza Júnior</name><uri>http://www.blogger.com/profile/01965624113971008303</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5856286885704734621.post-9058192605784970208</id><published>2012-03-09T12:47:00.001-03:00</published><updated>2013-04-29T17:43:39.866-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="JTextField"/><title type='text'>Como limitar um JTextField</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
É muito comum encontrar nos fóruns especializados em &lt;i&gt;Java&lt;/i&gt; a seguinte questão: &quot;Como eu faço para limitar o tamanho de um &lt;i&gt;JtextField&lt;/i&gt;?&quot;. Ocorre um certo desapontamento dos iniciantes na linguagem por não haver um método chamado &lt;i&gt;setMaxLenght(x)&lt;/i&gt;. Ou ainda com os que trabalham visualmente, procurar a propriedade no componente que limitaria o tamanho máximo de caracteres e não encontrar. Aí programadores que vieram do &lt;i&gt;Delphi&lt;/i&gt; por exemplo dizem &quot;O &lt;i&gt;Delphi&lt;/i&gt; é muito melhor, blablabla...&quot;. Só digo uma coisa: Revejam seus conceitos sobre o que é &lt;i&gt;Java&lt;/i&gt;.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
A verdade é que o componente &lt;i&gt;JTextField&lt;/i&gt; é definido sobre um modelo de documento que por padrão é chamado &lt;i&gt;PlainDocument&lt;/i&gt;. Portanto, para para ter o controle sobre o &lt;i&gt;JTextField&lt;/i&gt; devemos criar uma sub classe de &lt;i&gt;PlainDocument&lt;/i&gt;, sobrescrever alguns métodos dela e trocar o modelo do &lt;i&gt;JTextField&lt;/i&gt; para este novo.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Minha intenção não é entrar a fundo neste assunto, mas sim dar uma solução principalmente pra quem está trabalhando visualmente e não quer ficar editanto código a todo momento.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Então vamos lá, primeiramente crie a seguinte classe no seu projeto:&lt;/div&gt;
&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

public class JTextFieldLimit extends PlainDocument {

    private int limit;
    // optional uppercase conversion
    private boolean toUppercase = false;
    
    private int maximo = 500;

    public JTextFieldLimit(int limit) {
        super();
        if (limit == 0)
            this.limit = maximo;
        else
            this.limit = limit;
    }

    public JTextFieldLimit(int limit, boolean upper) {
        super();
        if (limit == 0)
            this.limit = maximo;
        else
            this.limit = limit;
        toUppercase = upper;
    }

    @Override
    public void insertString(int offset, String str, AttributeSet attr)
            throws BadLocationException {
        if (str == null) {
            return;
        }

        if ((getLength() + str.length()) &amp;lt;= limit) {
            if (toUppercase) {
                str = str.toUpperCase();
            }
            super.insertString(offset, str, attr);
        }
    }
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Esta classe não é nenhuma novidade e pode ser encontrada em vários sites pela internet (na verdade fiz algumas mudanças nela). O que ela faz é permitir a limitação de caracteres e opcionalmente fazer a conversão para maiúsculas. Mas o problema é que pra cada &lt;i&gt;JTextField&lt;/i&gt; criado, temos que chamar o método &lt;i&gt;setDocument&lt;/i&gt; passando essa classe e os parâmetros. Então para resolver este problema, crie o seguinte método na classe onde estão seus campos de texto:&lt;/div&gt;
&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;    public void preparaForm() {

        // JTextFields limitados e com maiúsculas
        for (Component c : this.getComponents()) {
            if (c instanceof JTextField) {
                ((JTextField) c).setDocument(new JTextFieldLimit(((JTextField) c).getColumns(), true));
            }
        }
        
    }
&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Este método deve ser chamado sempre antes de exibir o seu formulário. Ele vai verificar cada componente do formulário e caso este seja do tipo &lt;i&gt;JTextField&lt;/i&gt;, será configurado para utilizar o modelo de documento apresentado. Mas onde vou definir o limite de caracteres para cada campo? Observe que o primeiro parâmetro passado para o documento é: &lt;i&gt;((JTextField) c).getColumns()&lt;/i&gt;. Visualmente você poderá definir este número na propriedade &lt;i&gt;column&lt;/i&gt; do componente. Mas porque essa propriedade? Isto está parecendo uma bela gambiarra... Fique tranquilo, a propriedade &lt;i&gt;column&lt;/i&gt; é apenas um número usado para calcular o tamanho preferido para a largura do campo. Se ele for zero, o tamanho preferido será qualquer um dependendo da implementação do objeto. Isto é, você define a largura visualmente utilizando seu gerenciador de layout preferido e pouco importará o valor definido para a propriedade &lt;i&gt;column&lt;/i&gt;.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Enfim, trabalhando desta forma você não precisará ficar escrevendo código para configurar o documento e limite de caracteres para cada campo de texto. Isto não é problema se o projeto é simples, mas se estiver desenvolvendo vários formulários, não é muito produtivo.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;b&gt;Observação:&lt;/b&gt; O método só funciona caso esteja trabalhando com &lt;i&gt;JInternalFrames&lt;/i&gt; e caso não esteja, pode haver alguma diferença no método que retorna os componentes (&lt;i&gt;this.getComponents&lt;/i&gt;). Se for um &lt;i&gt;JDialog&lt;/i&gt; por exemplo, ficaria assim: &lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;this.getRootPane().getContentPane().getComponents()&lt;/i&gt;.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Por hoje é só! Qualquer dúvida deixe nos comentários.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Editado em 17/12/2012:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Devido a alguns &lt;i&gt;JTextFields&lt;/i&gt; estarem dentro de &lt;i&gt;JPanels&lt;/i&gt; e &lt;i&gt;JTabbedPanes&lt;/i&gt;, desenvolvi um método recursivo que poderá ser chamado dentro do método &lt;i&gt;preparaForm&lt;/i&gt; citado anteriormente:&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt; 
    private void preparaJTextFields(Object obj) {

        if (obj instanceof JTextField) {
            ((JTextField) obj).setDocument(new JTextFieldLimit(((JTextField) obj).getColumns(), true));
        }
       
        if (obj instanceof JPanel) {
            for (Component c : ((JPanel) obj).getComponents()) {
                preparaJTextFields(c);
            }
        }

        if (obj instanceof JTabbedPane) {
            for (Component c : ((JTabbedPane) obj).getComponents()) {
                preparaJTextFields(c);
            }
        }

    }   
&lt;/pre&gt;
&lt;br /&gt;
E a chamada pode ser feita assim:&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt; 
    public void preparaForm() {

        //Centraliza o JInternalFrame
        Dimension d = this.getDesktopPane().getSize();
        this.setLocation((d.width - this.getSize().width) / 2, (d.height - this.getSize().height) / 2);

        //JTextFields limitados
        preparaJTextFields(this.getContentPane());
        
    }
&lt;/pre&gt;
&lt;br /&gt;
E aproveito ainda para mostrar como não permitir acentuação nos &lt;i&gt;JTextFields&lt;/i&gt;, basta trocar a linha &lt;i&gt;super.insertString(offset, str, attr); &lt;/i&gt;da classe &lt;i&gt;JTextFieldLimit&lt;/i&gt; por:&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt; 
//super.insertString(offset, str, attr);
            
// Sem acentos
String unaccented = Normalizer.normalize(str, Normalizer.Form.NFD);
unaccented = unaccented.replaceAll(&quot;[^\\p{ASCII}]&quot;, &quot;&quot;);
super.insertString(offset, unaccented, attr);
&lt;/pre&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://marciosouzajunior.blogspot.com/feeds/9058192605784970208/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://marciosouzajunior.blogspot.com/2012/03/como-limitar-um-jtextfield.html#comment-form' title='8 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/9058192605784970208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/9058192605784970208'/><link rel='alternate' type='text/html' href='http://marciosouzajunior.blogspot.com/2012/03/como-limitar-um-jtextfield.html' title='Como limitar um JTextField'/><author><name>Márcio de Souza Júnior</name><uri>http://www.blogger.com/profile/01965624113971008303</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5856286885704734621.post-2963438097145180160</id><published>2012-03-08T12:26:00.000-03:00</published><updated>2012-03-08T12:29:01.602-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Controle de Acesso"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="JMenuBar"/><category scheme="http://www.blogger.com/atom/ns#" term="Recursividade"/><title type='text'>Como listar todos itens de um JMenuBar</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
Hoje vou ensinar como retornar todos os objetos &lt;i&gt;JMenuItems&lt;/i&gt; contidos num &lt;i&gt;JMenuBar&lt;/i&gt;. Eventualmente você pode querer retornar também os objetos &lt;i&gt;JMenu&lt;/i&gt;, então fica livre para fazer sua implementação do método.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
O método que vou apresentar pode ser muito útil para fazer o controle de acesso da aplicação, permitindo que o item de menu seja exibido ou não de acordo com as permissões de cada usuário.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
A estrutura de menus em &lt;i&gt;Java&lt;/i&gt; é basicamente a seguinte:&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;br /&gt;
&lt;i&gt;JMenubar&lt;/i&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; |&lt;br /&gt;
&amp;nbsp;&amp;nbsp; |__ &lt;i&gt;JMenu&lt;/i&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; |&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; | &lt;br /&gt;
&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |__&lt;i&gt;JMenuItem&lt;/i&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; | &amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp; |__&lt;i&gt;JMenu&lt;/i&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |__&lt;i&gt;JMenu&lt;/i&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |__&lt;i&gt;JMenuItem&lt;/i&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Como podemos observar, temos uma barra de menu e dentro dela temos 2 menus. No primeiro menu temos um item e no segundo temos um sub menu e dentro deste outro item. Então para recuperar todos itens, considerando que podem existir itens dentro de sub menus, devemos utilizar a recursividade.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Resumidamente, um método recursivo é um método que faz chamadas a ele mesmo. Certos problemas, como o apresentado, exigem esta abordagem, pois os elementos estão dispostos numa estrutura do tipo árvore que pode ter várias ramificações. Sendo assim, segue abaixo uma possível implementação do método que resolve este problema.&lt;/div&gt;
&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;    /**
     * Retorna todos JMenuItems de um JMenuBar.
     *
     * @param obj Uma variável do tipo JMenuBar.
     * @return void
     */
    public void getMenuItems(Object obj) {

        if (obj instanceof JMenuBar) {

            for (Component c : ((JMenuBar) obj).getComponents()) {
                getMenuItems(c);
            }
        }

        if (obj instanceof JMenu) {

            for (Component c : ((JMenu) obj).getMenuComponents()) {
                getMenuItems(c);
            }
        }

        if (obj.getClass() == JMenuItem.class) {
            System.out.println(&quot;JMenuItem: &quot; + ((JMenuItem) obj).getName());
        }

    }
&lt;/pre&gt;
&lt;br /&gt;
Fiquem a vontade para modificar e utilizar. Até a próxima!</content><link rel='replies' type='application/atom+xml' href='http://marciosouzajunior.blogspot.com/feeds/2963438097145180160/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://marciosouzajunior.blogspot.com/2012/03/como-listar-todos-itens-de-um-jmenubar.html#comment-form' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/2963438097145180160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/2963438097145180160'/><link rel='alternate' type='text/html' href='http://marciosouzajunior.blogspot.com/2012/03/como-listar-todos-itens-de-um-jmenubar.html' title='Como listar todos itens de um JMenuBar'/><author><name>Márcio de Souza Júnior</name><uri>http://www.blogger.com/profile/01965624113971008303</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5856286885704734621.post-3208215305669830871</id><published>2012-03-07T12:20:00.002-03:00</published><updated>2012-03-08T12:29:19.429-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="binding"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="JComboBox"/><category scheme="http://www.blogger.com/atom/ns#" term="JPA"/><title type='text'>Como vincular dados a um JComboBox</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
Atualmente estou trabalhando num projeto no qual utilizo o &lt;i&gt;framework JPA&lt;/i&gt;. Então a cada dia que passa eu acabo aprendendo algo novo sobre esta &lt;i&gt;API&lt;/i&gt; e espero com essa experiência poder ajudar os que estão começando agora.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Hoje vou falar um pouco sobre como vincular dados que se encontram em uma tabela do banco a um componente &lt;i&gt;JComboBox&lt;/i&gt;. A vinculação é simples de se fazer, mas a exibição da propriedade desejada é um pouco mais complicada como veremos adiante. Vou apresentar um passo a passo que traduzi do site &lt;a href=&quot;http://netbeans.org/kb/docs/java/gui-binding.html&quot;&gt;netbeans.org&lt;/a&gt;, mas com algumas correções (o exemplo de código do site na parte &quot;&lt;i&gt;To render the combo box propertly&lt;/i&gt;&quot; não funciona).&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Vamos ao que interessa:&lt;/div&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
1. Clique com o botão direito no &lt;i&gt;combo box&lt;/i&gt; e escolha &lt;i&gt;Bind &amp;gt; elements&lt;/i&gt; (Vincular &amp;gt; elements).&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
2. Clique em &lt;i&gt;Import Data to Form&lt;/i&gt; (Importar dados para o Formulário...). Selecione a conexão e tabela que voce deseja vincular o &lt;i&gt;combo box&lt;/i&gt;. Clique em OK.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
3. No combo &lt;i&gt;From the Binding Source&lt;/i&gt; (Origem da vinculação), selecione o item que representa o &lt;i&gt;result list&lt;/i&gt; da entidade. Por exemplo, se a entidade se chama &lt;i&gt;Cliente.java&lt;/i&gt;, o objeto da lista deve ser gerado como &lt;i&gt;clienteList&lt;/i&gt;.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
4. Deixe o valor em &lt;i&gt;Binding Expression&lt;/i&gt; (Expressão de vinculação) como &lt;i&gt;null&lt;/i&gt; e clique em OK.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
5. Clique com o botão direito no &lt;i&gt;combo box&lt;/i&gt; novamente e escolha &lt;i&gt;Bind &amp;gt; selectedItem&lt;/i&gt; (Vincular &amp;gt; selectedItem). Vincule a propriedade que será afetada pela selecão do usuário e clique em OK (normalmente o &lt;i&gt;result list&lt;/i&gt; escolhido no passo 3).&amp;nbsp;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Até aqui já temos os dados vinculados ao &lt;i&gt;combo box&lt;/i&gt;, porém se executar o programa verá que o combo mostrará dados da entidade selecionada convertida em &lt;i&gt;String&lt;/i&gt; (objeto.toString()) e não uma propriedade específica:&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7g4oqtrcq_rdkcl_cViS0p34SZD1NG_kCVZiN_5-lx0ge0KefUNdyfIfBN8cou-vD0TMO1w-EK8ibMkgbrlZFftOUDDDxaawqKMRFlEaeTpTRGzL11WdRd5WYydjr4egR-HrHBYnkMc6A/s1600/combo_box.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7g4oqtrcq_rdkcl_cViS0p34SZD1NG_kCVZiN_5-lx0ge0KefUNdyfIfBN8cou-vD0TMO1w-EK8ibMkgbrlZFftOUDDDxaawqKMRFlEaeTpTRGzL11WdRd5WYydjr4egR-HrHBYnkMc6A/s1600/combo_box.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Isto acontece porque, segundo o próprio site do &lt;a href=&quot;http://netbeans.org/kb/docs/java/gui-binding.html&quot;&gt;&lt;i&gt;NetBeans&lt;/i&gt;&lt;/a&gt;, a biblioteca &lt;i&gt;Beans Binding&lt;/i&gt; não tem uma classe &lt;i&gt;DetailBinding&lt;/i&gt; que permite especificar os valores exibidos no &lt;i&gt;JComboBox&lt;/i&gt;.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Uma forma de resolver isto é escrever um código personalizado para mostrar a propriedade que queremos:&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
1. Selecione o &lt;i&gt;combo box&lt;/i&gt;.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
2. Na aba Propriedades da Janela de Propriedades, selecione a propriedade &lt;i&gt;render&lt;/i&gt;.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
3. Clique no botão ...&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
4. No combo na parte superior do editor de propriedades, selecione &lt;i&gt;Custom Code&lt;/i&gt; (Código personalizado).&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
5. Na área de texto, entre com um código parecido com o que segue abaixo onde &lt;i&gt;Usuario&lt;/i&gt; é o nome da sua entidade e &lt;i&gt;getUsuario&lt;/i&gt; é a propriedade que retorna o valor a ser vinculado.&amp;nbsp;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;new DefaultListCellRenderer() {

    @Override
    public Component getListCellRendererComponent(
            JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
        if (value instanceof Usuario) {
            Usuario usuario = (Usuario) value;
            setText(usuario.getUsuario());
        }
        return this;
    }
}&lt;/pre&gt;
Feito isso, o valor selecionado deverá aparecer no combo:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfHYnHv8AS62j8H-RIij5iogdQGOw53SuyYuRF8sueq4rlfLJ6S1WKscIauIdd3wE-9J9SS8vBQYQ07_oRSSbM6shwvgaIkk8odiGT1aD-I9GqMrBG_obi6xDTeagmObYLZrhxU3BdlxrG/s1600/combo_box_1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfHYnHv8AS62j8H-RIij5iogdQGOw53SuyYuRF8sueq4rlfLJ6S1WKscIauIdd3wE-9J9SS8vBQYQ07_oRSSbM6shwvgaIkk8odiGT1aD-I9GqMrBG_obi6xDTeagmObYLZrhxU3BdlxrG/s1600/combo_box_1.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Uma outra abordagem mais simples para resolver o problema é sobrescrever o método &lt;i&gt;toString&lt;/i&gt; da entidade em questão:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;    @Override
    public String toString() {
        return getUsuario();
    }&amp;nbsp;&lt;/pre&gt;
&lt;br /&gt;
Basta fazer com que o método retorne o valor que você deseja mostrar no &lt;i&gt;combo box&lt;/i&gt;. É isso aí! Espero que tenham gostado.</content><link rel='replies' type='application/atom+xml' href='http://marciosouzajunior.blogspot.com/feeds/3208215305669830871/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://marciosouzajunior.blogspot.com/2012/03/como-vincular-dados-um-jcombobox.html#comment-form' title='34 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/3208215305669830871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/3208215305669830871'/><link rel='alternate' type='text/html' href='http://marciosouzajunior.blogspot.com/2012/03/como-vincular-dados-um-jcombobox.html' title='Como vincular dados a um JComboBox'/><author><name>Márcio de Souza Júnior</name><uri>http://www.blogger.com/profile/01965624113971008303</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7g4oqtrcq_rdkcl_cViS0p34SZD1NG_kCVZiN_5-lx0ge0KefUNdyfIfBN8cou-vD0TMO1w-EK8ibMkgbrlZFftOUDDDxaawqKMRFlEaeTpTRGzL11WdRd5WYydjr4egR-HrHBYnkMc6A/s72-c/combo_box.png" height="72" width="72"/><thr:total>34</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5856286885704734621.post-4012095485633423208</id><published>2012-02-01T00:07:00.000-02:00</published><updated>2012-03-07T11:55:15.430-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="design patterns"/><title type='text'>Introdução aos Design Patterns</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
Padrões de projeto são sempre bem vindos quando o assunto é Engenharia de Software. Existe uma variedade deles, mas pra este post teremos apenas uma introdução para entender melhor o que são e pra que servem. Vamos começar com uma definição resumida da &lt;i&gt;Wikipédia&lt;/i&gt;:&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;&quot;Um Padrão de Projeto (Design Pattern) descreve uma solução geral reutilizável para um problema recorrente no desenvolvimento de sistemas orientados a objetos. Não é um código final, é um modelo de como resolver um problema que pode ser usado em muitas situações diferentes. Os Padrões de Projeto definem as relações e interações entre as classes ou objetos, sem especificar os detalhes das classes ou objetos envolvidos, ou seja, estão num nível de generalidade mais alto.&quot;&lt;/i&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Os conceitos de padrões de projeto vem sendo discutidos ao longo dos anos e se tornou mais popular depois do lançamento do livro &lt;i&gt;Design Patterns: Elements of Reusable Object-Oriented Software&lt;/i&gt; em 1995. Então os autores do livro (&lt;i&gt;Erich Gamma, Richard Helm, Ralph Johnson&lt;/i&gt; e &lt;i&gt;John Vlissides&lt;/i&gt;) ficaram conhecidos como sendo a Gangue dos Quatro (&lt;i&gt;Gang of Four&lt;/i&gt;) ou simplesmente &lt;i&gt;GoF&lt;/i&gt;.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Outra definição interessante veio de &lt;i&gt;Christopher Alexander&lt;/i&gt; cujo seus estudos contribuíram para a utilização de padrões geométricos e matemáticos no urbanismo e arquitetura:&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;“Cada padrão descreve um problema que ocorre freqüentemente em seu ambiente, e então descreve o núcleo de uma solução para o problema, de maneira que você possa usar esta solução um milhão de vezes, sem fazê-la do mesmo jeito duas vezes.”&lt;/i&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Mas o que um cara urbanista e arquiteto está fazendo aqui? Você já deve ter percebido que padrões de projeto não estão ligados apenas a engenharia de software mas também a outras engenharias, como a civil por exemplo. Imagina se você entraria num prédio cujo projeto foi na base do &quot;codifica-conserta&quot;? Você se sentiria seguro? Neste caso é ainda mais crítico porque vidas estariam em risco. De qualquer forma precisamos de boas soluções para nossos projetos e ter padrões já experimentados e aprovados é uma ótima ajuda. Foi com base nos estudos de &lt;i&gt;Alexander &lt;/i&gt;que cientistas da computação desenvolveram padrões de projetos usados na engenharia de software.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Dando continuidade ao que interessa, atualmente os padrões são divididos em 3 categorias:&lt;/div&gt;
&lt;ul style=&quot;text-align: justify;&quot;&gt;
&lt;li&gt;&lt;b&gt;Criacionais: &lt;/b&gt;Diz respeito a criação de objetos;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Comportamentais: &lt;/b&gt;Diz respeito a maneira que objetos e classes distribuem suas responsabilidades para realizar uma tarefa&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Estruturais:&lt;/b&gt; Diz respeito a maneira como classes e objetos são organizados estruturalmente&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Existem 23 padrões de projetos oficiais que se encaixam nestas categorias. Digo oficiais porque eles são os padrões documentados pela &lt;i&gt;GoF&lt;/i&gt;. Existem diversos outros padrões e qualquer pessoa pode criar um, desde que tenha a solução para um problema comum e siga o modelo de documentação. Para documentar um padrão, deve-se definir alguns elementos:&lt;/div&gt;
&lt;ul style=&quot;text-align: justify;&quot;&gt;
&lt;li&gt;&lt;b&gt;Nome e classificação&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Problema&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Solução&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Consequências&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Casos de uso&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Estes são os principais elementos a serem documentados. Pode não parecer importante mas, sem uma forma de documentar os padrões, eles não existiriam ou poderiam até existir mas seriam um monte de diagramas e textos soltos. Foi o próprio &lt;i&gt;Alexander &lt;/i&gt;que definiu em seu livro &lt;i&gt;Notes on the Synthesis of Form, The Timeless Way of Building e A Pattern Language&lt;/i&gt;, como os padrões devem ser descritos.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Bom pessoal, por hoje é só e espero falar mais sobre alguns padrões em posts futuros.&lt;/div&gt;
&lt;ul&gt;
&lt;/ul&gt;</content><link rel='replies' type='application/atom+xml' href='http://marciosouzajunior.blogspot.com/feeds/4012095485633423208/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://marciosouzajunior.blogspot.com/2012/01/introducao-aos-design-patterns.html#comment-form' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/4012095485633423208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/4012095485633423208'/><link rel='alternate' type='text/html' href='http://marciosouzajunior.blogspot.com/2012/01/introducao-aos-design-patterns.html' title='Introdução aos Design Patterns'/><author><name>Márcio de Souza Júnior</name><uri>http://www.blogger.com/profile/01965624113971008303</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5856286885704734621.post-6928681571939652552</id><published>2010-10-28T08:52:00.000-02:00</published><updated>2012-03-09T12:58:44.031-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="j2me"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="midlet"/><title type='text'>Introdução ao J2ME</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
Olá! No post de hoje pretendo mostrar como iniciar no desenvolvimento de aplicações para dispositivos móveis. Vou mostrar como preparar o ambiente de desenvolvimento e também como fazer um pequeno programa.&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;O Ambiente&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
A primeira coisa a se fazer é baixar o &lt;a href=&quot;http://www.oracle.com/technetwork/java/download-135801.html&quot; style=&quot;font-style: italic;&quot;&gt;Sun Java Wireless Toolkit&lt;/a&gt;, também conhecido como &lt;span style=&quot;font-style: italic;&quot;&gt;J2ME Wireless Toolkit&lt;/span&gt;. Esse kit de ferramentas é utilizado para criar aplicações que serão executadas em dispositivos móveis com a tecnologia &lt;span style=&quot;font-style: italic;&quot;&gt;Java&lt;/span&gt;. A instação do &lt;span style=&quot;font-style: italic;&quot;&gt;toolkit&lt;/span&gt; não tem segredo, é só na base do &lt;span style=&quot;font-style: italic;&quot;&gt;next next finish&lt;/span&gt;...&lt;br /&gt;
O próximo passo é instalar a &lt;span style=&quot;font-style: italic;&quot;&gt;IDE&lt;/span&gt;. Para o exemplo que vou mostrar, vamos utilizar o &lt;a href=&quot;http://www.eclipse.org/downloads/download.php?file=/eclipse/downloads/drops/R-3.5-200906111540/eclipse-SDK-3.5-win32.zip&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Eclipse 3.5&lt;/span&gt;&lt;/a&gt;. Espero que já esteja familiarizado com ele.&lt;br /&gt;
E para integrar o &lt;span style=&quot;font-style: italic;&quot;&gt;toolkit&lt;/span&gt; e a &lt;span style=&quot;font-style: italic;&quot;&gt;IDE&lt;/span&gt; vamos utlizar o &lt;span style=&quot;font-style: italic;&quot;&gt;plugin&lt;/span&gt; &lt;a href=&quot;http://sourceforge.net/projects/eclipseme/files/eclipseme/1.7.9/eclipseme.feature_1.7.9_site.zip/download&quot; style=&quot;font-style: italic;&quot;&gt;EclipseME&lt;/a&gt;. A instalção do &lt;span style=&quot;font-style: italic;&quot;&gt;plugin&lt;/span&gt; é simples:&lt;/div&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Feche o &lt;span style=&quot;font-style: italic;&quot;&gt;Eclipse&lt;/span&gt; caso esteja aberto;&lt;/li&gt;
&lt;li&gt;Descompacte o arquivo do&lt;span style=&quot;font-style: italic;&quot;&gt; plugin&lt;/span&gt;;&lt;/li&gt;
&lt;li&gt;Recorte as pastas &lt;span style=&quot;font-style: italic;&quot;&gt;features&lt;/span&gt; e &lt;span style=&quot;font-style: italic;&quot;&gt;plugins&lt;/span&gt; que foram descompactadas;&lt;/li&gt;
&lt;li&gt;Cole as pastas na pasta onde encontra-se o &lt;span style=&quot;font-style: italic;&quot;&gt;eclipse.exe&lt;/span&gt; (vai perguntar se quer mesclar as pastas, responda sim);&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Aliás, esses passos servem para instalação &lt;span style=&quot;font-style: italic;&quot;&gt;offline&lt;/span&gt; de qualquer &lt;span style=&quot;font-style: italic;&quot;&gt;plugin&lt;/span&gt; para &lt;span style=&quot;font-style: italic;&quot;&gt;Eclipse&lt;/span&gt;.&lt;br /&gt;
Pronto, agora só mais algumas configurações e o ambiente estará preparado. Como essas configurações dependem da criação de um novo projeto, vamos pra próxima parte!&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Criando um projeto&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Abra o&lt;span style=&quot;font-style: italic;&quot;&gt; Eclipse&lt;/span&gt;. Clique com o botão direito dentro do &lt;span style=&quot;font-style: italic;&quot;&gt;Package Explorer&lt;/span&gt; e &lt;span style=&quot;font-style: italic;&quot;&gt;New &amp;gt; Other...&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhy00R2FvV0iMmxPgTutFg8OcTf8thPRtKQ7wMGOAJjjQWg1n4kPzmoUQazFfM8ZLs6dxY9sSo0bsxJpo865sXOB41XyfbIqD2tuvRwsAJYUIm8ClNl0N_QQINRGn-Yt7Fwmpcdvf5AG0Lp/s1600/j2me1.jpg&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5533050077458230242&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhy00R2FvV0iMmxPgTutFg8OcTf8thPRtKQ7wMGOAJjjQWg1n4kPzmoUQazFfM8ZLs6dxY9sSo0bsxJpo865sXOB41XyfbIqD2tuvRwsAJYUIm8ClNl0N_QQINRGn-Yt7Fwmpcdvf5AG0Lp/s400/j2me1.jpg&quot; style=&quot;cursor: pointer; display: block; height: 332px; margin: 0px auto 10px; text-align: center; width: 400px;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Na janela que abrir navegue por &lt;span style=&quot;font-style: italic;&quot;&gt;J2ME&lt;/span&gt; e escolha&lt;span style=&quot;font-style: italic;&quot;&gt; J2ME Midlet Suite&lt;/span&gt;, então clique em &lt;span style=&quot;font-style: italic;&quot;&gt;Next&lt;/span&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqyuF97yWHCm9P6bB9HikU92ahIu-nXkGIeI27lrdCXYNnfDp4JX3tg-m3tGXWrLn0eXtBEMS6ZlYke4sSv28fKHDKHIPlaAQguRCIvHXFnf96KTH5DJ8SQHj98ln5q5FFtuniHK0X7gxb/s1600/j2me2.jpg&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5533050330218306066&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqyuF97yWHCm9P6bB9HikU92ahIu-nXkGIeI27lrdCXYNnfDp4JX3tg-m3tGXWrLn0eXtBEMS6ZlYke4sSv28fKHDKHIPlaAQguRCIvHXFnf96KTH5DJ8SQHj98ln5q5FFtuniHK0X7gxb/s400/j2me2.jpg&quot; style=&quot;cursor: pointer; display: block; height: 382px; margin: 0px auto 10px; text-align: center; width: 400px;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Agora escolha o nome do projeto e clique em &lt;span style=&quot;font-style: italic;&quot;&gt;Next&lt;/span&gt; novamente:&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkR6t11JGX7vLjJkLstKRPX7p1PDhUT0LiX3pB02feF3Gb9EvKOFsweXnofhSAp2wWEYtKvx4W0KGTtF7MTx7bRDrWOzksX8q2k7iYdVt0NaJC8MaM1BYLn5qsfaFJhKmIPuw8y2ewb4Cb/s1600/j2me3.jpg&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5533050484664079874&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkR6t11JGX7vLjJkLstKRPX7p1PDhUT0LiX3pB02feF3Gb9EvKOFsweXnofhSAp2wWEYtKvx4W0KGTtF7MTx7bRDrWOzksX8q2k7iYdVt0NaJC8MaM1BYLn5qsfaFJhKmIPuw8y2ewb4Cb/s400/j2me3.jpg&quot; style=&quot;cursor: pointer; display: block; height: 287px; margin: 0px auto 10px; text-align: center; width: 400px;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Neste momento será solicitado que configure o dispositivo que será usado para executar a aplicação. Então clique em &lt;span style=&quot;font-style: italic;&quot;&gt;Manage Devices...&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsaVTbf5VMi3HJ1NoPZzk_iiBEgSOvdv03oDo1yLQRWS_Iz66hWhZHhNZ0N7ngR7KLoKc4QZ7qjM5SMrwcnkBPxQTSU9uNSsUQqg7sz74ijxmx_NnIWG081VPorFSSEfiBDU4tmUDZLm8A/s1600/j2me4.jpg&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5533050605032270146&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsaVTbf5VMi3HJ1NoPZzk_iiBEgSOvdv03oDo1yLQRWS_Iz66hWhZHhNZ0N7ngR7KLoKc4QZ7qjM5SMrwcnkBPxQTSU9uNSsUQqg7sz74ijxmx_NnIWG081VPorFSSEfiBDU4tmUDZLm8A/s400/j2me4.jpg&quot; style=&quot;cursor: pointer; display: block; height: 360px; margin: 0px auto 10px; text-align: center; width: 400px;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Outra janela será aberta, porém ainda sem nenhum dispositivo. Clique em &lt;span style=&quot;font-style: italic;&quot;&gt;Import...&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxetNG8ap-Sd1zWrCD_MjtSEYgZuMgJbM8KsaR7C24V16ZxNFZqt7ndw6qKGMSvogcQfH270Go2ldDOxSQqJ4FnrGGHR6Ddl6ruvvGmEvFvfqilMn6oUbTL1gNxCDc4y0gH6m8rqPSWXee/s1600/j2me5.jpg&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5533050741739237394&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxetNG8ap-Sd1zWrCD_MjtSEYgZuMgJbM8KsaR7C24V16ZxNFZqt7ndw6qKGMSvogcQfH270Go2ldDOxSQqJ4FnrGGHR6Ddl6ruvvGmEvFvfqilMn6oUbTL1gNxCDc4y0gH6m8rqPSWXee/s400/j2me5.jpg&quot; style=&quot;cursor: pointer; display: block; height: 135px; margin: 0px auto 10px; text-align: center; width: 400px;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Agora clique em &lt;span style=&quot;font-style: italic;&quot;&gt;Browse...&lt;/span&gt; e selecione a pasta &lt;span style=&quot;font-style: italic;&quot;&gt;WTK2.5.2_01&lt;/span&gt; (ou outra versão disponível) que se encontra na raiz do disco (geralmente em &lt;span style=&quot;font-style: italic;&quot;&gt;C:&lt;/span&gt;, só não estará neste local se você tiver mudado durante a instalação). Clique em &lt;span style=&quot;font-style: italic;&quot;&gt;OK&lt;/span&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzUUA5Va9-44UGr-k1BwVrrN6bPs4ZKcpT5X4juxApDQvRhMMqFvNkqAR0q7tANUgdNPzJfH59Lh0y2pXdxZSEYJMQjOmiW98rCWhrL386fjECdflvBIV8E1zNysvMSlM41zmnUsRTyXHA/s1600/j2me6.jpg&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5533050882195502914&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzUUA5Va9-44UGr-k1BwVrrN6bPs4ZKcpT5X4juxApDQvRhMMqFvNkqAR0q7tANUgdNPzJfH59Lh0y2pXdxZSEYJMQjOmiW98rCWhrL386fjECdflvBIV8E1zNysvMSlM41zmnUsRTyXHA/s400/j2me6.jpg&quot; style=&quot;cursor: pointer; display: block; height: 262px; margin: 0px auto 10px; text-align: center; width: 400px;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
De volta na janela &lt;span style=&quot;font-style: italic;&quot;&gt;Import Devices&lt;/span&gt; clique em &lt;span style=&quot;font-style: italic;&quot;&gt;Refresh&lt;/span&gt;. Uma pesquisa será feita na pasta do &lt;span style=&quot;font-style: italic;&quot;&gt;toolkit&lt;/span&gt; e alguns dispositivos devem aparecer na lista:&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivzAsqt0JazOmPLe0NruWvnRN2WCKMmIxUS-fq8ubgm7MgEGsWMq6gYGHAbiAB7t9QyC0at10rcuYuk-RUIVzEQa1G5S9Bsnk3Py4CvgtSbTVF41NrhPRETXGCn4o0_3WDZeOcdiwDdufc/s1600/j2me7.jpg&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5533051041010609826&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivzAsqt0JazOmPLe0NruWvnRN2WCKMmIxUS-fq8ubgm7MgEGsWMq6gYGHAbiAB7t9QyC0at10rcuYuk-RUIVzEQa1G5S9Bsnk3Py4CvgtSbTVF41NrhPRETXGCn4o0_3WDZeOcdiwDdufc/s400/j2me7.jpg&quot; style=&quot;cursor: pointer; display: block; height: 261px; margin: 0px auto 10px; text-align: center; width: 400px;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Clique em &lt;span style=&quot;font-style: italic;&quot;&gt;Finish&lt;/span&gt; e voltamos na janela de gerenciamento com um dispositivo padrão selecionado:&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDBIsHAcbg89BcyAgUaRVRSoYnqPPvoO8iq9cTKjKwQztgkEQGagctES0lmoC0tj9DTVEtitOIfVxMvHiW9o-XxdbK8bEn7O9rNTp0sRHqO3dHg72brxlL2dYaWgSj3Vutmd7Tgbuz91pf/s1600/j2me8.jpg&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5533051178632062482&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDBIsHAcbg89BcyAgUaRVRSoYnqPPvoO8iq9cTKjKwQztgkEQGagctES0lmoC0tj9DTVEtitOIfVxMvHiW9o-XxdbK8bEn7O9rNTp0sRHqO3dHg72brxlL2dYaWgSj3Vutmd7Tgbuz91pf/s400/j2me8.jpg&quot; style=&quot;cursor: pointer; display: block; height: 123px; margin: 0px auto 10px; text-align: center; width: 400px;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Somente um dispositivo pode ser selecionado. Deixe o padrão e clique em &lt;span style=&quot;font-style: italic;&quot;&gt;OK&lt;/span&gt;. Então voltamos na janela de propriedades do projeto, mas agora com os dois &lt;span style=&quot;font-style: italic;&quot;&gt;combobox&lt;/span&gt; preenchidos:&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhk84cFd-esxlfRT0NTUxBPXZ0cK1nbdfvo3XjEtCSFabzQEMWL0C3BVPZbNIBeOHT5Wc6k0WcqehOr05DVcrGDIASEwuzrWJM14h1LpuXxeKfPG5sy-UVYfd3Reys8eys5m_KwkhV7hWR1/s1600/j2me9.jpg&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5533051310522857426&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhk84cFd-esxlfRT0NTUxBPXZ0cK1nbdfvo3XjEtCSFabzQEMWL0C3BVPZbNIBeOHT5Wc6k0WcqehOr05DVcrGDIASEwuzrWJM14h1LpuXxeKfPG5sy-UVYfd3Reys8eys5m_KwkhV7hWR1/s400/j2me9.jpg&quot; style=&quot;cursor: pointer; display: block; height: 95px; margin: 0px auto 10px; text-align: center; width: 356px;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Em device podemos selecionar &lt;span style=&quot;font-style: italic;&quot;&gt;DefaultGrayPhone&lt;/span&gt; ou &lt;span style=&quot;font-style: italic;&quot;&gt;DefaultColorPhone&lt;/span&gt;. Deixe o padrão que é &lt;span style=&quot;font-style: italic;&quot;&gt;DefaultGrayPhone&lt;/span&gt; e clique em &lt;span style=&quot;font-style: italic;&quot;&gt;Finish&lt;/span&gt;.&lt;br /&gt;
&lt;br /&gt;
Pronto, agora temos um projeto criado e podemos iniciar o desenvolvimento.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Programando em J2ME&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Vamos criar nosso primeiro programa. Abra a pasta do projeto no &lt;span style=&quot;font-style: italic;&quot;&gt;Package Explorer&lt;/span&gt; e clique com o botão direito no pacote &lt;span style=&quot;font-style: italic;&quot;&gt;src&lt;/span&gt;, escolha &lt;span style=&quot;font-style: italic;&quot;&gt;New &amp;gt; Other...&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhc-FIprNNGHiVsfwX_BD5Faaa88QIL208HfcrgEKrBePWk2vEvxG_HO8_DYTNuSaLxIwOwlsOcMvxQdNGSP8mtid-tCfhXHMsnZTHnjbBvVjSEIreH4gFehsIXMhsLRKj1QDHnOWUjujFZ/s1600/j2me10.jpg&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5533052507185470386&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhc-FIprNNGHiVsfwX_BD5Faaa88QIL208HfcrgEKrBePWk2vEvxG_HO8_DYTNuSaLxIwOwlsOcMvxQdNGSP8mtid-tCfhXHMsnZTHnjbBvVjSEIreH4gFehsIXMhsLRKj1QDHnOWUjujFZ/s400/j2me10.jpg&quot; style=&quot;cursor: pointer; display: block; height: 284px; margin: 0px auto 10px; text-align: center; width: 400px;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Dentro de &lt;span style=&quot;font-style: italic;&quot;&gt;J2ME&lt;/span&gt; escolha &lt;span style=&quot;font-style: italic;&quot;&gt;J2ME Midlet&lt;/span&gt; e clique em &lt;span style=&quot;font-style: italic;&quot;&gt;Next&lt;/span&gt;. Digite o nome &lt;span style=&quot;font-style: italic;&quot;&gt;HelloWorld&lt;/span&gt; e clique em &lt;span style=&quot;font-style: italic;&quot;&gt;Finish&lt;/span&gt;. Então será criada uma classe parecida com esta:&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

public class HelloWorld extends MIDlet {

public HelloWorld() {
}

protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
}

protected void pauseApp() {
}

protected void startApp() throws MIDletStateChangeException {
}

}&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
O que é &lt;span style=&quot;font-style: italic;&quot;&gt;MIDlet&lt;/span&gt;? &lt;span style=&quot;font-style: italic;&quot;&gt;MIDlet&lt;/span&gt; é como são chamados os aplicativos em &lt;span style=&quot;font-style: italic;&quot;&gt;J2ME&lt;/span&gt;. Aplicativos &lt;span style=&quot;font-style: italic;&quot;&gt;Java&lt;/span&gt; para &lt;span style=&quot;font-style: italic;&quot;&gt;web&lt;/span&gt; são &lt;span style=&quot;font-style: italic;&quot;&gt;Applets&lt;/span&gt;, para servidores são &lt;span style=&quot;font-style: italic;&quot;&gt;Servlets&lt;/span&gt; e para dispositivos móveis são&lt;span style=&quot;font-style: italic;&quot;&gt; MIDlets&lt;/span&gt;. Na verdade as coisas são um pouco mais complicadas, mas a grosso modo podemos definir assim.&lt;br /&gt;
Observe que nossa classe estende &lt;span style=&quot;font-style: italic;&quot;&gt;MIDlet&lt;/span&gt; e por isso foram herdados 3 métodos:&lt;/div&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;startApp&lt;/span&gt;: É chamado quando se inicia a aplicação (equivalente ao &lt;span style=&quot;font-style: italic;&quot;&gt;main&lt;/span&gt; em &lt;span style=&quot;font-style: italic;&quot;&gt;J2SE&lt;/span&gt;). Também é chamado quando a aplicação é despausada.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;pauseApp&lt;/span&gt;: É chamado quando o aplicativo fica em segundo plano (por exemplo, quando o usuário atende uma ligação)&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;destroyApp&lt;/span&gt;: É executado quando o aplicativo é finalizado e pode ser usado para liberar recursos, entre outras coisas.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Também temos o construtor que é uma espécie de método chamado quando a classe é instanciada (você já deve saber disto). Mas vamos ao que interessa. Declare a seguinte variável de instância:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
Display d;&lt;/pre&gt;
Deve aparecer um erro devido ao &lt;span style=&quot;font-style: italic;&quot;&gt;import&lt;/span&gt;, apenas peça que o &lt;span style=&quot;font-style: italic;&quot;&gt;Eclipse&lt;/span&gt; corrija pra você.&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Cada &lt;span style=&quot;font-style: italic;&quot;&gt;MIDlet&lt;/span&gt; deve ter uma referência a uma variável do tipo &lt;span style=&quot;font-style: italic;&quot;&gt;Display&lt;/span&gt;. Este objeto pode recuperar informações sobre a tela (ex. quantidade de cores) e também é usado para exibir objetos.&lt;br /&gt;
No &lt;span style=&quot;font-style: italic;&quot;&gt;J2ME&lt;/span&gt; temos uma superclasse chamada &lt;span style=&quot;font-style: italic;&quot;&gt;Displayable&lt;/span&gt; da qual todos os outros objetos estendem. Objetos como &lt;span style=&quot;font-style: italic;&quot;&gt;Alert&lt;/span&gt;, &lt;span style=&quot;font-style: italic;&quot;&gt;Form&lt;/span&gt; ou &lt;span style=&quot;font-style: italic;&quot;&gt;TextBox&lt;/span&gt; estendem de &lt;span style=&quot;font-style: italic;&quot;&gt;Displayable&lt;/span&gt;, portanto eles &lt;span style=&quot;font-weight: bold;&quot;&gt;SÃO &lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Displayable&lt;/span&gt;. O objeto&lt;span style=&quot;font-style: italic;&quot;&gt; Display&lt;/span&gt; pode exibir qualquer tipo de &lt;span style=&quot;font-style: italic;&quot;&gt;Displayable&lt;/span&gt;. Veja como é a hierarquia destas classes:&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgO_WiKNFYpm5tHSufyohLnIJ1UfnhrkUO7ON-UHbravZ4tO8xbMRhDnE2qNlaNpJ7og-jpwHjVY_GmVb5erFswvlW8UmG7E3BZUXYpo7ZmTkL03CGsjiDoj-Zn2bKY9t4eS8sE0dMdHwYb/s1600/displayable.png&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5533053828251245106&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgO_WiKNFYpm5tHSufyohLnIJ1UfnhrkUO7ON-UHbravZ4tO8xbMRhDnE2qNlaNpJ7og-jpwHjVY_GmVb5erFswvlW8UmG7E3BZUXYpo7ZmTkL03CGsjiDoj-Zn2bKY9t4eS8sE0dMdHwYb/s400/displayable.png&quot; style=&quot;cursor: pointer; display: block; height: 273px; margin: 0px auto 10px; text-align: center; width: 400px;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Somemte um objeto &lt;span style=&quot;font-style: italic;&quot;&gt;Displayable&lt;/span&gt; pode ser exibido por vez. Então usamos o objeto &lt;span style=&quot;font-style: italic;&quot;&gt;Display&lt;/span&gt; para decidir o que será exibido na tela. Para fazer isto primeiro temos que pegar o &lt;span style=&quot;font-style: italic;&quot;&gt;Display&lt;/span&gt; atual do &lt;span style=&quot;font-style: italic;&quot;&gt;MIDlet&lt;/span&gt;. Faça a chamada dentro do construtor:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
d = Display.getDisplay(this);&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Veja que o construtor configura a variável &lt;span style=&quot;font-style: italic;&quot;&gt;d&lt;/span&gt; com o atual &lt;span style=&quot;font-style: italic;&quot;&gt;Display&lt;/span&gt; do &lt;span style=&quot;font-style: italic;&quot;&gt;MIDlet&lt;/span&gt;. &lt;span style=&quot;font-style: italic;&quot;&gt;Display&lt;/span&gt; não foi instanciado, em vez disto usamos o método estático para selecionar o &lt;span style=&quot;font-style: italic;&quot;&gt;Display&lt;/span&gt; atual. Agora dentro de &lt;span style=&quot;font-style: italic;&quot;&gt;startApp&lt;/span&gt; coloque o seguinte código:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
Alert mensagem = new Alert(&quot;Primeiro MIDlet&quot;, &quot;Hello World!&quot;, null, AlertType.INFO);
d.setCurrent(mensagem);&lt;/pre&gt;
&lt;br /&gt;
Nesse trecho de código criamos um objeto do tipo &lt;span style=&quot;font-style: italic;&quot;&gt;Alert&lt;/span&gt; e depois solicitamos que fosse exibido na tela. O código final ficou assim:&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.AlertType;
import javax.microedition.lcdui.Display;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

public class HelloWorld extends MIDlet {

Display d;

public HelloWorld() {
d = Display.getDisplay(this);
}

protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
}

protected void pauseApp() {
}

protected void startApp() throws MIDletStateChangeException {
Alert mensagem = new Alert(&quot;Primeiro MIDlet&quot;, &quot;Hello World!&quot;, null, AlertType.INFO);
d.setCurrent(mensagem);
}

}&lt;/pre&gt;
&lt;br /&gt;
Para executar clique com o botão direito na classe, &lt;span style=&quot;font-style: italic;&quot;&gt;Run As &amp;gt; Emulated J2ME MIDlet&lt;/span&gt;. O resultado deverá ser algo parecido com isto:&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSNFE8RHSStdXfdaNQONA-DlsNV8Wuhqhe8PL37dy6KZVdKuHip3mODK5UiaIv04UgEp-RZGZN1tgkKzGqiC4bqTta5MOEoPAvVTcvxLkQML2_RIhbRyuViVaZZf9Y36LAJRlefq8rnZPO/s1600/helloWorld.jpg&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5533054774254984994&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSNFE8RHSStdXfdaNQONA-DlsNV8Wuhqhe8PL37dy6KZVdKuHip3mODK5UiaIv04UgEp-RZGZN1tgkKzGqiC4bqTta5MOEoPAvVTcvxLkQML2_RIhbRyuViVaZZf9Y36LAJRlefq8rnZPO/s400/helloWorld.jpg&quot; style=&quot;cursor: pointer; display: block; height: 400px; margin: 0px auto 10px; text-align: center; width: 182px;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Bom, por hoje é só. Isto foi apenas uma pequena introdução ao &lt;span style=&quot;font-style: italic;&quot;&gt;J2ME&lt;/span&gt;. Espero que apartir daí você possa pesquisar mais sobre o assunto e desenvolver aplicações mais sofisticadas. Eu acredito que qualquer linguagem que aprendemos iniciando no famoso &lt;span style=&quot;font-style: italic;&quot;&gt;Hello World&lt;/span&gt;, temos chances de prosperar. Mas se você tentar aprender alguma linguagem e seu primeiro programa não for o &lt;span style=&quot;font-style: italic;&quot;&gt;Hello World&lt;/span&gt;, certamente irá fracassar. Enfim, isto é apenas uma superstição boba mas eu prefiro não contrariar :)&lt;/div&gt;
&lt;br /&gt;
Bons estudos!!</content><link rel='replies' type='application/atom+xml' href='http://marciosouzajunior.blogspot.com/feeds/6928681571939652552/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://marciosouzajunior.blogspot.com/2010/10/introducao-ao-j2me.html#comment-form' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/6928681571939652552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/6928681571939652552'/><link rel='alternate' type='text/html' href='http://marciosouzajunior.blogspot.com/2010/10/introducao-ao-j2me.html' title='Introdução ao J2ME'/><author><name>Márcio de Souza Júnior</name><uri>http://www.blogger.com/profile/01965624113971008303</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhy00R2FvV0iMmxPgTutFg8OcTf8thPRtKQ7wMGOAJjjQWg1n4kPzmoUQazFfM8ZLs6dxY9sSo0bsxJpo865sXOB41XyfbIqD2tuvRwsAJYUIm8ClNl0N_QQINRGn-Yt7Fwmpcdvf5AG0Lp/s72-c/j2me1.jpg" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5856286885704734621.post-6996944325793903931</id><published>2010-10-21T14:29:00.000-02:00</published><updated>2013-04-25T08:26:27.339-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="coleta de lixo"/><category scheme="http://www.blogger.com/atom/ns#" term="garbage collector"/><category scheme="http://www.blogger.com/atom/ns#" term="gc"/><category scheme="http://www.blogger.com/atom/ns#" term="ilha de isolamento"/><category scheme="http://www.blogger.com/atom/ns#" term="island of isolation"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="scjp"/><title type='text'>Garbage Collector - Java</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
Olá! Hoje vou falar sobre um assunto muito interessante: Coleta de lixo. Uma pergunta muito comum quando falamos de coleta de lixo é &lt;span style=&quot;font-style: italic;&quot;&gt;&quot;How many objects are eligible for the garbage collector?&quot;&lt;/span&gt;. Como saber quantos objetos são elegíveis a serem descartados? Vamos descobrir como responder esta questão e também aprender sobre um conceito importante conhecido por &lt;span style=&quot;font-style: italic;&quot;&gt;Island of Isolation&lt;/span&gt; ou Ilha de Isolamento. Antes de continuar vamos ver algo sobre atribuições.&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Atribuições&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Quando atribuímos um objeto a uma variável, o objeto não é armazenado na variável em si, mas sim no &lt;span style=&quot;font-style: italic;&quot;&gt;heap&lt;/span&gt;. O &lt;span style=&quot;font-style: italic;&quot;&gt;heap&lt;/span&gt; é um espaço na memória onde todos os objetos ficam alocados durante a execução de um programa. As variáveis de instância também residem no &lt;span style=&quot;font-style: italic;&quot;&gt;heap&lt;/span&gt;.&lt;br /&gt;
Quando atribuímos um primitivo a uma variável, ela realmente armazena o padrão de bits que representa o valor sendo atribuído a ela, mas se tratando de objetos, a variável armazena o endereço do objeto no &lt;span style=&quot;font-style: italic;&quot;&gt;heap&lt;/span&gt;. Por isto esse tipo de variável que faz referência a objetos é chamada de &lt;span style=&quot;font-style: italic;&quot;&gt;variável de referência&lt;/span&gt;. Abaixo temos um exemplo de código e em seguida uma representação visual:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
Object objeto1 = new Object();
Object objeto2 = new Object();
Object objeto3 = new Object();&lt;/pre&gt;
&lt;br /&gt;
O resultado disto é:&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaELIifD9yVu_Xv_N_7WD0z39xlM6Ai_18_XKh4Xp1GAqA6fW5g10L0xwc9YKFqODlri_hhoKBpwroMozORWLqNos8wQ4Ei3-Ir_qIi7UjyEeknlKz3v9HixwVz4FBr_2asWrNJ8-amQ5n/s1600/heap1.jpg&quot; onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5530539091625069362&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaELIifD9yVu_Xv_N_7WD0z39xlM6Ai_18_XKh4Xp1GAqA6fW5g10L0xwc9YKFqODlri_hhoKBpwroMozORWLqNos8wQ4Ei3-Ir_qIi7UjyEeknlKz3v9HixwVz4FBr_2asWrNJ8-amQ5n/s400/heap1.jpg&quot; style=&quot;cursor: pointer; display: block; height: 400px; margin: 0px auto 10px; text-align: center; width: 390px;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Garbage Collector&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
O propósito da coleta de lixo é descartar os objetos que não podem mais ser acessados. Isto é uma forma de gerenciar a memória e evitar que os programas fiquem sem espaço para continuar sua execução.&lt;br /&gt;
Quando algum objeto no &lt;span style=&quot;font-style: italic;&quot;&gt;heap&lt;/span&gt; não pode mais ser mais alcançado por ninguém (por nenhum&lt;span style=&quot;font-style: italic;&quot;&gt; thread&lt;/span&gt; ativo), ele é elegível a coleta de lixo. Isto pode acontecer de duas formas:&lt;/div&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;A variável passa a fazer referência a &lt;span style=&quot;font-style: italic;&quot;&gt;null&lt;/span&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
objeto1 = null;&lt;/pre&gt;
&lt;br /&gt;
O resultado disto é:&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiW5lK9pp28r20UyO3CgZ4zWjH6DBGBKV8l0BI2cYX6dq4cIDdpNGe_0aNuBQ13RwvtzrBrPaf0xtHZjnqVfFGhxQ4W8zWxC5nwPcyjWnISDMMMZJfBgC9T3LPlnU1KM5uSHu3qUJi_0VPr/s1600/heap2.jpg&quot; onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5530539713240119810&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiW5lK9pp28r20UyO3CgZ4zWjH6DBGBKV8l0BI2cYX6dq4cIDdpNGe_0aNuBQ13RwvtzrBrPaf0xtHZjnqVfFGhxQ4W8zWxC5nwPcyjWnISDMMMZJfBgC9T3LPlnU1KM5uSHu3qUJi_0VPr/s400/heap2.jpg&quot; style=&quot;cursor: pointer; display: block; height: 131px; margin: 0px auto 10px; text-align: center; width: 400px;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
A outra forma é fazer a variável referenciar outro objeto:&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
objeto1 = objeto2;&lt;/pre&gt;
&lt;br /&gt;
O resultado é:&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZ1le-5MTo-fFc5cKjw10cK8UMb0P-C419_UBgfoTh4_3EoaygoWijOWuI0E1OjKyMEEN8vll9wViGkvP1n5rmhDpImHGmBprcyckv93v6ipcKPwQZJR_XfX61fErhGuMTG1Kk537iQh35/s1600/heap3.jpg&quot; onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5530540338216022018&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZ1le-5MTo-fFc5cKjw10cK8UMb0P-C419_UBgfoTh4_3EoaygoWijOWuI0E1OjKyMEEN8vll9wViGkvP1n5rmhDpImHGmBprcyckv93v6ipcKPwQZJR_XfX61fErhGuMTG1Kk537iQh35/s400/heap3.jpg&quot; style=&quot;cursor: pointer; display: block; height: 233px; margin: 0px auto 10px; text-align: center; width: 400px;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Qualquer uma das formas tornaria o objeto1 qualificado para coleta.&lt;br /&gt;
Suponhamos que o objeto1 esteja &quot;solto&quot; no &lt;span style=&quot;font-style: italic;&quot;&gt;heap&lt;/span&gt;. Posso resolver descartá-lo quando quiser? Não. Somente a &lt;span style=&quot;font-style: italic;&quot;&gt;JVM&lt;/span&gt; pode decidir quando isso deve ser feito, mas como bom programador você pode &lt;b&gt;recomendar&lt;/b&gt; que a coleta seja feita. E para fazer isto basta usar a instrução:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
System.gc();&lt;/pre&gt;
&lt;br /&gt;
Não há garantia de que a coleta seja feita, mas geralmente a &lt;span style=&quot;font-style: italic;&quot;&gt;JVM&lt;/span&gt; atende o pedido.&lt;br /&gt;
É importante lembrar que um objeto só existirá no &lt;span style=&quot;font-style: italic;&quot;&gt;heap &lt;/span&gt;caso ele tenha sido inicializado (pela &lt;span style=&quot;font-style: italic;&quot;&gt;keyword new&lt;/span&gt;). Portanto a seguinte declaração não cria nenhum objeto no &lt;span style=&quot;font-style: italic;&quot;&gt;heap&lt;/span&gt;:&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
Object o = null;&lt;/pre&gt;
&lt;br /&gt;
Se o objeto nunca foi criado então não existe objeto a ser coletado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;O Método finalize()&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
A classe &lt;span style=&quot;font-style: italic;&quot;&gt;Object&lt;/span&gt; possui um método chamado &lt;span style=&quot;font-style: italic;&quot;&gt;finalize()&lt;/span&gt;. Como todas classes são filhas de &lt;span style=&quot;font-style: italic;&quot;&gt;Object&lt;/span&gt;, implícita ou explicitamente, todas herdam tal método. Este&lt;span style=&quot;font-style: italic;&quot;&gt; &lt;/span&gt;método é chamado pelo coletor de lixo  quando não há mais referências ao objeto. Mas lembre-se que: se não há garantia que a coleta seja executada quando você solicitar, &lt;span style=&quot;font-style: italic;&quot;&gt;finalize()&lt;/span&gt; pode não ser executado.&lt;br /&gt;
O método &lt;span style=&quot;font-style: italic;&quot;&gt;finalize()&lt;/span&gt; de &lt;span style=&quot;font-style: italic;&quot;&gt;Object &lt;/span&gt;não executa nenhuma ação, mas pode ser sobrescrito para que faça algo antes que o objeto seja coletado. Pode ser feito uma liberação de recursos, como fechar um arquivo, finalizar uma conexão, etc. Também podemos usá-lo para salvar o objeto da coleta, daqui a pouco explico melhor.&lt;br /&gt;
O método &lt;span style=&quot;font-style: italic;&quot;&gt;finalize()&lt;/span&gt; dá ao programador o poder sobre a vida e a morte dos objetos. Para entender melhor essa afirmação, veja dois conceitos importantes sobre o método:&lt;/div&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;finalize()&lt;/span&gt; só é chamado uma única e exclusiva vez para qualquer objeto durante a coleta.&lt;/li&gt;
&lt;li&gt;Chamar &lt;span style=&quot;font-style: italic;&quot;&gt;finalize()&lt;/span&gt; pode salvar o objeto da coleta.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
A primeira afirmação significa que se você chamar &lt;span style=&quot;font-style: italic;&quot;&gt;finalize()&lt;/span&gt; por conta própria, ele não será chamado novamente quando a coleta for executada. E a segunda significa que podemos inserir algum código em &lt;span style=&quot;font-style: italic;&quot;&gt;finalize()&lt;/span&gt; para fazer que o objeto tenha uma nova referência e não seja coletado. Mas ressucitar um objeto não é tão simples assim. Abaixo temos um pequeno exemplo de como isto é feito:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
public class Objeto{

// Sobrescreve finalize
public void finalize(){
// Da uma nova referência para objeto1
objeto1 = new Objeto();
}

// Objeto que vai ressuscitar
static Objeto objeto1 = new Objeto();

public static void main(String[] args) {

objeto1 = null; // Elegível a coleta

System.gc(); // Chama finalize como consequência

// Aqui faz o thread dormir um pouco
// enquanto a coleta é feita (espero que seja)
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}

objeto1.go(); // Não deveria causar um NullPointerException?

}

void go(){
System.out.println(&quot;Estou vivo!&quot;);
}
}&lt;/pre&gt;
&lt;br /&gt;
Veja que quando &lt;span style=&quot;font-style: italic;&quot;&gt;main&lt;/span&gt; começar a ser executado, objeto1 faz referência a &lt;span style=&quot;font-style: italic;&quot;&gt;null&lt;/span&gt;, se tornando elegível a coleta. Então é solicitado que a coleta seja feita (reze pra &lt;span style=&quot;font-style: italic;&quot;&gt;JVM&lt;/span&gt; aceitar o pedido). Logo após fazemos o &lt;span style=&quot;font-style: italic;&quot;&gt;thread&lt;/span&gt; &lt;span style=&quot;font-style: italic;&quot;&gt;main&lt;/span&gt; descançar um pouco... Há muitas incertezas neste momento. Desejamos que a coleta seja feita e que isso aconteça enquanto &lt;span style=&quot;font-style: italic;&quot;&gt;main&lt;/span&gt; tira um cochilo. Primeiro não sabemos se a &lt;span style=&quot;font-style: italic;&quot;&gt;JVM&lt;/span&gt; vai nos atender e muito menos se isso será feito num segundo. Mas com sorte tudo vai correr bem. Nos meus testes a &lt;span style=&quot;font-style: italic;&quot;&gt;JVM&lt;/span&gt; respondeu bem e a saída foi:&lt;br /&gt;
&lt;pre&gt;
Estou vivo!&lt;/pre&gt;
&lt;br /&gt;
Uma parte importante do código é o cochilo de &lt;span style=&quot;font-style: italic;&quot;&gt;main&lt;/span&gt;. Como &lt;span style=&quot;font-style: italic;&quot;&gt;main&lt;/span&gt; e o coletor de lixo rodam em &lt;span style=&quot;font-style: italic;&quot;&gt;threads&lt;/span&gt; separados, não sabemos quem vai tomar o processador primeiro. (mais sobre &lt;span style=&quot;font-style: italic;&quot;&gt;threads&lt;/span&gt; &lt;a href=&quot;http://marciosouzajunior.blogspot.com/2010/07/threads-java_30.html&quot;&gt;aqui&lt;/a&gt;). Pelo que eu percebi, o coletor sempre fica pra depois e isso é compreensível, porque senão ele poderia prejudicar o desempenho do programa. Se o trecho de código onde &lt;span style=&quot;font-style: italic;&quot;&gt;main&lt;/span&gt; fica em espera for removido, antes que o coletor seja executado o método&lt;span style=&quot;font-style: italic;&quot;&gt; go()&lt;/span&gt; será chamado e causará um &lt;span style=&quot;font-style: italic;&quot;&gt;NullPonterException&lt;/span&gt;. Isso mostra que chamar o coletor não garante que ele seja executado naquele exato momento.&lt;br /&gt;
Continuando... Agora vamos praticar um pouco. Veja uma questão que tem grandes chances de aparecer no exame &lt;span style=&quot;font-style: italic;&quot;&gt;SCJP&lt;/span&gt;:&lt;br /&gt;
&lt;pre&gt;Given:&lt;/pre&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
interface Animal {
void makeNoise();
}

class Horse implements Animal {
Long weight = 1200L;

public void makeNoise() {
System.out.println(&quot;whinny&quot;);
}
}

public class Icelandic extends Horse {
public void makeNoise() {
System.out.println(&quot;vinny&quot;);
}

public static void main(String[] args) {
Icelandic i1 = new Icelandic();
Icelandic i2 = new Icelandic();
Icelandic i3 = new Icelandic();
i3 = i1;
i1 = i2;
i2 = null;
i3 = i1;
} //Line 14
}&lt;/pre&gt;
&lt;pre&gt;When line 14 is reached, how many objects are
eligible for the garbage collector?

A. 0
B. 1
C. 2
D. 3
E. 4
F. 6&lt;/pre&gt;
&lt;br /&gt;
Analisando o código vemos que existem algumas coisas querendo nos desviar do foco principal: Interface e sobrescrição de métodos. &lt;span style=&quot;font-style: italic;&quot;&gt;Horse&lt;/span&gt; implementa o médodo de &lt;span style=&quot;font-style: italic;&quot;&gt;Animal&lt;/span&gt; corretamente e declara uma variável do tipo &lt;span style=&quot;font-style: italic;&quot;&gt;Long&lt;/span&gt; (&lt;span style=&quot;font-style: italic;&quot;&gt;Long&lt;/span&gt; não é &lt;span style=&quot;font-style: italic;&quot;&gt;long&lt;/span&gt;, isso fará diferença no resultado). Depois &lt;span style=&quot;font-style: italic;&quot;&gt;Icelandic, &lt;/span&gt;que é subclasse de &lt;span style=&quot;font-style: italic;&quot;&gt;Horse&lt;/span&gt;, sobrescreve o método &lt;span style=&quot;font-style: italic;&quot;&gt;makeNoise&lt;/span&gt; corretamente. Tirando essas distrações, entramos na execução do código:&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
Icelandic i1 = new Icelandic();
Icelandic i2 = new Icelandic();
Icelandic i3 = new Icelandic();&lt;/pre&gt;
&lt;br /&gt;
A melhor coisa a se fazer é desenhar o esquema:&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi65YFbwqZMEkJsPCMI45iGBMff8ZHm0yWLszvrBeKgGA-WxOjkzSDoxOoiDfN5YAtS_c5rkkk1qy2YaGNAFsGLv-p7RaJu0tcG-sGNkPYG4Bzi94s6mseuyXDfoR_qQK39KFsX42TfIV9d/s1600/icelandic1.jpg&quot; onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5530543097951010450&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi65YFbwqZMEkJsPCMI45iGBMff8ZHm0yWLszvrBeKgGA-WxOjkzSDoxOoiDfN5YAtS_c5rkkk1qy2YaGNAFsGLv-p7RaJu0tcG-sGNkPYG4Bzi94s6mseuyXDfoR_qQK39KFsX42TfIV9d/s400/icelandic1.jpg&quot; style=&quot;cursor: pointer; display: block; height: 400px; margin: 0px auto 10px; text-align: center; width: 390px;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Note que cada objeto &lt;span style=&quot;font-style: italic;&quot;&gt;Icelandic&lt;/span&gt; possui uma variável &lt;span style=&quot;font-style: italic;&quot;&gt;weight&lt;/span&gt;, herdada de &lt;span style=&quot;font-style: italic;&quot;&gt;Horse&lt;/span&gt;.&lt;br /&gt;
Então continuando no programa temos &lt;span style=&quot;font-style: italic;&quot;&gt;i3&lt;/span&gt; fazendo referência a&lt;span style=&quot;font-style: italic;&quot;&gt; i1&lt;/span&gt;:&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
i3 = i1;&lt;/pre&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoSI3YNycvE59mlk-mN3ZUGf72WBVctoa2E6zqgRvnH0Pg3b2WGe_trkkEflCBGKQSTzffhUL3EJ1IzM_RtD3H4sVU6lr-aHuT_bulPNWtD2SArYt8yswgkKIykHj2Fh5-fEupOigRsgjG/s1600/icelandic2.jpg&quot; onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5530544106269867522&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoSI3YNycvE59mlk-mN3ZUGf72WBVctoa2E6zqgRvnH0Pg3b2WGe_trkkEflCBGKQSTzffhUL3EJ1IzM_RtD3H4sVU6lr-aHuT_bulPNWtD2SArYt8yswgkKIykHj2Fh5-fEupOigRsgjG/s400/icelandic2.jpg&quot; style=&quot;cursor: pointer; display: block; height: 400px; margin: 0px auto 10px; text-align: center; width: 390px;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Neste momento já temos 2 objetos qualificados pra coleta. Porque 2? Lembra da variável &lt;span style=&quot;font-style: italic;&quot;&gt;Long&lt;/span&gt;? Pois então, &lt;span style=&quot;font-style: italic;&quot;&gt;Long&lt;/span&gt; é uma classe &lt;span style=&quot;font-style: italic;&quot;&gt;wrapper&lt;/span&gt; e portanto é um objeto no &lt;span style=&quot;font-style: italic;&quot;&gt;heap&lt;/span&gt; (variáveis de instância residem do &lt;span style=&quot;font-style: italic;&quot;&gt;heap&lt;/span&gt;). Continuando no progama temos:&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
i1 = i2;&lt;/pre&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9dHKWxgMvgkotFw8UQaVc3ZZ3cnP8EcpSYAd-ImkUlAmfA1lj02zfCT4EPVvHHc41zfXUwqJdKXIK_oezGHJLoGT5ixluSHl5tPVE9upjgar8CsZ2NtnWSLZZOgXfGn8fDm8FRjqklkOO/s1600/icelandic3.jpg&quot; onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5530544866187798722&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9dHKWxgMvgkotFw8UQaVc3ZZ3cnP8EcpSYAd-ImkUlAmfA1lj02zfCT4EPVvHHc41zfXUwqJdKXIK_oezGHJLoGT5ixluSHl5tPVE9upjgar8CsZ2NtnWSLZZOgXfGn8fDm8FRjqklkOO/s400/icelandic3.jpg&quot; style=&quot;cursor: pointer; display: block; height: 400px; margin: 0px auto 10px; text-align: center; width: 390px;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Aqui não temos muitas mudanças, nenhum objeto é qualificado. &lt;span style=&quot;font-style: italic;&quot;&gt;i1&lt;/span&gt; faz referência ao objeto de &lt;span style=&quot;font-style: italic;&quot;&gt;i2&lt;/span&gt;, mas o objeto que &lt;span style=&quot;font-style: italic;&quot;&gt;i1&lt;/span&gt; referenciava ainda é acessível através de &lt;span style=&quot;font-style: italic;&quot;&gt;i3&lt;/span&gt;. Continuando:&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
i2 = null;&lt;/pre&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTrCXw4QKYe8zel_i-UG0LoAr3aKojEIgy0ikn523h6hQRWF1KXyLQReN4h1QriL2SBcdqxa12BUWiNeAYtYkjdd9pg6MvsOJRHFZnvLeFkShByWZzBsJehfG_PpE8dzrnOiuW2dFbiSzq/s1600/icelandic4.jpg&quot; onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5530545101628204002&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTrCXw4QKYe8zel_i-UG0LoAr3aKojEIgy0ikn523h6hQRWF1KXyLQReN4h1QriL2SBcdqxa12BUWiNeAYtYkjdd9pg6MvsOJRHFZnvLeFkShByWZzBsJehfG_PpE8dzrnOiuW2dFbiSzq/s400/icelandic4.jpg&quot; style=&quot;cursor: pointer; display: block; height: 400px; margin: 0px auto 10px; text-align: center; width: 390px;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Neste momento &lt;span style=&quot;font-style: italic;&quot;&gt;i2&lt;/span&gt; passou a referenciar &lt;span style=&quot;font-style: italic;&quot;&gt;null&lt;/span&gt;, mas o objeto que era referenciado por ele anteriormente ainda é referenciado por&lt;span style=&quot;font-style: italic;&quot;&gt; i1&lt;/span&gt;. E finalmente temos:&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
i3 = i1;&lt;/pre&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgT5RROcpS837ZskI_SoPW-CrjclY82HpvZkr6ss0_Nkb0SHYPy1sVeRn61Om6l-_lndmzV53pdkmkcqUUnP_5wK3BXFzH5Jj7TfQ1flKnOIa70C0OROgONjvDcMLXGFhzpgW1YjDAJwaW3/s1600/icelandic5.jpg&quot; onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5530545656427148610&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgT5RROcpS837ZskI_SoPW-CrjclY82HpvZkr6ss0_Nkb0SHYPy1sVeRn61Om6l-_lndmzV53pdkmkcqUUnP_5wK3BXFzH5Jj7TfQ1flKnOIa70C0OROgONjvDcMLXGFhzpgW1YjDAJwaW3/s400/icelandic5.jpg&quot; style=&quot;cursor: pointer; display: block; height: 400px; margin: 0px auto 10px; text-align: center; width: 390px;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Novamente &lt;span style=&quot;font-style: italic;&quot;&gt;i3&lt;/span&gt; faz referencia a&lt;span style=&quot;font-style: italic;&quot;&gt; i1&lt;/span&gt;, só que agora &lt;span style=&quot;font-style: italic;&quot;&gt;i1&lt;/span&gt; faz referência ao objeto que era referenciado por &lt;span style=&quot;font-style: italic;&quot;&gt;i2&lt;/span&gt;. Isso torna o objeto (que antes era referenciado por &lt;span style=&quot;font-style: italic;&quot;&gt;i1&lt;/span&gt; e depois por &lt;span style=&quot;font-style: italic;&quot;&gt;i3)&lt;/span&gt;, qualificado para coleta.&lt;br /&gt;
Ufa! Mas enfim quantos objetos se tornaram elegíveis a coleta? Quatro. Dois objetos do tipo &lt;span style=&quot;font-style: italic;&quot;&gt;Icelandic&lt;/span&gt; e dois do tipo &lt;span style=&quot;font-style: italic;&quot;&gt;Long&lt;/span&gt;. Geralmente esse tipo de pergunta inclui essas variáveis de instância que são tipos de classe&lt;span style=&quot;font-style: italic;&quot;&gt; wrapper&lt;/span&gt; só pra confudir.&lt;br /&gt;
Um modo de saber quantos objetos foram descartados é sobrescrever &lt;span style=&quot;font-style: italic;&quot;&gt;finalize()&lt;/span&gt; para que mostre alguma mensagem. Veja o código:&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
public class Icelandic {
Long x;

public void finalize() {
System.out.println(&quot;tchau&quot;);
}

public static void main(String[] args) {
Icelandic i1 = new Icelandic();
Icelandic i2 = new Icelandic();
Icelandic i3 = new Icelandic();

i3 = i1;
i1 = i2;
i2 = null;
i3 = i1;

System.gc();
}
}&lt;/pre&gt;
&lt;br /&gt;
A saída deste código é:&lt;br /&gt;
&lt;pre&gt;
tchau
tchau&lt;/pre&gt;
&lt;br /&gt;
Quatro objetos foram coletados. Note que a classe tem uma variável de instância &lt;span style=&quot;font-style: italic;&quot;&gt;Long&lt;/span&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Ilhas de Isolamento&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Ilhas de isolamento ocorrem quando variáveis de instância fazem referência umas as outras formando um circuito fechado. Então se as referência a seus referências forem anuladas, os objetos perderão seu vínculo com elas e terão referências apenas uns dos outros. Analise o código:&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
public class Icelandic {

// Variável de instância
Icelandic i;

public void finalize() {
System.out.println(&quot;tchau&quot;);
}

public static void main(String[] args) {

Icelandic i1 = new Icelandic();
Icelandic i2 = new Icelandic();

// Variáveis de instância apontam uma para outra
i1.i = i2;
i2.i = i1;

// As variáveis locais perdem a referência
i1 = null;
i2 = null;

System.gc();
}
}&lt;/pre&gt;
&lt;br /&gt;
O cenário inicial deste código é representado abaixo:&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFgLTOuV2PLtjf0_ikyvxBpKiSmVxjXj_ZjT8VxkiqcoZLXSWdcmIxzIRS15fHGCBitR5bnGX1sJjQFEGfJkynG-YHeIumdHoF8KA9Ibv2Q11vC_ud94PITw8Mz-TAuC5xpf-m8_fpZlVY/s1600/icelandic6.jpg&quot; onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5530548664953754050&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFgLTOuV2PLtjf0_ikyvxBpKiSmVxjXj_ZjT8VxkiqcoZLXSWdcmIxzIRS15fHGCBitR5bnGX1sJjQFEGfJkynG-YHeIumdHoF8KA9Ibv2Q11vC_ud94PITw8Mz-TAuC5xpf-m8_fpZlVY/s400/icelandic6.jpg&quot; style=&quot;cursor: pointer; display: block; height: 400px; margin: 0px auto 10px; text-align: center; width: 375px;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Depois das declarações a variavel de instância &lt;span style=&quot;font-style: italic;&quot;&gt;i&lt;/span&gt; de &lt;span style=&quot;font-style: italic;&quot;&gt;i1&lt;/span&gt; (&lt;span style=&quot;font-style: italic;&quot;&gt;i1.i&lt;/span&gt;) faz referência a &lt;span style=&quot;font-style: italic;&quot;&gt;i2&lt;/span&gt;. E a variável de instância &lt;span style=&quot;font-style: italic;&quot;&gt;i&lt;/span&gt; de&lt;span style=&quot;font-style: italic;&quot;&gt; i2&lt;/span&gt; (&lt;span style=&quot;font-style: italic;&quot;&gt;i2.i&lt;/span&gt;) faz referência a&lt;span style=&quot;font-style: italic;&quot;&gt; i1&lt;/span&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmFX6JwmqZEbKCjfTyCVK5GZ1F8wUQu4Xy0pgvl3Ye8ijhV3m9fWUKQ_UUcKWbn4brSz_-iueyy0gcJ7U2KvJxd8vFBgqlB3MChVfmAuCYd5OH0rBocepl09NuQt65IjNTPYAhQq3bFNTq/s1600/icelandic7.jpg&quot; onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5530549001869640562&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmFX6JwmqZEbKCjfTyCVK5GZ1F8wUQu4Xy0pgvl3Ye8ijhV3m9fWUKQ_UUcKWbn4brSz_-iueyy0gcJ7U2KvJxd8vFBgqlB3MChVfmAuCYd5OH0rBocepl09NuQt65IjNTPYAhQq3bFNTq/s400/icelandic7.jpg&quot; style=&quot;cursor: pointer; display: block; height: 400px; margin: 0px auto 10px; text-align: center; width: 375px;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Logo depois&lt;span style=&quot;font-style: italic;&quot;&gt; i1&lt;/span&gt; e&lt;span style=&quot;font-style: italic;&quot;&gt; i2&lt;/span&gt; passam a referenciar &lt;span style=&quot;font-style: italic;&quot;&gt;null&lt;/span&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGW1sPVJK1QqErLPLNYu3eZ2n0vgcidOlT63BSklhxZLKBXwyuqllGWniJm76UYFSfBtaRvl1adOY4f_KUinOcSlopvuNy26Ddaxu9vhDID5gb-6lMQLJ7mpHwPAc4r5JXd4H2zr4B85rc/s1600/icelandic8.jpg&quot; onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5530549209745431858&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGW1sPVJK1QqErLPLNYu3eZ2n0vgcidOlT63BSklhxZLKBXwyuqllGWniJm76UYFSfBtaRvl1adOY4f_KUinOcSlopvuNy26Ddaxu9vhDID5gb-6lMQLJ7mpHwPAc4r5JXd4H2zr4B85rc/s400/icelandic8.jpg&quot; style=&quot;cursor: pointer; display: block; height: 400px; margin: 0px auto 10px; text-align: center; width: 375px;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Consegue sentir como é dramático este cenário? Embora os objetos tenham variáveis que fazem referência entre eles, nenhum &lt;span style=&quot;font-style: italic;&quot;&gt;thread&lt;/span&gt; ativo pode alcançá-los. Não importa se eles podem acessar um ao outro, de fora ninguém pode acessá-los. Portanto estão qualificados a coleta de lixo.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Conclusão&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Sei que esse assunto é um pouco confuso, mas basta fazer os desenhos pra exergar a solução. Bons estudos e até a próxima!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://marciosouzajunior.blogspot.com/feeds/6996944325793903931/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://marciosouzajunior.blogspot.com/2010/10/garbage-collector.html#comment-form' title='18 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/6996944325793903931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/6996944325793903931'/><link rel='alternate' type='text/html' href='http://marciosouzajunior.blogspot.com/2010/10/garbage-collector.html' title='Garbage Collector - Java'/><author><name>Márcio de Souza Júnior</name><uri>http://www.blogger.com/profile/01965624113971008303</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaELIifD9yVu_Xv_N_7WD0z39xlM6Ai_18_XKh4Xp1GAqA6fW5g10L0xwc9YKFqODlri_hhoKBpwroMozORWLqNos8wQ4Ei3-Ir_qIi7UjyEeknlKz3v9HixwVz4FBr_2asWrNJ8-amQ5n/s72-c/heap1.jpg" height="72" width="72"/><thr:total>18</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5856286885704734621.post-5104768274102956660</id><published>2010-10-18T10:08:00.000-02:00</published><updated>2014-09-20T17:34:03.900-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cast"/><category scheme="http://www.blogger.com/atom/ns#" term="casting"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="scjp"/><title type='text'>Regras de Cast - Java</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
Olá! Hoje vamos nos aprofundar um pouco mais nas conversões de tipos. Num &lt;a href=&quot;http://marciosouzajunior.blogspot.com/2010/07/conversao-de-tipos-ou-casting-java.html&quot;&gt;outro post&lt;/a&gt; eu cheguei a abordar o assunto, porém faltou um esclarecimento maior sobre erros que podem ocorrer. Conversões de tipos no &lt;span style=&quot;font-style: italic;&quot;&gt;Java&lt;/span&gt; podem ser um pouco confusas, pois temos regras para tempo de compilação e de execução. Por exemplo, temos duas classes:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
public class Veiculo {

public static void main(String[] args) {

}

}

class Carro extends Veiculo {

}&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Um dos casos mais comuns é a conversão ampliadora ou &lt;span style=&quot;font-style: italic;&quot;&gt;upcasting&lt;/span&gt;, onde um tipo mais genérico pode referenciar outro mais específico (um subtipo):&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
Veiculo v = new Carro();&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Temos uma variável de referência do tipo &lt;span style=&quot;font-style: italic;&quot;&gt;Veiculo&lt;/span&gt; que aponta para um objeto do tipo &lt;span style=&quot;font-style: italic;&quot;&gt;Carro&lt;/span&gt;. Sabemos que o contrário não pode ser feito e causa erro de compilação, porque&lt;span style=&quot;font-style: italic;&quot;&gt; Carro&lt;/span&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;É-UM&lt;/span&gt; &lt;span style=&quot;font-style: italic;&quot;&gt;Veiculo,&lt;/span&gt; mas &lt;span style=&quot;font-style: italic;&quot;&gt;Veiculo&lt;/span&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;NÃO-É-UM&lt;/span&gt; &lt;span style=&quot;font-style: italic;&quot;&gt;Carro&lt;/span&gt;.&lt;br /&gt;
A conversão ampliadora é totalmente segura, não causará erros de compilação nem execução. E também não exige nenhuma declaração explícita. Simplesmente fazemos a referência e o compilador entenderá que é seguro uma variável do tipo &lt;span style=&quot;font-style: italic;&quot;&gt;Veiculo&lt;/span&gt; referenciar um objeto &lt;span style=&quot;font-style: italic;&quot;&gt;Carro&lt;/span&gt;, pois &lt;span style=&quot;font-style: italic;&quot;&gt;Veiculo&lt;/span&gt; pode fazer coisas que &lt;span style=&quot;font-style: italic;&quot;&gt;Carro&lt;/span&gt; faz. Isso porque &lt;span style=&quot;font-style: italic;&quot;&gt;Carro&lt;/span&gt; herdou estes comportamentos. Na verdade &lt;span style=&quot;font-style: italic;&quot;&gt;Carro&lt;/span&gt; pode fazer ainda mais coisas, porém como &lt;span style=&quot;font-style: italic;&quot;&gt;Veiculo&lt;/span&gt; não sabe dessas coisas, esse tipo de conversão limita os comportamentos de &lt;span style=&quot;font-style: italic;&quot;&gt;Carro&lt;/span&gt;. Agora somente métodos de &lt;span style=&quot;font-style: italic;&quot;&gt;Veiculo&lt;/span&gt; podem ser chamados. Lembre-se que a variável de referência é quem diz quais métodos poderão ser chamados.&lt;/div&gt;
&lt;br /&gt;
Vamos continuar e ver uma conversão redutora, ou &lt;span style=&quot;font-style: italic;&quot;&gt;downcasting&lt;/span&gt;:&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
Carro c = v;&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Veja que estamos indo pra baixo na árvore de herança agora. Tentamos fazer com que a variável de refência do tipo &lt;span style=&quot;font-style: italic;&quot;&gt;Veiculo&lt;/span&gt; (usada anteriomente para referenciar &lt;span style=&quot;font-style: italic;&quot;&gt;Carro&lt;/span&gt;), seja atribuída a outra variável do tipo &lt;span style=&quot;font-style: italic;&quot;&gt;Carro&lt;/span&gt;, fazendo com que as duas apontem para o mesmo objeto. Um pouco confuso mas veja como funciona:&lt;/div&gt;
&lt;br /&gt;
&lt;blockquote&gt;
Antes fizemos isto:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-style: italic;&quot;&gt;Veiculo -&amp;gt; Carro&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Agora estamos tentando isto:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-style: italic;&quot;&gt;Carro = Veiculo -&amp;gt; Carro&lt;/span&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Essa conversão não pode ser feita implicitamente, como no &lt;span style=&quot;font-style: italic;&quot;&gt;upcasting&lt;/span&gt;. O código anterior não compila, mas como sabemos que a variável &lt;span style=&quot;font-style: italic;&quot;&gt;v&lt;/span&gt; aponta pra um objeto do tipo &lt;span style=&quot;font-style: italic;&quot;&gt;Carro&lt;/span&gt;, podemos fazer a conversão explicitamente:&lt;/div&gt;
&lt;br /&gt;
&lt;blockquote style=&quot;font-style: italic;&quot;&gt;
Carro = (Carro)Veiculo -&amp;gt; Carro&lt;/blockquote&gt;
&lt;br /&gt;
Isto é:&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
Carro c = (Carro)v;&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Isto funcionou porque &lt;span style=&quot;font-style: italic;&quot;&gt;v&lt;/span&gt; faz referência a um objeto &lt;span style=&quot;font-style: italic;&quot;&gt;Carro&lt;/span&gt;. Então é seguro a referência &lt;span style=&quot;font-style: italic;&quot;&gt;Veiculo&lt;/span&gt; para &lt;span style=&quot;font-style: italic;&quot;&gt;Carro&lt;/span&gt;. Lembre-se que o tipo de objeto sendo refenciado é que determina se a conversão poderá ser feita. Mas e se o objeto referenciado não fosse &lt;span style=&quot;font-style: italic;&quot;&gt;Carro&lt;/span&gt;? Agora fica interessante porque o compilador &lt;span style=&quot;font-style: italic;&quot;&gt;lava suas mãos&lt;/span&gt;. Portanto, o seguinte código &lt;span style=&quot;font-weight: bold;&quot;&gt;vai&lt;/span&gt; compilar:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
Veiculo v1 = new Veiculo(); //Objeto Veiculo

Carro c1 = (Carro)v1;&lt;/pre&gt;
&lt;br /&gt;
Mas como o que estamos tentando fazer é isto:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote style=&quot;font-style: italic;&quot;&gt;
Carro = (Carro)Veiculo -&amp;gt; &lt;span style=&quot;color: red;&quot;&gt;Veiculo!!&lt;/span&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;
Quando executamos o código, a seguinte mensagem será exibida:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;color: red;&quot;&gt;Exception in thread &quot;main&quot; java.lang.ClassCastException:
Veiculo cannot be cast to Carro&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Outros códigos serão executados normalmente, mas quando tentar a conversão acima, a exceção vai finalizar o programa. Isso nos mostra que só podemos fazer &lt;span style=&quot;font-style: italic;&quot;&gt;downcasting&lt;/span&gt; se o objeto sendo refenciado for do tipo da variável que vai fazer a referência. O compilador não sabe se estamos fazendo isso errado, mas podemos nos prevenir de duas formas. Uma é usando o operador &lt;span style=&quot;font-style: italic;&quot;&gt;instanceof&lt;/span&gt;:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
Veiculo v1 = new Veiculo();

if (v1 instanceof Carro) {
    Carro c1 = (Carro) v1;
}else
    System.out.println(&quot;Não foi possível...&quot;);&lt;/pre&gt;
&lt;br /&gt;
Outra é tratando a exceção:&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
try{
    Carro c1 = (Carro)v1;
}catch (ClassCastException e) {
    System.out.println(&quot;Não foi possível...&quot;);
}&lt;/pre&gt;
&lt;br /&gt;
Com isso espero ter esclarecido dúvidas sobre erros de compilação e execução causados pelas conversões.&lt;br /&gt;
Por hoje é só pessoal! Bons estudos..</content><link rel='replies' type='application/atom+xml' href='http://marciosouzajunior.blogspot.com/feeds/5104768274102956660/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://marciosouzajunior.blogspot.com/2010/10/regras-de-cast-java.html#comment-form' title='5 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/5104768274102956660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/5104768274102956660'/><link rel='alternate' type='text/html' href='http://marciosouzajunior.blogspot.com/2010/10/regras-de-cast-java.html' title='Regras de Cast - Java'/><author><name>Márcio de Souza Júnior</name><uri>http://www.blogger.com/profile/01965624113971008303</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5856286885704734621.post-2152817104936663346</id><published>2010-10-15T10:31:00.000-03:00</published><updated>2012-04-23T08:28:49.048-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="exceções"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="scjp"/><category scheme="http://www.blogger.com/atom/ns#" term="sobrescrita"/><title type='text'>Sobrescrita e Exceções</title><content type='html'>&lt;span style=&quot;font-weight: bold;&quot;&gt;Introdução&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Hoje vou escrever sobre um assunto que está presente no objetivo 1.5 da &lt;span style=&quot;font-style: italic;&quot;&gt;SCJP&lt;/span&gt;. O objetivo determina que o candidato saiba identificar se a sobrescrição de um método está correta. Eu já falei sobre sobrescrita num &lt;a href=&quot;http://marciosouzajunior.blogspot.com/2010/07/sobrescrita-sobercarga-overriding.html&quot;&gt;outro post&lt;/a&gt;, mas fiquei devendo uma explicação melhor sobre exceções.&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Exceções Verificadas (&lt;span style=&quot;font-style: italic;&quot;&gt;checked&lt;/span&gt;) &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
As exceções verificadas são exceções que devem ser tratadas por você no seu código. O compilador irá forçá-lo a lidar adequadamente com essas exceções. Você pode capturar essas exceções ou declará-las na cláusula &lt;span style=&quot;font-style: italic;&quot;&gt;throws&lt;/span&gt; do método.&lt;br /&gt;
Geralmente, as exceções verificadas ocorrem devido a condições fora de seu controle, como &lt;span style=&quot;font-style: italic;&quot;&gt;IOException&lt;/span&gt; ou uma falha na conexão de rede. Mas sua aplicação deve prever essas condições e tratá-las corretamente para que não venha travar. É por isso que você é forçado pelo compilador a lidar com essas exceções. Se a conexão de rede é interrompida durante uma transferência de arquivo, o aplicativo deve lidar com isso e permitir que o usuário tente novamente.&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Exceções Não verificadas (&lt;span style=&quot;font-style: italic;&quot;&gt;unchecked&lt;/span&gt;)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Por outro lado, exceções não-verificadas ocorrem devido a erros de codificação por parte do programador. Como uma exceção &lt;span style=&quot;font-style: italic;&quot;&gt;NullPointerException&lt;/span&gt; que pode ser evitada através de uma verificação para saber se a referência é nula.&lt;br /&gt;
Existem também algumas exceções &lt;span style=&quot;font-style: italic;&quot;&gt;unchecked&lt;/span&gt; que podem ocorrer que não são culpa do programador. Estas são as exceções que são subclasses da classe &lt;span style=&quot;font-style: italic;&quot;&gt;java.lang.Error&lt;/span&gt;. Quando essas exceções ocorrem, não há muito o que fazer, então você não é obrigado a lidar com elas já que não pode prever quando irão ocorrer. Como um &lt;span style=&quot;font-style: italic;&quot;&gt;OutOfMemoryError&lt;/span&gt; pode ocorrer a qualquer momento que um objeto é instanciado, você não pode colocar cada instanciação de objeto em blocos&lt;span style=&quot;font-style: italic;&quot;&gt; try-catch&lt;/span&gt;.&lt;/div&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Exemplos&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Vamos criar um exemplo para ver como o compilador nos força a tratar exceções verificadas.&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;class ExcecaoNaoTratada {
public static void main(String[] args) {
 throw new Exception();
}
}&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
O código acima não vai compilar porque não estamos tratando a exceção verificada. Para tornar o código compilável podemos colocar a instrução num bloco &lt;span style=&quot;font-style: italic;&quot;&gt;try-catch&lt;/span&gt; afim de capturá-la ou declarar a exceção numa cláusula&lt;span style=&quot;font-style: italic;&quot;&gt; throws&lt;/span&gt; do método main que irá lançá-la.&lt;br /&gt;
&lt;br /&gt;
No caso de exceções não verificadas, se o método lançar uma exceção não verificada, o compilador não vai reclamar se ela não for tratada. Então o seguinte código compila normalmente:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;class ExcecaoNaoTratada {
public static void main(String[] args) {
 throw new RuntimeException();
}
}&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Hierarquia de classes&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
A classe &lt;span style=&quot;font-style: italic;&quot;&gt;java.lang.Throwable&lt;/span&gt; é uma exceção verificada. A &lt;span style=&quot;font-style: italic;&quot;&gt;API Java&lt;/span&gt; define duas subclasses de &lt;span style=&quot;font-style: italic;&quot;&gt;Throwable&lt;/span&gt;. Estes são&lt;span style=&quot;font-style: italic;&quot;&gt; java.lang.Exception&lt;/span&gt; e &lt;span style=&quot;font-style: italic;&quot;&gt;java.lang.Error&lt;/span&gt;. &lt;span style=&quot;font-style: italic;&quot;&gt;Error&lt;/span&gt; é uma classe de exceção não verificada, enquanto &lt;span style=&quot;font-style: italic;&quot;&gt;Exception&lt;/span&gt; é uma exceção verificada. A classe &lt;span style=&quot;font-style: italic;&quot;&gt;Exception&lt;/span&gt; em si tem a subclasse &lt;span style=&quot;font-style: italic;&quot;&gt;java.lang.RuntimeException&lt;/span&gt; (não verificada). As exceções não verificadas como &lt;span style=&quot;font-style: italic;&quot;&gt;NullPointerException&lt;/span&gt;,&lt;span style=&quot;font-style: italic;&quot;&gt; ClassCastException&lt;/span&gt; etc, são todas as sub-classes de &lt;span style=&quot;font-style: italic;&quot;&gt;RuntimeException&lt;/span&gt;. Todas as subclasses de &lt;span style=&quot;font-style: italic;&quot;&gt;RuntimeException&lt;/span&gt; e &lt;span style=&quot;font-style: italic;&quot;&gt;Error&lt;/span&gt; são exceções não verificadas. Outras classes são exceções verificadas.&lt;/div&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnVmcn4rCIQSFMU98mDVCa34Dd45lis-2cFV5HhLBMa7DA90XGqc1-lChXyznMR0LuXMo_ye0nlZh4J9uRsV_4Urt_IhWc7N9BJWulA3R358BfTUI6rBMvYjvQG5pgTJshhUwP-et8cFEQ/s1600/excecoes.jpg&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5528266896495725634&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnVmcn4rCIQSFMU98mDVCa34Dd45lis-2cFV5HhLBMa7DA90XGqc1-lChXyznMR0LuXMo_ye0nlZh4J9uRsV_4Urt_IhWc7N9BJWulA3R358BfTUI6rBMvYjvQG5pgTJshhUwP-et8cFEQ/s400/excecoes.jpg&quot; style=&quot;cursor: pointer; display: block; height: 202px; margin: 0px auto 10px; text-align: center; width: 400px;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Se você criar sua própria classe de exceção, se ela é verificada ou não, depende de qual classe &lt;span style=&quot;font-style: italic;&quot;&gt;Exception&lt;/span&gt; ela é subclasse. Se a sua classe estende uma classe de exceção verificada, então sua classe será uma exceção verificada. E se a sua classe estende uma classe de exceção não verificada, então a sua classe será uma exceção não verificada.&lt;br /&gt;
&lt;br /&gt;
Existe uma regra com exceções verificadas que às vezes confunde as pessoas. Se no seu bloco &lt;span style=&quot;font-style: italic;&quot;&gt;catch&lt;/span&gt; você está capturando uma exceção verificada, então deve haver a possibilidade de sua ocorrência no bloco&lt;span style=&quot;font-style: italic;&quot;&gt; try&lt;/span&gt;. Assim, o código a seguir não vai compilar:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;try {
System.out.println(&quot;...&quot;);
} catch(java.io.IOException ioe) {
}&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
O compilador irá informar que &lt;span style=&quot;font-style: italic;&quot;&gt;IOException&lt;/span&gt; nunca é lançada no bloco &lt;span style=&quot;font-style: italic;&quot;&gt;try&lt;/span&gt;, então você não pode capturá-la. Esta regra não se aplica às exceções não verificadas. Se você está capturando uma exceção não verificada, que não é lançada no bloco &lt;span style=&quot;font-style: italic;&quot;&gt;try&lt;/span&gt;, o compilador não vai reclamar. Agora fica um pouco confuso com as classes &lt;span style=&quot;font-style: italic;&quot;&gt;Exception&lt;/span&gt; e &lt;span style=&quot;font-style: italic;&quot;&gt;Throwable&lt;/span&gt;. Ambas são classes de exceções verificadas, mas você pode capturá-las sem qualquer exceção sendo lançada no bloco &lt;span style=&quot;font-style: italic;&quot;&gt;try&lt;/span&gt;. Então, esse código será compilado sem erros:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;try {
System.out.println(&quot;...&quot;);
} catch(Exception ex) {
}&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
As regras são diferentes para &lt;span style=&quot;font-style: italic;&quot;&gt;Throwable&lt;/span&gt; e &lt;span style=&quot;font-style: italic;&quot;&gt;Exception&lt;/span&gt; e outras classes de exceção verificada. Isto porque tanto &lt;span style=&quot;font-style: italic;&quot;&gt;Exception&lt;/span&gt; e &lt;span style=&quot;font-style: italic;&quot;&gt;Throwable&lt;/span&gt; tem exceções não verificadas como subclasses. Assim, o compilador permite capturá-los pensando que você pode estar tentando pegar uma exceção não verificada. Lembre-se que o compilador não está preocupado com as exceções não verificadas. &lt;span style=&quot;font-style: italic;&quot;&gt;RuntimeException&lt;/span&gt; é uma subclasse de &lt;span style=&quot;font-style: italic;&quot;&gt;Exception &lt;/span&gt;e &lt;span style=&quot;font-style: italic;&quot;&gt;Error&lt;/span&gt; é uma subclasse de &lt;span style=&quot;font-style: italic;&quot;&gt;Throwable&lt;/span&gt;, e ambos &lt;span style=&quot;font-style: italic;&quot;&gt;RuntimeException&lt;/span&gt; e &lt;span style=&quot;font-style: italic;&quot;&gt;Error&lt;/span&gt; são classes de exceção não verificada. Então, quando escrever o código:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;try {
System.out.println (&quot;...&quot;);
} Catch (Exception ex) {
}&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
O compilador não vai reclamar porque &lt;span style=&quot;font-style: italic;&quot;&gt;Exception&lt;/span&gt; também pode capturar exceções não verificadas (&lt;span style=&quot;font-style: italic;&quot;&gt;RuntimeException&lt;/span&gt; e suas subclasses). Da mesma forma o código a seguir é permitido porque &lt;span style=&quot;font-style: italic;&quot;&gt;Throwable&lt;/span&gt; pode capturar exceções não verificadas (&lt;span style=&quot;font-style: italic;&quot;&gt;RuntimeException&lt;/span&gt; e &lt;span style=&quot;font-style: italic;&quot;&gt;Error &lt;/span&gt;e suas subclasses).&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;try {
System.out.println (&quot;...&quot;);
} Catch (Throwable ex) {
}&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Regras&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Antes de continuar quero adiantar que os tópicos anteriores foram traduzidos &lt;a href=&quot;http://www.jforeach.com/understanding-checked-and-unchecked-exceptions-in-java/59&quot;&gt;deste site.&lt;/a&gt; Na verdade isso fugiu um pouco ao objetivo do exame mas serve como um esclarecimento sobre exceções. Agora vejamos ao que realmente importa no exame:&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;O método novo não pode lançar exceções verificadas novas ou mais abrangentes;&lt;/li&gt;
&lt;li&gt;O método novo pode lançar exceções verificadas mais restritivas ou menos abrangentes;&lt;/li&gt;
&lt;li&gt;O método novo pode lançar qualquer exceção não verificada;&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
A maioria dos programadores &lt;span style=&quot;font-style: italic;&quot;&gt;Java&lt;/span&gt; utilizam alguma &lt;span style=&quot;font-style: italic;&quot;&gt;IDE&lt;/span&gt; para desenvolver. É muito mais produtivo. As vezes utilizamos &lt;span style=&quot;font-style: italic;&quot;&gt;Notepad&lt;/span&gt; só para fazer alguns testes, mas normalmente alguém em boas condições mentais não programaria no bloco de notas. As&lt;span style=&quot;font-style: italic;&quot;&gt; IDE´s &lt;/span&gt;quase sempre sabem quando estamos fazendo algo errado. Aí então damos um clique e está resolvido. As regras acima são exemplos de coisas que podemos deixar por conta da &lt;span style=&quot;font-style: italic;&quot;&gt;IDE&lt;/span&gt;, mas no exame não! Para o exame você deve ter um compilador rodando em seu cérebro. A cada código analisado, você deverá saber se está certo ou não. Então vamos treinar um pouco pra isso.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
A primeira regra diz que os métodos novos não podem lançar excessões novas ou mais abrangentes (menos restritivas). Abaixo temos um código que será usado como exemplo, nele temos uma sobrescrição simples:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;public class Excecoes extends Exemplo{

void A (){
// Sobrescreveu..
}

}

class Exemplo{

void A (){

}

}&lt;/pre&gt;
&lt;br /&gt;
A primeira coisa é que não se pode fazer isso:&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;void A () throws Exception {
// Sobrescreveu..
}&lt;/pre&gt;
&lt;br /&gt;
O método novo tentou lançar uma exceção verificada nova. O código não compila. Agora analise este caso:&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;import java.io.IOException;

public class Excecoes extends Exemplo{

void A () throws Exception { //Tentou lançar uma exeção mais abrangente...
// Sobrescreveu..
}

}

class Exemplo{

void A () throws IOException{

}

}&lt;/pre&gt;
&lt;br /&gt;
O código acima também não compila. O método novo tentou lançar uma exceção mais abrangente. Com isso vimos como funciona a primeira regra. Vamos agora pra segunda:&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;import java.io.IOException;

public class Excecoes extends Exemplo{

void A () throws IOException { //Excesão menos abrangente e mais restritiva
// Sobrescreveu..
}

}

class Exemplo{

void A () throws Exception{

}

}&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
O código acima compila. O novo método lançou uma exceção que é subclasse de &lt;span style=&quot;font-style: italic;&quot;&gt;Exception&lt;/span&gt;, por isso ela é menos abrangente. O método sobrescrito se arrisca a lançar qualquer tipo de &lt;span style=&quot;font-style: italic;&quot;&gt;Exception&lt;/span&gt;, mas o método novo não precisa declarar nada que nunca lançará.&lt;br /&gt;
E a terceira e última regra diz que o método novo pode lançar qualquer exceção não verificada. Isso significa que o seguinte código é válido:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;public class Excecoes extends Exemplo{

void A () throws RuntimeException {
// Sobrescreveu..
}

}

class Exemplo{

void A (){

}

}&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Outro detalhe importante também é que o método novo pode resolver não lançar nenhuma exceção. Portanto, se ver um método sendo sobrescrito e não lançar nenhuma exceção (mesmo que o método da superclasse o faça) saiba que isto é válido.&lt;/div&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Conclusão&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Espero ter deixado mais claro este assunto que é muito importante não só pra quem vai tirar uma certificação mas também pra quem está programando no dia a dia e sabe que o negócio não é só ficar lançando exceção ou capturando sem nenhuma codificação no bloco C&lt;i&gt;atch&lt;/i&gt;.&lt;/div&gt;
&lt;br /&gt;
Até a próxima!</content><link rel='replies' type='application/atom+xml' href='http://marciosouzajunior.blogspot.com/feeds/2152817104936663346/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://marciosouzajunior.blogspot.com/2010/10/sobrescrita-e-excecoes.html#comment-form' title='6 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/2152817104936663346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/2152817104936663346'/><link rel='alternate' type='text/html' href='http://marciosouzajunior.blogspot.com/2010/10/sobrescrita-e-excecoes.html' title='Sobrescrita e Exceções'/><author><name>Márcio de Souza Júnior</name><uri>http://www.blogger.com/profile/01965624113971008303</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnVmcn4rCIQSFMU98mDVCa34Dd45lis-2cFV5HhLBMa7DA90XGqc1-lChXyznMR0LuXMo_ye0nlZh4J9uRsV_4Urt_IhWc7N9BJWulA3R358BfTUI6rBMvYjvQG5pgTJshhUwP-et8cFEQ/s72-c/excecoes.jpg" height="72" width="72"/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5856286885704734621.post-1653764167098987430</id><published>2010-10-13T10:15:00.000-03:00</published><updated>2010-10-13T11:21:46.348-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="eclipse"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="swing"/><title type='text'>Inserindo labels dinamicamente</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;Olá! Caro leitor. Hoje pela manhã estive olhando uns fóruns sobre &lt;span style=&quot;font-style: italic;&quot;&gt;Java&lt;/span&gt; quando me deparei com a seguinte pergunta: &lt;span style=&quot;font-style: italic;&quot;&gt;Como posso inserir labels dinamicamente em um JPanel?&lt;/span&gt; Então eu com meu espírito de colaborador, desenvolvi um pequeno código para responder a pergunta do indivíduo. Este código pode ser encontrado &lt;a href=&quot;http://pastebin.com/Fa1Y10MX&quot;&gt;aqui&lt;/a&gt;.&lt;br /&gt;Mas o que me inspirou mesmo fazer esta postagem não foi exatamente isto. Foi que me veio a cabeça modificar esse código e fazer com que ele mostrasse miniaturas de imagens, isto é, &lt;span style=&quot;font-style: italic;&quot;&gt;thumbnails&lt;/span&gt;. Sabemos que &lt;span style=&quot;font-style: italic;&quot;&gt;JLabels&lt;/span&gt; podem ser usados para exibir imagens num aplicativo, então bastava buscar as imagens num diretório e mostrá-las na tela. Portanto é isso que eu pretendo mostrar agora.&lt;br /&gt;Primeiramente vamos ver o código básico para mostrar uma janela. Estou utilizando &lt;span style=&quot;font-style: italic;&quot;&gt;Swing&lt;/span&gt; pra fazer isso:&lt;br /&gt;&lt;/div&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;import java.awt.Component;&lt;br /&gt;import java.awt.Graphics;&lt;br /&gt;import java.awt.event.MouseEvent;&lt;br /&gt;import java.awt.event.MouseListener;&lt;br /&gt;import java.io.File;&lt;br /&gt;import javax.swing.ImageIcon;&lt;br /&gt;import javax.swing.JFrame;&lt;br /&gt;import javax.swing.JLabel;&lt;br /&gt;import javax.swing.WindowConstants;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public class LabelDinamico {&lt;br /&gt;&lt;br /&gt;public static void main(String[] args) {&lt;br /&gt;&lt;br /&gt; JFrame janela = new JFrame(&quot;Inserindo labels dinamicamente&quot;);&lt;br /&gt; janela.setBounds(0, 0, 500, 500);&lt;br /&gt; janela.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);&lt;br /&gt; janela.setLayout(null);&lt;br /&gt;&lt;br /&gt; //Códigos legais aqui...&lt;br /&gt;&lt;br /&gt; janela.setVisible(true);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Não temos nada demais aí. Alguns &lt;span style=&quot;font-style: italic;&quot;&gt;imports&lt;/span&gt;, uma classe com o método &lt;span style=&quot;font-style: italic;&quot;&gt;main,&lt;/span&gt; instanciamos e mostramos uma janela. Agora vamos aos códigos legais! Duas coisas básicas antes de inserir os labels:&lt;br /&gt;&lt;/div&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt; // Diretório contendo as imagens&lt;br /&gt; File diretorio = new File(&quot;C:\\imagens&quot;);&lt;br /&gt; File[] arquivos = diretorio.listFiles();&lt;br /&gt;&lt;br /&gt; // Posicionamento dos labels&lt;br /&gt; int boundX = 10; &lt;br /&gt; int boundY = 10;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Primeiro pegamos o caminho do diretório que contém as imagens a serem mostradas. Se esse diretório tiver outro tipo de arquivo que não seja imagem, serão mostrados espaços vazios. Seria interessante um filtro para mostrar somente imagens, mas isso fica pra depois. Então um vetor de arquivos contém a lista das imagens. Logo em seguida declaramos variáveis que vão auxiliar no posicionamento dos &lt;span style=&quot;font-style: italic;&quot;&gt;labels&lt;/span&gt;. Isso porque os&lt;span style=&quot;font-style: italic;&quot;&gt; labels&lt;/span&gt; deverão ficar em colunas e quando chegar na largura da janela, outra fila deverá ser formada. Você vai entender melhor adiante.&lt;br /&gt;Então finalmente teremos um pouco de ação! Veja como percorrer o vetor de arquivos e inserir as imagens na janela:&lt;br /&gt;&lt;/div&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt; // Adicionando labels dinamicamente&lt;br /&gt; for (int x = 0; x /* sinal de menor aqui */ arquivos.length; x++){&lt;br /&gt; &lt;br /&gt;  // Declara uma imagem com o arquivo na posição do vetor&lt;br /&gt;  final ImageIcon imagem = new ImageIcon(((File)arquivos[x]).getAbsolutePath());&lt;br /&gt; &lt;br /&gt;  // Declara o label&lt;br /&gt;  JLabel lbImagem = new JLabel()&lt;br /&gt;  // Esse bloco é para inserir a imagem&lt;br /&gt;  // e esticar de acordo com o tamanho label&lt;br /&gt;  {&lt;br /&gt;   public void paintComponent (Graphics g) {&lt;br /&gt;   super.paintComponent (g);&lt;br /&gt;    // Esses 5 sendo subtraídos é pra dar um espaço entre as imagens&lt;br /&gt;       g.drawImage (imagem.getImage(), 0, 0, getWidth() - 5, getHeight() - 5, null);&lt;br /&gt;   }&lt;br /&gt;  };&lt;br /&gt;&lt;br /&gt;  // Posiciona a imagem&lt;br /&gt;  lbImagem.setBounds(boundX, boundY, 70, 70);&lt;br /&gt; &lt;br /&gt;  // Seta o nome com o caminho da imagem&lt;br /&gt;  // Será usado depois para retornar o caminho quando clidado&lt;br /&gt;  lbImagem.setName(((File)arquivos[x]).getAbsolutePath());&lt;br /&gt;&lt;br /&gt;  // Adiciona um listener&lt;br /&gt;  lbImagem.addMouseListener(new MouseListener() {&lt;br /&gt;   public void mouseReleased(MouseEvent arg0) {}&lt;br /&gt;   public void mousePressed(MouseEvent arg0) {}&lt;br /&gt;   public void mouseExited(MouseEvent arg0) {}&lt;br /&gt;   public void mouseEntered(MouseEvent arg0) {}&lt;br /&gt;   public void mouseClicked(MouseEvent arg0) {&lt;br /&gt;   &lt;br /&gt;    // Pega o label que foi clicado&lt;br /&gt;    JLabel lb = (JLabel) arg0.getSource();&lt;br /&gt;    // Mosta o caminho da imagem clicada&lt;br /&gt;    JOptionPane.showMessageDialog(null, &quot;O caminho da imagem é &quot; + lb.getName(), &quot;Imagem&quot;, JOptionPane.INFORMATION_MESSAGE);&lt;br /&gt;   }&lt;br /&gt;  });&lt;br /&gt; &lt;br /&gt;  // Prepara a posição x do próximo label&lt;br /&gt;  boundX += 70;&lt;br /&gt; &lt;br /&gt;  // Verifica se estourou o limite&lt;br /&gt;  if (boundX /* sinal de maior ou igual aqui */ janela.getWidth() - 70)&lt;br /&gt;  {&lt;br /&gt;   // Desce uma fila&lt;br /&gt;   boundY += 70;&lt;br /&gt;   boundX = 10;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  //Adiciona o label&lt;br /&gt;  janela.add(lbImagem);&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;O código está bem comentado, mas ainda assim vou fazer mais algumas considerações:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Note que primeiramente percorremos o vetor dos arquivos utilizando um &lt;span style=&quot;font-style: italic;&quot;&gt;for&lt;/span&gt; (tive que retirar o sinal de menor pq o blogger não entende isso...)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Então inicialmente criamos um &lt;span style=&quot;font-style: italic;&quot;&gt;ImageIcon&lt;/span&gt; que contém a imagem do arquivo que está no vetor daquela posição.&lt;/li&gt;&lt;li&gt;Logo depois declaramos o &lt;span style=&quot;font-style: italic;&quot;&gt;label &lt;/span&gt;e utilizamos &lt;span style=&quot;font-style: italic;&quot;&gt;paintComponent&lt;/span&gt; para desenhar a imagem no &lt;span style=&quot;font-style: italic;&quot;&gt;label&lt;/span&gt;. Isto é usado para que a imagem fique do tamanho do label. A imagem será esticada (pra mais ou pra menos), para caber no &lt;span style=&quot;font-style: italic;&quot;&gt;label&lt;/span&gt;. &lt;/li&gt;&lt;li&gt;Em seguida é feito o posicionamento e a propriedade &lt;span style=&quot;font-style: italic;&quot;&gt;name&lt;/span&gt; é configurada com o caminho do arquivo. Isso é porque depois usaremos esta mesma propriedade para retornar o caminho quando a imagem for clicada. De outra forma não teria como saber qual imagem está desenhada no &lt;span style=&quot;font-style: italic;&quot;&gt;label&lt;/span&gt;. Poderíamos criar uma subclasse de &lt;span style=&quot;font-style: italic;&quot;&gt;label&lt;/span&gt; e adicionar uma ou mais propriedades adequadamente, mas deixaremos assim mesmo por enquanto.&lt;/li&gt;&lt;li&gt;Um &lt;span style=&quot;font-style: italic;&quot;&gt;listener&lt;/span&gt; é criado para mostrar a propriedade configurada anteriormente quando a imagem for clicada. Poderemos desejar fazer alguma coisa com isto depois.&lt;/li&gt;&lt;li&gt;Finalmente a posição é configurada, levando em conta o tamanho da janela. O &lt;span style=&quot;font-style: italic;&quot;&gt;label &lt;/span&gt;é adicionado na janela.&lt;/li&gt;&lt;/ul&gt;Vejamos como ficou:&lt;br /&gt;&lt;/div&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhglLSHafGthzpE5y4jaUm6zNOZzpvLd5O7io_jMvhOFgQOSmDKMyy21vXOmV5A9eAYR4peTl8AsJAtSi2YYdikFYUIBYNlVWftU7SfVRA_dfvDlCxarB9fkxoIB1sJgmqlPB_KPvwupbmp/s1600/labelsDinamicos.jpg&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 218px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhglLSHafGthzpE5y4jaUm6zNOZzpvLd5O7io_jMvhOFgQOSmDKMyy21vXOmV5A9eAYR4peTl8AsJAtSi2YYdikFYUIBYNlVWftU7SfVRA_dfvDlCxarB9fkxoIB1sJgmqlPB_KPvwupbmp/s400/labelsDinamicos.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5527529250905319330&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Outra coisa que podemos fazer é pegar todos os componentes da janela (no caso, os &lt;span style=&quot;font-style: italic;&quot;&gt;labels&lt;/span&gt;) e exibir suas propriedades ou modificar alguma coisa. Veja como fazer isto:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt; for (int x = 0; x /* sinal de menor aqui */ labels.length; x++){&lt;br /&gt;  if (labels[x] instanceof JLabel)&lt;br /&gt;  {&lt;br /&gt;   // Mostra todos o name dos labels&lt;br /&gt;   System.out.println(((JLabel)labels[x]).getName());&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Bom, é isso que eu tinha pra passar pra vocês hoje. O código completo você encontra &lt;a href=&quot;http://pastebin.com/73P652gN&quot;&gt;aqui&lt;/a&gt;. Sei que falta muita coisa ainda pra que esse código se torne um componente de verdade  e possa ser reutilizado mas o primeiro passo está dado. Espero que tenham gostado e até a próxima!</content><link rel='replies' type='application/atom+xml' href='http://marciosouzajunior.blogspot.com/feeds/1653764167098987430/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://marciosouzajunior.blogspot.com/2010/10/inserindo-labels-dinamicamente.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/1653764167098987430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/1653764167098987430'/><link rel='alternate' type='text/html' href='http://marciosouzajunior.blogspot.com/2010/10/inserindo-labels-dinamicamente.html' title='Inserindo labels dinamicamente'/><author><name>Márcio de Souza Júnior</name><uri>http://www.blogger.com/profile/01965624113971008303</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhglLSHafGthzpE5y4jaUm6zNOZzpvLd5O7io_jMvhOFgQOSmDKMyy21vXOmV5A9eAYR4peTl8AsJAtSi2YYdikFYUIBYNlVWftU7SfVRA_dfvDlCxarB9fkxoIB1sJgmqlPB_KPvwupbmp/s72-c/labelsDinamicos.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5856286885704734621.post-4067829803709308763</id><published>2010-10-12T18:55:00.000-03:00</published><updated>2010-10-12T19:39:01.414-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="html"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="js"/><title type='text'>Introdução ao JavaScript - Parte 2</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;Depois de algum tempo sem postar aqui, devido a projetos pessoais e faculdade, estou de volta para mostrar mais algumas coisas sobre &lt;span style=&quot;font-style: italic;&quot;&gt;JavaScript&lt;/span&gt; como havia prometido. Então vamos lá!&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;O Objeto document&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Document&lt;/span&gt; é um objeto usado para modificar ou obter propriedades da página que está sendo exibida. Ele é um container com todos objetos que estão na página HTML.&lt;br /&gt;Vamos começar com um simples exemplo de como esse objeto pode ser usado:&lt;br /&gt;&lt;/div&gt;&lt;pre name=&quot;code&quot; class=&quot;javascript&quot;&gt;&lt;br /&gt;&lt;script&gt;&lt;br /&gt; document.write(&quot;Estamos em &quot; + document.location);&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Neste exemplo usamos o método &lt;i&gt;write&lt;/i&gt; e a propriedade &lt;i&gt;location&lt;/i&gt; de &lt;span style=&quot;font-style: italic;&quot;&gt;document&lt;/span&gt; para escrever na página e mostrar qual a atual URL sendo exibida.&lt;br /&gt;Outro caso simples de uso seria para alterar a cor de fundo da página:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;javascript&quot;&gt;&lt;br /&gt;&lt;script&gt;&lt;br /&gt; document.bgColor = &quot;gray&quot;;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Obviamente o objeto &lt;span style=&quot;font-style: italic;&quot;&gt;document&lt;/span&gt; possui muitos outros métodos e propriedades, mas não vou abordar todos aqui, caso queira saber mais entre &lt;a href=&quot;http://www.w3schools.com/jsref/dom_obj_document.asp&quot;&gt;aqui&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Outros objetos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Existem outros objetos que também são importantes no &lt;span style=&quot;font-style: italic;&quot;&gt;JavaScript&lt;/span&gt;:&lt;br /&gt;&lt;ul style=&quot;font-style: italic;&quot;&gt;&lt;li&gt;Window&lt;/li&gt;&lt;li&gt;    Navigator&lt;/li&gt;&lt;li&gt;    Screen&lt;/li&gt;&lt;li&gt;    History&lt;/li&gt;&lt;li&gt;    Location&lt;/li&gt;&lt;/ul&gt;Uma propriedade do objeto &lt;span style=&quot;font-style: italic;&quot;&gt;navigator&lt;/span&gt; muito utilizada serve para retornar o navegador utilizado:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;javascript&quot;&gt;&lt;br /&gt;&lt;script&gt;&lt;br /&gt; document.write(&quot;Você está usando &quot; + navigator.appname);&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href=&quot;http://www.w3schools.com/jsref/default.asp&quot;&gt;Aqui&lt;/a&gt; segue uma boa referência dos objetos usados no &lt;span style=&quot;font-style: italic;&quot;&gt;JavaScript&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Semelhanças entre &lt;span style=&quot;font-style: italic;&quot;&gt;Java&lt;/span&gt;&lt;/span&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;e &lt;span style=&quot;font-style: italic;&quot;&gt;JavaScript&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Esse tópico não é sobre características nem finalidades das linguagens, mas sim sobre semelhanças em sua sintaxe. Vamos começar com os operadores.&lt;br /&gt;Os operadores no &lt;span style=&quot;font-style: italic;&quot;&gt;Java&lt;/span&gt; são praticamente os mesmos do &lt;span style=&quot;font-style: italic;&quot;&gt;JavaScript&lt;/span&gt;:&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Aritméticos: +, -, *, /, %, ++, --&lt;/li&gt;&lt;li&gt;Atribuição: +=, -=, *=, /=, %=&lt;/li&gt;&lt;li&gt;Comparação: ==, !=, &gt;, &gt;=, &lt;, &lt;= &lt;/li&gt;&lt;li&gt;Lógicos: &amp;amp;&amp;amp;, ||, !  &lt;/li&gt;&lt;/ul&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;JavaScript&lt;/span&gt; não suporta o operador &lt;span style=&quot;font-style: italic;&quot;&gt;instanceof&lt;/span&gt;. Outra coisa importante sobre operadores é que &lt;span style=&quot;font-style: italic;&quot;&gt;strings&lt;/span&gt; devem ser comparadas utilizando ==, veja: &lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;javascript&quot;&gt;&lt;br /&gt;&lt;script&gt;&lt;br /&gt; x = null;&lt;br /&gt; x1 = &quot;texto&quot;;&lt;br /&gt;&lt;br /&gt; if (x == null &amp;&amp; x1 == &quot;texto&quot;)&lt;br /&gt;  document.write(&quot;true&quot;);&lt;br /&gt; else&lt;br /&gt;  document.write(&quot;false&quot;);&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;O resultado é &lt;span style=&quot;font-style: italic;&quot;&gt;true&lt;/span&gt;. Porém se uma &lt;span style=&quot;font-style: italic;&quot;&gt;string&lt;/span&gt; for inicializada assim:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;javascript&quot;&gt;&lt;br /&gt;var x2 = new String(&quot;teste&quot;);&lt;br /&gt;var x3 = new String(&quot;teste&quot;);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;A comparação deve ser feita deste modo:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;javascript&quot;&gt;&lt;br /&gt;if(x2.toString() == x3.toString())&lt;br /&gt; document.write(&quot;true&quot;);&lt;br /&gt;else&lt;br /&gt; document.write(&quot;false&quot;);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Achei essa dica &lt;a href=&quot;http://jsdev.blogspot.com/2006/09/strings-e-expresses-regulares.html&quot;&gt;aqui...&lt;/a&gt;&lt;br /&gt;Com isso também podemos ver que a estrutura de comparação &lt;span style=&quot;font-style: italic;&quot;&gt;if&lt;/span&gt; é a mesma nas duas linguagens.&lt;br /&gt;&lt;br /&gt;Agora vamos para a estrutura de seleção&lt;span style=&quot;font-style: italic;&quot;&gt; switch&lt;/span&gt;:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;javascript&quot;&gt;&lt;br /&gt;switch (variável)&lt;br /&gt;{&lt;br /&gt; case &#39;valor 1&#39;: &lt;br /&gt; {&lt;br /&gt;  //bloco de comandos;&lt;br /&gt;  break;&lt;br /&gt; }&lt;br /&gt; case &#39;valor2&#39;:&lt;br /&gt; {&lt;br /&gt;  //bloco de comandos;&lt;br /&gt;  break;&lt;br /&gt; }&lt;br /&gt; default:&lt;br /&gt; {&lt;br /&gt;  //comando alternativo;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Aqui temos uma estrutura básica. Temos duas diferenças da linguagem &lt;span style=&quot;font-style: italic;&quot;&gt;Java&lt;/span&gt;. Uma são as chaves entre os blocos e outra é o tipo de dados. No &lt;span style=&quot;font-style: italic;&quot;&gt;Java&lt;/span&gt; o &lt;span style=&quot;font-style: italic;&quot;&gt;switch&lt;/span&gt; trabalha com os tipos primitivos&lt;span style=&quot;font-style: italic;&quot;&gt; byte, short, char&lt;/span&gt;, e&lt;span style=&quot;font-style: italic;&quot;&gt; int&lt;/span&gt; (existem algumas exceções mas basicamente é isso). Já no &lt;span style=&quot;font-style: italic;&quot;&gt;JavaScript&lt;/span&gt; podemos trabalhar com &lt;span style=&quot;font-style: italic;&quot;&gt;strings&lt;/span&gt; também. Continuando o exemplo anterior:&lt;br /&gt;&lt;/div&gt;&lt;pre name=&quot;code&quot; class=&quot;javascript&quot;&gt;&lt;br /&gt;switch (x1)&lt;br /&gt;{&lt;br /&gt; case &#39;texto&#39;: &lt;br /&gt; {&lt;br /&gt;  document.write(&quot;Ok!&quot;);&lt;br /&gt;  break;&lt;br /&gt; }&lt;br /&gt; case &#39;valor&#39;:&lt;br /&gt; {&lt;br /&gt;  //bloco de comandos;&lt;br /&gt;  break;&lt;br /&gt; }&lt;br /&gt; default:&lt;br /&gt; {&lt;br /&gt;  document.write(&quot;Nenhum!&quot;);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Veja também que tanto faz usar aspas simples ou duplas. Outra coisa é que os comentários podem ser feitos da mesma forma que o &lt;span style=&quot;font-style: italic;&quot;&gt;Java&lt;/span&gt; (//... ou /* ... */ ).&lt;br /&gt;&lt;br /&gt;Agora vamos para estruturas de repetição. No &lt;span style=&quot;font-style: italic;&quot;&gt;JavaScript&lt;/span&gt; temos 3 tipos delas,&lt;span style=&quot;font-style: italic;&quot;&gt; for, while&lt;/span&gt; e &lt;span style=&quot;font-style: italic;&quot;&gt;do while&lt;/span&gt;. Alguns dizem que são 4 estruturas, contando que existem 2 tipos de &lt;span style=&quot;font-style: italic;&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;font-style: italic;&quot;&gt;for&lt;/span&gt; normal e &lt;span style=&quot;font-style: italic;&quot;&gt;for in&lt;/span&gt;). Exceto o &lt;span style=&quot;font-style: italic;&quot;&gt;for in&lt;/span&gt;, as outras funcionam da mesma forma nas duas linguagens:&lt;br /&gt;&lt;/div&gt;&lt;pre name=&quot;code&quot; class=&quot;javascript&quot;&gt;&lt;br /&gt;&lt;script&gt;&lt;br /&gt;&lt;br /&gt;// Exemplo de for normal&lt;br /&gt;&lt;br /&gt;var i = 0;&lt;br /&gt;for (i = 0; i &lt;= 5; i++)&lt;br /&gt;{&lt;br /&gt; document.write(i + &quot;, &quot;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Exemplo de while&lt;br /&gt;&lt;br /&gt;var i = 0;&lt;br /&gt;while (i &lt;= 5)&lt;br /&gt;{&lt;br /&gt; document.write(i + &quot;, &quot;);&lt;br /&gt; i++;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Exemplo de do while&lt;br /&gt;&lt;br /&gt;var i = 0;&lt;br /&gt;do&lt;br /&gt;{&lt;br /&gt; document.write(i + &quot;, &quot;);&lt;br /&gt; i++;&lt;br /&gt;}&lt;br /&gt;while (i &lt;= 5);&lt;br /&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Assim como no &lt;span style=&quot;font-style: italic;&quot;&gt;Java&lt;/span&gt;, o &lt;span style=&quot;font-style: italic;&quot;&gt;JavaScript&lt;/span&gt; também aceita as instruções &lt;span style=&quot;font-style: italic;&quot;&gt;break&lt;/span&gt; e &lt;span style=&quot;font-style: italic;&quot;&gt;continue&lt;/span&gt;.&lt;br /&gt;Agora o &lt;span style=&quot;font-style: italic;&quot;&gt;for in&lt;/span&gt;. O &lt;span style=&quot;font-style: italic;&quot;&gt;for in&lt;/span&gt; funciona como o &lt;span style=&quot;font-style: italic;&quot;&gt;for each&lt;/span&gt; do&lt;span style=&quot;font-style: italic;&quot;&gt; Java&lt;/span&gt;. Temos um &lt;span style=&quot;font-style: italic;&quot;&gt;array&lt;/span&gt; com elementos e usamos o &lt;span style=&quot;font-style: italic;&quot;&gt;for in&lt;/span&gt; para percorrê-lo:&lt;br /&gt;&lt;/div&gt;&lt;pre name=&quot;code&quot; class=&quot;javascript&quot;&gt;&lt;br /&gt;var x;&lt;br /&gt;var carros = new Array();&lt;br /&gt;carros[0] = &quot;Ferrari&quot;;&lt;br /&gt;carros[1] = &quot;Lamborghini&quot;;&lt;br /&gt;carros[2] = &quot;Porsche&quot;;&lt;br /&gt;&lt;br /&gt;for (x in carros)&lt;br /&gt;{&lt;br /&gt; document.write(carros[x] + &quot;&lt;br&gt;&quot;);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Conclusão&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Finalizo essa introdução ao &lt;span style=&quot;font-style: italic;&quot;&gt;JavaScript&lt;/span&gt; e espero que possam ter tirado algum proveito das informações contidas aqui. Sei que é pouca coisa mas dá pra começar. Tem um site muito bom que tenho usado como referência: &lt;a href=&quot;http://www.w3schools.com/js/default.asp&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;w3schools&lt;/span&gt;&lt;/a&gt;. Esse site tem muito conteúdo, não so de &lt;span style=&quot;font-style: italic;&quot;&gt;JavaScript&lt;/span&gt; mas outras linguagens também.&lt;br /&gt;&lt;br /&gt;Bons estudos!</content><link rel='replies' type='application/atom+xml' href='http://marciosouzajunior.blogspot.com/feeds/4067829803709308763/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://marciosouzajunior.blogspot.com/2010/10/introducao-ao-javascript-parte-2.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/4067829803709308763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/4067829803709308763'/><link rel='alternate' type='text/html' href='http://marciosouzajunior.blogspot.com/2010/10/introducao-ao-javascript-parte-2.html' title='Introdução ao JavaScript - Parte 2'/><author><name>Márcio de Souza Júnior</name><uri>http://www.blogger.com/profile/01965624113971008303</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5856286885704734621.post-425076713028864016</id><published>2010-08-23T10:08:00.000-03:00</published><updated>2010-08-23T12:25:44.779-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="html"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="js"/><title type='text'>Introdução ao JavaScript - Parte 1</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;Hoje teremos um post sobre &lt;span style=&quot;font-style: italic;&quot;&gt;JavaScript&lt;/span&gt; pra variar um pouco. Farei este post em duas partes. Na primeira vou fazer uma introdução sobre a linguagem dando alguns conteitos básicos e também falarei sobre variáveis e eventos. Na próxima parte teremos objetos importantes, suas propriedades e também sobre semelhanças com a linguagem &lt;span style=&quot;font-style: italic;&quot;&gt;Java&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;O que é &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-weight: bold;&quot;&gt;JavaScript&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;? &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;De acordo com a famosa enciclopédia digital &lt;span style=&quot;font-style: italic;&quot;&gt;&quot;JavaScript é uma linguagem de programação criada por Brendan Eich para a Netscape em 1995, que a princípio se chamava LiveScript. A Netscape, após o sucesso inicial desta linguagem, recebeu uma colaboração considerável da Sun, a qual possibilitou posteriormente dizer que o JavaScript é uma linguagem compatível com a linguagem Java, por esta razão, a semelhança dos nomes.&quot;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;Pontos importantes sobre &lt;span style=&quot;font-style: italic;&quot;&gt;JavaScript&lt;/span&gt; quanto aos tipos:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;fraca - sua tipagem é mutável;&lt;/li&gt;&lt;li&gt;dinâmica - uma variável pode assumir vários tipos diferentes durante a execução;&lt;/li&gt;&lt;li&gt;implícita - as variáveis são declaradas sem tipo.&lt;/li&gt;&lt;/ul&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Porque usar &lt;span style=&quot;font-style: italic;&quot;&gt;JavaScript&lt;/span&gt;? &lt;span style=&quot;font-style: italic;&quot;&gt;JavaScript&lt;/span&gt; permite tornar páginas HTML mais dinâmicas. Usamos a linguagem para interagir com a página, validar formulários, etc. Vamos ao que interessa.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;10 Perguntas básicas sobre JavaScript&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Estas perguntas foram baseadas num quiz disponível &lt;a href=&quot;http://www.w3schools.com/js/js_quiz.asp&quot;&gt;aqui&lt;/a&gt;. É necessário obter 100% pra dizer que se tem um conhecimento básico sobre &lt;span style=&quot;font-style: italic;&quot;&gt;JavaScript&lt;/span&gt;.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;1. Qual elemento é utilizado para os scripts?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Em uma página HTML colocamos os códigos &lt;span style=&quot;font-style: italic;&quot;&gt;JavaScript&lt;/span&gt; dentro de tags &lt;span style=&quot;font-style: italic;&quot;&gt;script&lt;/span&gt;, como mostra o exemplo:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;html&quot;&gt;&lt;br /&gt;&lt;script&gt;//script aqui&lt;/script&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;2. Qual é o lugar correto para inserir JavaScript?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Os&lt;span style=&quot;font-style: italic;&quot;&gt; scripts&lt;/span&gt; podem ser inseridos tanto no cabeçalho(&lt;span style=&quot;font-style: italic;&quot;&gt;head&lt;/span&gt;) quanto no corpo(&lt;span style=&quot;font-style: italic;&quot;&gt;body&lt;/span&gt;) da página.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;3. Qual a sintaxe para fazer referência a um script externo?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Scripts&lt;/span&gt; externos devem ser salvos com a extenção &lt;span style=&quot;font-style: italic;&quot;&gt;js&lt;/span&gt; e podem ser referenciados utilizando o parâmetro &lt;span style=&quot;font-style: italic;&quot;&gt;src&lt;/span&gt;:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;html&quot;&gt;&lt;br /&gt;&lt;script src=&quot;nome_do_arquivo.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;4. Arquivos JavaScript externos precisam ter a tag script?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Não, somente códigos.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;5. Como escrever um texto na página?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para escrever na página usa-se &lt;span style=&quot;font-style: italic;&quot;&gt;document.write&lt;/span&gt;:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;javascript&quot;&gt;&lt;br /&gt;document.write(&quot;Hello World&quot;);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;6. Como mostrar mensagens utilizando uma caixa de alerta?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Mensagens podem ser exibidas numa caixa de alerta simplesmente chamando:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;javascript&quot;&gt;&lt;br /&gt;alert(&quot;Hello World&quot;);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;7. Como criar uma função?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Funções podem ser criadas utilizando a palavra &lt;span style=&quot;font-style: italic;&quot;&gt;function&lt;/span&gt;, veja:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;javascript&quot;&gt;&lt;br /&gt;function myFunction()&lt;br /&gt;{&lt;br /&gt;//Códigos da função&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;8. Como chamar uma função?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Funções podem ser chamadas simplesmente digitando seu nome:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;javascript&quot;&gt;&lt;br /&gt;myFunction()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;9. Como abrir uma janela?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pode-se abrir uma janela chamando &lt;span style=&quot;font-style: italic;&quot;&gt;window.open&lt;/span&gt;:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;javascript&quot;&gt;&lt;br /&gt;window.open(&quot;http://marciosouzajunior.blogspot.com&quot;);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;10. Como colocar uma mensagem de status no navegador?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Mensagens de status são uma propriedade do objeto&lt;span style=&quot;font-style: italic;&quot;&gt; window&lt;/span&gt; e podem ser modificadas diretamente:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;javascript&quot;&gt;&lt;br /&gt;window.status = &quot;Mensagem&quot;;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Obviamente existe muito mais sobre &lt;span style=&quot;font-style: italic;&quot;&gt;JavaScript&lt;/span&gt; que você deveria saber. Essas perguntinhas foram apenas pra você poder falar com os amigos que sabe alguma coisa de &lt;span style=&quot;font-style: italic;&quot;&gt;JavaScript&lt;/span&gt;. E também se algum dia for fazer uma prova que caia &lt;span style=&quot;font-style: italic;&quot;&gt;JavaScript&lt;/span&gt;, não passe em branco. Vamos ver outras coisas importantes agora.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Variáveis&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;JavaScript&lt;/span&gt; possui 3 tipos de dados: número, caractere e booleano. Não tem segredo. Como já foi dito, as variáveis podem ser declaradas sem um tipo específico. A simples associação de um valor faz com que a variável passe a existir:&lt;br /&gt;&lt;/div&gt;&lt;pre name=&quot;code&quot; class=&quot;javascript&quot;&gt;&lt;br /&gt;x = 2;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;E seu tipo pode mudar como quiser:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;javascript&quot;&gt;&lt;br /&gt;var x = 2;&lt;br /&gt;alert(x);&lt;br /&gt;x = &quot;texto&quot;;&lt;br /&gt;alert(x);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Usar a palavra &lt;span style=&quot;font-style: italic;&quot;&gt;var&lt;/span&gt; é opcional. Usamos apenas quando queremos declarar a variável sem um valor inicial. Se fizermos isto o seu valor será &lt;span style=&quot;font-style: italic;&quot;&gt;undefined&lt;/span&gt;. Também podemos associar um valor &lt;span style=&quot;font-style: italic;&quot;&gt;null&lt;/span&gt;, que é quase a mesma coisa que &lt;span style=&quot;font-style: italic;&quot;&gt;undefined&lt;/span&gt;.&lt;br /&gt;Não tem muito o que falar sobre variáveis em &lt;span style=&quot;font-style: italic;&quot;&gt;JavaScript&lt;/span&gt;, os criadores da linguagem deixaram as coisas bem simples de trabalhar.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Eventos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Eventos são coisas que podem acontecer durante a execução de um programa (neste caso da página). Um clique de mouse, uma caixa que perde o foco, são eventos que podem ocorrer a qualquer momento. Podemos desejar que esses eventos disparem alguma ação. Logo abaixo temos uma lista de eventos que o &lt;span style=&quot;font-style: italic;&quot;&gt;JavaScript&lt;/span&gt; pode capturar e quando eles acontecem:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;onLoad&lt;/span&gt;: Quando a página é carregada.&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;onUnload&lt;/span&gt;: Quando a página é fechada.&lt;/li&gt;&lt;/ul&gt;Esses dois eventos só ocorrem no&lt;span style=&quot;font-style: italic;&quot;&gt; body&lt;/span&gt;, portanto poderiam chamar alguma ação da seguinte forma:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;html&quot;&gt;&lt;br /&gt;&lt;_body onload=&quot;alert(&#39;Oi&#39;);&quot;&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Todos sabemos que&lt;span style=&quot;font-style: italic;&quot;&gt; body&lt;/span&gt; não tem &lt;span style=&quot;font-style: italic;&quot;&gt;underline&lt;/span&gt;, mas sou obrigado a escrever assim porque mais uma vez o &lt;span style=&quot;font-style: italic;&quot;&gt;blogger&lt;/span&gt; está confundindo as coisas. Espero que todos tenham entendido. Continuando...Agora vamos ver 3 eventos que podem ocorrer em objetos &lt;span style=&quot;font-style: italic;&quot;&gt;text, select&lt;/span&gt; e &lt;span style=&quot;font-style: italic;&quot;&gt;textarea&lt;/span&gt;:&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;onChange&lt;/span&gt;: Acontece quando o objeto perde o foco e houve mudança de conteúdo.&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;onBlur&lt;/span&gt;: Acontece quando o objeto perde o foco, independente de ter mudado o conteúdo.&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;onFocus&lt;/span&gt;: Quando o objeto ganha o foco.&lt;/li&gt;&lt;/ul&gt;Aqui temos um exemplo:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;html&quot;&gt;&lt;br /&gt;&lt;input name=&quot;nome&quot; onchange=&quot;alert(&#39;Perdeu o foco e houve mudança no conteúdo&#39;);&quot; type=&quot;text&quot;&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;O próximo evento pode ser usado para &lt;span style=&quot;font-style: italic;&quot;&gt;text&lt;/span&gt; e &lt;span style=&quot;font-style: italic;&quot;&gt;textarea&lt;/span&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;onSelect&lt;/span&gt;: Ocorre quando seleciona parte ou todo texto do objeto.&lt;/li&gt;&lt;/ul&gt;Os próximos eventos tem a ver com o mouse:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;onClick&lt;/span&gt;: Quando o objeto é clicado. Pode acontecer nos objetos &lt;span style=&quot;font-style: italic;&quot;&gt;button, checkbox, radio, link, reset &lt;/span&gt;e &lt;span style=&quot;font-style: italic;&quot;&gt;submit&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;onMouseOver&lt;/span&gt;: Quando passa o mouse sobre o objeto.&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;onSubmit&lt;/span&gt;: Quando clica no botão &lt;span style=&quot;font-style: italic;&quot;&gt;submit&lt;/span&gt;. Váido somente para &lt;span style=&quot;font-style: italic;&quot;&gt;forms&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;Exemplo:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;html&quot;&gt;&lt;br /&gt;&lt;a href=&quot;http://marciosouzajunior.blogspot.com/&quot; onmouseover=&quot;alert(&#39;Passou o mouse..&#39;);&quot;&gt; Blog do Márcio &lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Certamente numa prova de &lt;span style=&quot;font-style: italic;&quot;&gt;JavaScript&lt;/span&gt; teria pelo menos uma questão sobre esses eventos.  Principalmente sobre o evento &lt;span style=&quot;font-style: italic;&quot;&gt;onBlur&lt;/span&gt;, porque facilmente alguém acreditaria que um suposto evento &lt;span style=&quot;font-style: italic;&quot;&gt;onLostFocus&lt;/span&gt; estaria certo.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Fim da Parte 1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Bom, ficamos por aqui com esta introdução ao &lt;span style=&quot;font-style: italic;&quot;&gt;JavaScript&lt;/span&gt;. Espero que você possa ter tirado algum proveito do material. Em breve teremos a segunda parte com mais informações sobre os objetos &lt;span style=&quot;font-style: italic;&quot;&gt;document&lt;/span&gt;, &lt;span style=&quot;font-style: italic;&quot;&gt;window&lt;/span&gt; e também sobre semelhanças com a o &lt;span style=&quot;font-style: italic;&quot;&gt;Java&lt;/span&gt;.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Bons estudos!</content><link rel='replies' type='application/atom+xml' href='http://marciosouzajunior.blogspot.com/feeds/425076713028864016/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://marciosouzajunior.blogspot.com/2010/08/introducao-hoje-teremos-um-post-sobre.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/425076713028864016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/425076713028864016'/><link rel='alternate' type='text/html' href='http://marciosouzajunior.blogspot.com/2010/08/introducao-hoje-teremos-um-post-sobre.html' title='Introdução ao JavaScript - Parte 1'/><author><name>Márcio de Souza Júnior</name><uri>http://www.blogger.com/profile/01965624113971008303</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5856286885704734621.post-6726604143357935437</id><published>2010-08-13T17:03:00.000-03:00</published><updated>2012-07-06T10:42:52.200-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="enum"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="scjp"/><title type='text'>Enums - Java</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
Enums são um tipo de classe Java que quase nunca utilizamos. Acredito que muita gente nem imagina que  esse tipo de classe existe. Diferente de classes comuns e interfaces, o &lt;span style=&quot;font-style: italic;&quot;&gt;Enum &lt;/span&gt;foi inserido na versão 5 do Java. Ele permitie enumerar uma quantidade de valores pré-definidos que podem ser aceitos para uma variável.&lt;br /&gt;
Vamos a um exemplo prático. Precisamos de uma variável que só aceite 3 valores: maçã, pera e uva. Então declaramos:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;enum Frutas { MAÇÃ, PERA, UVA }; //É opcional colocar ponto-e-vírgula&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;i&gt;Obs.: Por convenção as constantes são escritas em maiúsculas.&lt;/i&gt;
Um &lt;span style=&quot;font-style: italic;&quot;&gt;Enum&lt;/span&gt; é constituido basicamente por suas constantes, mas logo veremos que podem existir outras coisas a mais. Eles &lt;b&gt;podem ser declarados como membro de uma classe ou fora da classe, mas nunca dentro de métodos (inclusive o &lt;i&gt;main&lt;/i&gt;)&lt;/b&gt;. Outro ponto importante é que os &lt;span style=&quot;font-style: italic;&quot;&gt;Enums&lt;/span&gt; só aceitam os modificadores &lt;span style=&quot;font-style: italic;&quot;&gt;default&lt;/span&gt; e &lt;span style=&quot;font-style: italic;&quot;&gt;public&lt;/span&gt; (não aceita &lt;span style=&quot;font-style: italic;&quot;&gt;private, protected, final, abstract&lt;/span&gt; nem &lt;span style=&quot;font-style: italic;&quot;&gt;static&lt;/span&gt;). Veja um exemplo de declaração fora da classe:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;enum Frutas { MAÇÃ, PERA, UVA }

public class Run {

 Frutas tipo; //Run tem uma variável de instância do tipo Frutas

 public static void main(String[] args) {
 
     Run r = new Run();
     r.tipo = Frutas.MAÇÃ;
 
 }
}&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-style: italic;&quot;&gt;Enums&lt;/span&gt; não são do tipo &lt;span style=&quot;font-style: italic;&quot;&gt;String&lt;/span&gt; ou de outro tipo. Eles são do seu próprio tipo, neste caso &lt;span style=&quot;font-style: italic;&quot;&gt;Frutas&lt;/span&gt;. &lt;span style=&quot;font-style: italic;&quot;&gt;MAÇÃ, PERA&lt;/span&gt; ou &lt;span style=&quot;font-style: italic;&quot;&gt;UVA&lt;/span&gt; são tipos de &lt;span style=&quot;font-style: italic;&quot;&gt;Frutas&lt;/span&gt;. Se fizermos o teste:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;if (Frutas.MAÇÃ instanceof Frutas)
 System.out.println(&quot;Maçã é do tipo Fruta&quot;);&lt;/pre&gt;
O resultado será: &lt;span style=&quot;font-style: italic;&quot;&gt;Maçã é do tipo Fruta&lt;/span&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Então sabemos o que são&lt;span style=&quot;font-style: italic;&quot;&gt; Enums&lt;/span&gt;, como e onde declará-los. E também sabemos que por ser uma classe, tem seu próprio tipo. Agora vamos ver umas coisas mais interessantes.&lt;/div&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Construtores, Métodos e Variáveis em um Enum&lt;/span&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Como os &lt;span style=&quot;font-style: italic;&quot;&gt;Enums&lt;/span&gt; são um tipo especial de classe, eles podem ter construtores, variáveis e até um corpo de classe para as constantes (mais adiante explico o que é essa coisa bizarra).  Vamos ver como funcionam esses membros passando um parâmetro para cada constante:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt; MAÇÃ(&quot;vermelha&quot;), PERA(&quot;verde&quot;), UVA(&quot;roxa&quot;);&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Cada tipo de fruta agora recebe um parâmetro do tipo &lt;span style=&quot;font-style: italic;&quot;&gt;String&lt;/span&gt;, como numa chamada de método normal (poderíamos ter outros tipos, dependendo do construtor). De acordo com os argumentos, neste caso teríamos o seguinte construtor:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt; Frutas(String cor){
     this.Cor = cor;
 }&lt;/pre&gt;
Sendo assim, devemos ter uma variável de instância para receber a cor:&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt; private String Cor;&lt;/pre&gt;
E ainda um método para retornar a cor da fruta escolhida:&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt; void getCor(){
     System.out.println(&quot;A cor da fruta escolhida é &quot; + Cor);
 }&lt;/pre&gt;
O &lt;span style=&quot;font-style: italic;&quot;&gt;Enum&lt;/span&gt; completo ficaria assim:&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;enum Frutas {

 //Passando parâmetros a cada constante
 MAÇÃ(&quot;vermelha&quot;), PERA(&quot;verde&quot;), UVA(&quot;roxa&quot;);

 //Construtor
 Frutas(String cor){
     this.Cor = cor;
 }
 //Variavel de instância
 private String Cor;

 //Método que mostra a cor da fruta escolhida
 void getCor(){
     System.out.println(&quot;A fruta escolhida é &quot; + Cor);
 }

}&lt;/pre&gt;
Observe que quando temos mais membros além das constantes é obrigatório o ponto-e-vírgula após as constantes.&lt;br /&gt;
Agora modifique a classe &lt;span style=&quot;font-style: italic;&quot;&gt;Run&lt;/span&gt; para que fique parecida com esta:&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;public class Run {

 Frutas nome;

 public static void main(String[] args) {
 
     Run r = new Run();
     r.nome = Frutas.MAÇÃ;
     r.nome.getCor();
 }
}&lt;/pre&gt;
A saída será: &lt;span style=&quot;font-style: italic;&quot;&gt;A fruta escolhida é vermelha&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Sobre o construtor do &lt;span style=&quot;font-style: italic;&quot;&gt;Enum&lt;/span&gt; devemos saber que ele nunca poderá ser invocado diretamente. Ele só pode ser chamado pelo próprio &lt;span style=&quot;font-style: italic;&quot;&gt;Enum&lt;/span&gt;, ou melhor, por cada constante. Os construtores também podem ser sobrecarregados, como no exemplo:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt; MAÇÃ(&quot;vermelha&quot;), PERA(&quot;verde&quot;), UVA(&quot;roxa&quot;, &quot;verde&quot;);

 Frutas(String cor){
     this.Cor = cor;
 }
 //Construtor sobrecarregado
 Frutas(String cor, String cor2){
 }&lt;/pre&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Corpo de Classe específico da constante&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Como eu mencionei anteriormente, os &lt;span style=&quot;font-style: italic;&quot;&gt;Enums&lt;/span&gt; podem possuir uma coisa estranha chamada &lt;span style=&quot;font-style: italic;&quot;&gt;corpo de classe específico da constant&lt;/span&gt;e. Esse corpo é um bloco de código que podemos definir para cada constante. Usamos esse corpo para substituir um método definido dentro do &lt;span style=&quot;font-style: italic;&quot;&gt;Enum&lt;/span&gt;. Vamos ver na prática:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;enum Frutas {

 MAÇÃ,
 PERA,
 UVA{
     //Corpo da constante UVA
     //Códigos legais aqui...
 };

 void getFoo(){
     System.out.println(&quot;Frutas são saudáveis.&quot;);
 }

}&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Observe que se chamarmos por&lt;span style=&quot;font-style: italic;&quot;&gt; r.nome.getFoo()&lt;/span&gt;, independente de qual fruta tenha sido escolhida, sempre teremos a saída: &lt;span style=&quot;font-style: italic;&quot;&gt;Frutas são saudáveis&lt;/span&gt;. Porém agora vamos sobrescrever o método dentro do corpo da constante &lt;span style=&quot;font-style: italic;&quot;&gt;UVA&lt;/span&gt;:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;enum Frutas {

 MAÇÃ,
 PERA,
 UVA{
     void getFoo(){
         System.out.println(&quot;BAD FRUIT!!!&quot;);
     }
 };

 void getFoo(){
     System.out.println(&quot;Frutas são saudáveis.&quot;);
 }

}&lt;/pre&gt;
E então chamamos:&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;     r.nome = Frutas.UVA;
     r.nome.getFoo();&lt;/pre&gt;
A saída será: &lt;span style=&quot;font-style: italic;&quot;&gt;BAD FRUIT!!!&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Ok, mas pra que fazer isso? Imagine que todos os elementos do&lt;span style=&quot;font-style: italic;&quot;&gt; Enum&lt;/span&gt; tenham uma propriedade, um código por exemplo. Mas um determinado elemento não pode ter aquele código. Então usamos o corpo da constante para definir um comportamento especial pra ele. É realmente difícil imaginar uma aplicação para isso, mas apenas saiba como funciona que será o bastante para passar no exame! E por hoje é só.&lt;/div&gt;
Bons estudos!</content><link rel='replies' type='application/atom+xml' href='http://marciosouzajunior.blogspot.com/feeds/6726604143357935437/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://marciosouzajunior.blogspot.com/2010/08/enums-java.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/6726604143357935437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/6726604143357935437'/><link rel='alternate' type='text/html' href='http://marciosouzajunior.blogspot.com/2010/08/enums-java.html' title='Enums - Java'/><author><name>Márcio de Souza Júnior</name><uri>http://www.blogger.com/profile/01965624113971008303</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5856286885704734621.post-1821360964282764142</id><published>2010-08-11T11:40:00.000-03:00</published><updated>2010-08-11T16:45:26.874-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="dinâmico"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="lookandfeel"/><category scheme="http://www.blogger.com/atom/ns#" term="menu"/><title type='text'>Menu Dinâmico - Java</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;Olá! Hoje vou mostrar como implementar um menu dinâmico. Na verdade eu usei esta aplicação para gerar um menu com todos os &lt;span style=&quot;font-style: italic;&quot;&gt;LookAndFeels&lt;/span&gt; disponíveis. Criar menus ou qualquer outro tipo de objeto dinâmico significa que ele é criado em tempo de execução. Mas pra que fazer isso? Por exemplo, num sistema &lt;span style=&quot;font-style: italic;&quot;&gt;ERP&lt;/span&gt; cada usuário tem um nível de acesso, então dependendo de quem logar no sistema, determinados itens no menu estarão disponíveis ou não. O sistema verifica no banco de dados quais as permissões daquele usuário e monta o menu em tempo de execução.&lt;br /&gt;Mas no exemplo que vou mostrar não usa banco de dados, mas seria interessante implementar alguma forma de salvar o &lt;span style=&quot;font-style: italic;&quot;&gt;LookAndFeel&lt;/span&gt; selecionado. Porque fazer isto dinamicamente? Neste caso o menu teria que ser dinâmico porque os &lt;span style=&quot;font-style: italic;&quot;&gt;LookAndFeels&lt;/span&gt; podem ser instalados ou removidos da &lt;span style=&quot;font-style: italic;&quot;&gt;JRE&lt;/span&gt;.&lt;br /&gt;Também vou mostrar como escrever um &lt;span style=&quot;font-style: italic;&quot;&gt;ActionListener&lt;/span&gt; que será usado ao acionar os eventos dos itens no menu.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Utilizando LookAndFeels&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Antes de mais nada vamos fazer os seguintes&lt;span style=&quot;font-style: italic;&quot;&gt; imports&lt;/span&gt;:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;import javax.swing.UIManager;&lt;br /&gt;import javax.swing.UIManager.LookAndFeelInfo;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;E também declarar uma variável de instância:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;static LookAndFeelInfo skins[] = UIManager.getInstalledLookAndFeels();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Agora temos um &lt;span style=&quot;font-style: italic;&quot;&gt;array&lt;/span&gt; com os &lt;span style=&quot;font-style: italic;&quot;&gt;LookAndFeels&lt;/span&gt; disponíveis. Deixaremos como &lt;span style=&quot;font-style: italic;&quot;&gt;static&lt;/span&gt; para não ter que instanciar depois quando for preciso chamar no &lt;span style=&quot;font-style: italic;&quot;&gt;Listener&lt;/span&gt; (mais adiante você vai entender).&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Montando o Menu&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Para montar o menu eu criei um método que retorna um tipo &lt;span style=&quot;font-style: italic;&quot;&gt;JMenuBar&lt;/span&gt;. Para adicionar o menu na sua aplicação simplesmente chame o método dentro do construtor:&lt;br /&gt;&lt;/div&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;super.setJMenuBar(montaMenu());&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;O método é algo parecido com isto:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;JMenuBar montaMenu(){&lt;br /&gt;&lt;br /&gt;//Cria a barra&lt;br /&gt;JMenuBar barraMenu = new JMenuBar();&lt;br /&gt;&lt;br /&gt;//Cria o menu&lt;br /&gt;JMenu menuSkins = new JMenu(&quot;Skins&quot;);&lt;br /&gt;&lt;br /&gt;/*Aqui vamos adicionar os itens dinamicamente no menu Skins&lt;br /&gt;Mas por enquanto um pouco de suspense....*/&lt;br /&gt;&lt;br /&gt;//Adiciona o menu na barra&lt;br /&gt;barraMenu.add(menuSkins);&lt;br /&gt;&lt;br /&gt;//Retornamos a barra prontinha&lt;br /&gt;return barraMenu;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Bom, agora só falta adicionar os itens no menu &lt;span style=&quot;font-style: italic;&quot;&gt;Skins&lt;/span&gt;. Esta parte pode parecer um pouco confusa a primeira vista mas não é!&lt;br /&gt;Primeiramente vamos criar um &lt;span style=&quot;font-style: italic;&quot;&gt;array&lt;/span&gt; do tipo &lt;span style=&quot;font-style: italic;&quot;&gt;JMenuItem&lt;/span&gt; do tamanho de &lt;span style=&quot;font-style: italic;&quot;&gt;skins.length&lt;/span&gt;, isto é, com quantas posições forem necessárias para acomodar todos os &lt;span style=&quot;font-style: italic;&quot;&gt;LookAndFeels&lt;/span&gt; instalados.&lt;br /&gt;&lt;/div&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;JMenuItem itemSkin[] = new JMenuItem[skins.length];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Agora criamos outro &lt;span style=&quot;font-style: italic;&quot;&gt;array&lt;/span&gt; do tipo &lt;span style=&quot;font-style: italic;&quot;&gt;myListener&lt;/span&gt; (???) para os &lt;span style=&quot;font-style: italic;&quot;&gt;ActionListeners&lt;/span&gt; dos itens declarados acima. Calma que logo veremos essa classe &lt;span style=&quot;font-style: italic;&quot;&gt;myListener&lt;/span&gt;. O tamanho do &lt;span style=&quot;font-style: italic;&quot;&gt;array&lt;/span&gt; segue o mesmo exemplo mostrado.&lt;br /&gt;&lt;/div&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;myListener [] eventosMenu = new myListener[skins.length];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Agora vai ficar bom! Vamos entrar num for passando por todos skins:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;for (int skin = 0; skin /*sinal de menor aqui*/ skins.length; skin++)&lt;br /&gt;{&lt;br /&gt; itemSkin[skin] = new JMenuItem(skins[skin].getName());&lt;br /&gt; eventosMenu[skin] = new myListener(skin);&lt;br /&gt; itemSkin[skin].addActionListener(eventosMenu[skin]);&lt;br /&gt; menuSkins.add(itemSkin[skin]);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;O que acontece? Primeiro o &lt;span style=&quot;font-style: italic;&quot;&gt;array itemSkin&lt;/span&gt; recebe um item com o nome do &lt;span style=&quot;font-style: italic;&quot;&gt;LookAndFeel&lt;/span&gt;. Então um &lt;span style=&quot;font-style: italic;&quot;&gt;Listener&lt;/span&gt; é criado no &lt;span style=&quot;font-style: italic;&quot;&gt;array&lt;/span&gt; e recebe como parâmetro o número daquele &lt;span style=&quot;font-style: italic;&quot;&gt;skin&lt;/span&gt; (mais adiante explico porque). Depois o &lt;span style=&quot;font-style: italic;&quot;&gt;ActionListener&lt;/span&gt; é adicionado ao item. Por último o item é adicionado ao menu. Nao esqueça de colocar o sinal de menor no &lt;span style=&quot;font-style: italic;&quot;&gt;for&lt;/span&gt; onde está comentado, se eu colocar o Blogger pensa que é uma &lt;span style=&quot;font-style: italic;&quot;&gt;tag&lt;/span&gt; e atrapalha tudo! Se alguém souber como desativar essa verificação me avise!&lt;br /&gt;O método deverá ficar assim:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;JMenuBar montaMenu(){&lt;br /&gt;&lt;br /&gt;//Cria a barra&lt;br /&gt;JMenuBar barraMenu = new JMenuBar();&lt;br /&gt;&lt;br /&gt;//Cria o menu&lt;br /&gt;JMenu menuSkins = new JMenu(&quot;Skins&quot;);&lt;br /&gt; &lt;br /&gt;for (int skin = 0; skin /*sinal de menor aqui*/ skins.length; skin++)&lt;br /&gt;{&lt;br /&gt; itemSkin[skin] = new JMenuItem(skins[skin].getName());&lt;br /&gt; eventosMenu[skin] = new myListener(skin);&lt;br /&gt; itemSkin[skin].addActionListener(eventosMenu[skin]);&lt;br /&gt; menuSkins.add(itemSkin[skin]);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//Adiciona o menu na barra&lt;br /&gt;barraMenu.add(menuSkins);&lt;br /&gt;&lt;br /&gt;//Retornamos a barra prontinha&lt;br /&gt;return barraMenu;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Escrevendo um Listener&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Para acionar os eventos do menu, o autor achou que seria interessante implementar um &lt;span style=&quot;font-style: italic;&quot;&gt;Listener&lt;/span&gt; personalizado. Isto porque o &lt;span style=&quot;font-style: italic;&quot;&gt;Listener&lt;/span&gt; deveria conter o número do &lt;span style=&quot;font-style: italic;&quot;&gt;LookAndFeel&lt;/span&gt; que ele gostaria de mostrar naquele momento. Para escrever um &lt;span style=&quot;font-style: italic;&quot;&gt;Listener&lt;/span&gt;, implemente a classe &lt;span style=&quot;font-style: italic;&quot;&gt;ActionListener&lt;/span&gt; e o método &lt;span style=&quot;font-style: italic;&quot;&gt;actionPerformed&lt;/span&gt;:&lt;br /&gt;&lt;/div&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;import java.awt.event.ActionEvent;&lt;br /&gt;import java.awt.event.ActionListener;&lt;br /&gt;import javax.swing.JOptionPane;&lt;br /&gt;import javax.swing.UIManager;&lt;br /&gt;&lt;br /&gt;public class myListener implements ActionListener{&lt;br /&gt;private int skin = 0;&lt;br /&gt;&lt;br /&gt;public myListener(int newSkin) {&lt;br /&gt;this.skin = newSkin;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void actionPerformed(ActionEvent arg0) {&lt;br /&gt;try{&lt;br /&gt;UIManager.setLookAndFeel(Principal.skins[skin].getClassName());&lt;br /&gt;JOptionPane.showMessageDialog(null, &quot;Seu skin foi alterado para &quot; + Principal.skins[skin].getName() + &quot;.\nCaso tenha janelas internas em execução, reinicie-as para aplicar as alterações.&quot;, &quot;Skins&quot;, JOptionPane.INFORMATION_MESSAGE);&lt;br /&gt;}catch(Exception e)&lt;br /&gt;{&lt;br /&gt;e.printStackTrace();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Veja que a classe possui um construtor que recebe o &lt;span style=&quot;font-style: italic;&quot;&gt;LookAndFeel&lt;/span&gt; a ser mostrado. Por isso que passamos como parâmetro quando estamos criando os objetos &lt;span style=&quot;font-style: italic;&quot;&gt;Listener&lt;/span&gt;. Dentro do &lt;span style=&quot;font-style: italic;&quot;&gt;actionPerformed&lt;/span&gt; chamamos o método que configura o &lt;span style=&quot;font-style: italic;&quot;&gt;LookAndFeel&lt;/span&gt; recebido e mostra uma mensagem. Coloquei esta mensagem porque estou trabalhando com &lt;span style=&quot;font-style: italic;&quot;&gt;InternalFrames&lt;/span&gt; e eles precisam ser reabertos para que as aplicações ocorram. Lembrando que as duas classes estão no mesmo pacote.&lt;br /&gt;Veja o resultado final:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFKdmJyF9zXdqvczPA1j-VclWOHQla7K2dbLAaM4feBaiIVctooXzVV7lIIM3WBfUUT4stUV4RxTHbeoQYOb5asSmChhL_qcAW0qjGK-J0GcZs15m7kZJTLYVx785S_u_ENwR2WFxMD7MW/s1600/lookandfeel.jpg&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 136px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFKdmJyF9zXdqvczPA1j-VclWOHQla7K2dbLAaM4feBaiIVctooXzVV7lIIM3WBfUUT4stUV4RxTHbeoQYOb5asSmChhL_qcAW0qjGK-J0GcZs15m7kZJTLYVx785S_u_ENwR2WFxMD7MW/s320/lookandfeel.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5504165606491236322&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Agora é só implementar mais alguma coisa pra salvar o &lt;span style=&quot;font-style: italic;&quot;&gt;LookAndFeel&lt;/span&gt; selecionado.&lt;br /&gt;Espero que tenham gostado!</content><link rel='replies' type='application/atom+xml' href='http://marciosouzajunior.blogspot.com/feeds/1821360964282764142/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://marciosouzajunior.blogspot.com/2010/08/menu-dinamico-java.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/1821360964282764142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/1821360964282764142'/><link rel='alternate' type='text/html' href='http://marciosouzajunior.blogspot.com/2010/08/menu-dinamico-java.html' title='Menu Dinâmico - Java'/><author><name>Márcio de Souza Júnior</name><uri>http://www.blogger.com/profile/01965624113971008303</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFKdmJyF9zXdqvczPA1j-VclWOHQla7K2dbLAaM4feBaiIVctooXzVV7lIIM3WBfUUT4stUV4RxTHbeoQYOb5asSmChhL_qcAW0qjGK-J0GcZs15m7kZJTLYVx785S_u_ENwR2WFxMD7MW/s72-c/lookandfeel.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5856286885704734621.post-2697420228357333152</id><published>2010-08-09T17:18:00.000-03:00</published><updated>2010-08-10T12:16:46.530-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="eclipse"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="mysql"/><category scheme="http://www.blogger.com/atom/ns#" term="visual editor"/><title type='text'>Eclipse - Visual Editor - MySQL</title><content type='html'>&lt;span style=&quot;font-weight: bold;&quot;&gt;Introdução&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Olá! No  post de hoje pretendo mostrar como iniciar no desenvolvimento de aplicações gráficas que utilizem banco de dados em Java. Será mostrado como criar um simples banco de dados e fazer a conexão através do programa. Também ensinarei como instalar o &lt;i&gt;Visual Editor&lt;/i&gt; que é usado criar a parte gráfica. Então finalmente veremos como inserir dados no banco.&lt;br /&gt;O que me motivou a criar este tutorial é que tenho visto muito material sobre, porém coisas sem pé nem cabeça, códigos que não compilam, trabalho mal feito. Como eu odeio coisas mal feitas, fiz este post bem didático. Vou mostrar desde a instalação e configuração das feramentas até os testes finais. Todos os códigos foram testados pelo autor.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;O Ambiente&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Primeiramente vamos preparar o ambiente de desenvolvimento. Logo abaixo você encontra as ferramentas necessárias. Recomendo que utilize as ferramentas nas versões citadas.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a style=&quot;font-weight: bold;&quot; href=&quot;http://www.eclipse.org/downloads/download.php?file=/eclipse/downloads/drops/R-3.5-200906111540/eclipse-SDK-3.5-win32.zip&quot;&gt;Eclipse Galileo (3.5)&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;O &lt;span style=&quot;font-style: italic;&quot;&gt;Eclipse&lt;/span&gt; é uma &lt;span style=&quot;font-style: italic;&quot;&gt;IDE&lt;/span&gt; muito popular no mundo Java, por isto estarei utilizando-a neste exemplo. Nada impede que se utilize outra IDE, algumas coisas mudam mas os códigos são os mesmos.&lt;br /&gt;&lt;/div&gt;&lt;span style=&quot;font-style: italic; font-weight: bold;&quot;&gt;Como instalar?&lt;/span&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Ele não precisa de ser instalado, depois de baixar é só descompactar. No primeiro uso ele vai pedir o caminho do &lt;i&gt;Workspace&lt;/i&gt;, que é a pasta padrão para os seus projetos. Escolha uma pasta de sua preferência e marque a caixa &lt;i&gt;Use this as the default...&lt;/i&gt; para ele não perguntar novamente. Se futuramente quiser mudar vá em &lt;i&gt;File &gt; Switch Workspace&lt;/i&gt;.&lt;br /&gt;Obs.: Versões superiores a esta ainda não são compatíveis com o &lt;span style=&quot;font-style: italic;&quot;&gt;Visual Editor,&lt;/span&gt; que atualmente está na versão 1.4.0 (hoje é 10/8/2010). Não tente instalar essa versão no &lt;span style=&quot;font-style: italic;&quot;&gt;Eclipse&lt;/span&gt; 3.6 ou superior.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a style=&quot;font-weight: bold;&quot; href=&quot;http://www.eclipse.org/downloads/download.php?file=/tools/ve/downloads/drops/1.4.0/R200909301124/VE-Update-1.4.0.zip&quot;&gt;Visual Editor 1.4&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;O &lt;span style=&quot;font-style: italic;&quot;&gt;Visual Editor&lt;/span&gt; é um &lt;span style=&quot;font-style: italic;&quot;&gt;framework&lt;/span&gt; para desenvolver a parte gráfica dos programas. O &lt;span style=&quot;font-style: italic;&quot;&gt;Eclipse&lt;/span&gt; não é como o &lt;span style=&quot;font-style: italic;&quot;&gt;Visual Basic&lt;/span&gt; que você instala e já tem tudo lá prontinho pra você começar a arrastar os botões, &lt;span style=&quot;font-style: italic;&quot;&gt;labels, textboxs&lt;/span&gt;.. No &lt;span style=&quot;font-style: italic;&quot;&gt;Eclipse&lt;/span&gt; você tem que instalar o &lt;span style=&quot;font-style: italic;&quot;&gt;Visual Editor&lt;/span&gt; à parte.&lt;br /&gt;&lt;/div&gt;&lt;span style=&quot;font-style: italic; font-weight: bold;&quot;&gt;Como instalar?&lt;/span&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Existem duas formas de instalar:&lt;span style=&quot;font-style: italic;&quot;&gt; online&lt;/span&gt; e &lt;span style=&quot;font-style: italic;&quot;&gt;offline&lt;/span&gt;. Aqui vou mostrar só &lt;span style=&quot;font-style: italic;&quot;&gt;online&lt;/span&gt;: Vá no &lt;span style=&quot;font-style: italic;&quot;&gt;Eclipse&lt;/span&gt; em &lt;i&gt;Help &gt; Install New Software... &gt; Add...&lt;/i&gt; Em &lt;i&gt;Name&lt;/i&gt; você coloca &lt;span style=&quot;font-style: italic;&quot;&gt;Visual Editor&lt;/span&gt;. Em &lt;i&gt;Location&lt;/i&gt; cole o endereço:&lt;br /&gt;&lt;i&gt;http://download.eclipse.org/tools/ve/updates/1.4/&lt;/i&gt;.&lt;br /&gt;Após alguns segundos vai aparecer uma árvore de pacotes com a raiz &lt;i&gt;VE 1.4.0 R200...&lt;/i&gt;. Dentro da árvore existem vários pacotes e somente o pacote cujo nome é &lt;i&gt;Visual Editor&lt;/i&gt; deverá ser marcado. Se marcar outros poderá causar conflitos. Então clique em &lt;i&gt;Next&lt;/i&gt;. Ele vai fazer o&lt;span style=&quot;font-style: italic;&quot;&gt; download&lt;/span&gt; e quando estiver pronto clique em &lt;i&gt;Finish&lt;/i&gt; para iniciar a instalação. Depois de alguns minutos você deve ser questionado se confia no certificado do &lt;span style=&quot;font-style: italic;&quot;&gt;Eclipse.org&lt;/span&gt;, pode confiar. Depois ele vai perguntar se deseja reiniciar o &lt;span style=&quot;font-style: italic;&quot;&gt;Eclipse&lt;/span&gt;. Você vai dizer que sim e pronto! Depois de reiniciar, vá em &lt;i&gt;Help &gt; About Eclipse &gt; Installation Details&lt;/i&gt;. Na aba &lt;i&gt;Features&lt;/i&gt; o&lt;span style=&quot;font-style: italic;&quot;&gt; Visual Editor&lt;/span&gt; deve estar presente. Se tiver dificuldade, veja &lt;a href=&quot;http://www.youtube.com/watch?v=pYFGr9BfBT0&quot;&gt;este vídeo&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a style=&quot;font-weight: bold;&quot; href=&quot;http://dev.mysql.com/downloads/mysql/&quot;&gt;MySQL Server&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;O &lt;span style=&quot;font-style: italic;&quot;&gt;MySQL&lt;/span&gt; é o servidor de banco de dados &lt;span style=&quot;font-style: italic;&quot;&gt;open source&lt;/span&gt; mais popular do mundo (pelo menos de acordo com a definição dos seus desenvolvedores). Faça o &lt;span style=&quot;font-style: italic;&quot;&gt;download&lt;/span&gt; do arquivo: &lt;i&gt;Windows (x86, 32-bit), MSI InstallerEssentials&lt;/i&gt; (mysql-essential-5.1.49-win32.msi) ou o &lt;span style=&quot;font-style: italic;&quot;&gt;64-bit&lt;/span&gt; de acordo com seu sistema. Também faça o &lt;span style=&quot;font-style: italic;&quot;&gt;download&lt;/span&gt; do &lt;a style=&quot;font-style: italic;&quot; href=&quot;http://dev.mysql.com/downloads/workbench/5.2.html&quot;&gt;MySQL Workbench&lt;/a&gt; (mysql-workbench-gpl-5.2.26-win32.msi) para ter acesso as ferramentas gráficas &lt;span style=&quot;font-style: italic;&quot;&gt;SQL Development&lt;/span&gt; (antigo MySQL Query Browser) e &lt;span style=&quot;font-style: italic;&quot;&gt;Database Administration&lt;/span&gt; (antigo MySQL Administrator).&lt;br /&gt;&lt;/div&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;Como instalar o MySQL Server?&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Next &gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Complete &gt; Next &gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Install &gt; (Windows Seven pede permissão)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Next &gt; Next &gt; Finish.&lt;/span&gt;&lt;br /&gt;Configuração:&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Next &gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Standart COnfiguration &gt; Next &gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Install As Windows Service &gt; Next &gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Escolha a senha &gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Execute.&lt;/span&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Se quiser mudar a configuração posteriormente ou remover a instância execute o &lt;span style=&quot;font-style: italic;&quot;&gt;MySQL Server Instance Config Wizard&lt;/span&gt; que é criado pelo &lt;span style=&quot;font-style: italic;&quot;&gt;MySQL&lt;/span&gt; no &lt;span style=&quot;font-style: italic;&quot;&gt;Iniciar &gt; Programas &gt; MySQL &gt; MySQL Server 5.1&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;ATENÇÃO: Quando for escolher a senha tome muito cuidado para não errar ou esquecer porque depois vai dar trabalho remover a instância do MySQL sem saber a senha.&lt;/span&gt; Recomendo que coloque a senha &lt;span style=&quot;font-style: italic;&quot;&gt;root&lt;/span&gt; para o usuário &lt;span style=&quot;font-style: italic;&quot;&gt;root&lt;/span&gt; se estiver apenas aprendendo e a segurança não for importante.&lt;br /&gt;&lt;/div&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;Como instalar o Workbench?&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Next &gt;&lt;br /&gt;Complete &gt; Next &gt;&lt;br /&gt;Install &gt;&lt;br /&gt;Finish.&lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a style=&quot;font-weight: bold;&quot; href=&quot;http://dev.mysql.com/downloads/connector/j/&quot;&gt;Connector/J 5.1.13&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;MySQL Connector/J&lt;/span&gt; é o &lt;span style=&quot;font-style: italic;&quot;&gt;driver JDBC&lt;/span&gt; oficial para o &lt;span style=&quot;font-style: italic;&quot;&gt;MySQL&lt;/span&gt;. Ele permitirá que nosso aplicativo Java se conecte com o &lt;span style=&quot;font-style: italic;&quot;&gt;MySQL&lt;/span&gt;.&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;JDBC&lt;/span&gt; ou &lt;i&gt;Java Database Connectivity&lt;/i&gt; é um conjunto de classes e interfaces (API) escritas em Java que fazem o envio de instruções SQL para qualquer banco de dados relacional, neste caso o &lt;span style=&quot;font-style: italic;&quot;&gt;MySQL&lt;/span&gt;.&lt;br /&gt;&lt;/div&gt;&lt;span style=&quot;font-style: italic; font-weight: bold;&quot;&gt;Como instalar?&lt;/span&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Por enquanto você vai apenas descompactar o arquivo. O &lt;span style=&quot;font-style: italic;&quot;&gt;driver&lt;/span&gt; é inserido diretamente nas bibliotecas de cada projeto. Portanto o procedimento será mostrado mais adiante na criação do projeto.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;O Projeto&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;O exemplo que pretendo apresentar aqui é bem simples: Uma agenda de telefones. O banco vai conter nada mais que o nome e telefone da pessoa. Vamos criar uma tabela chamada &lt;span style=&quot;font-style: italic;&quot;&gt;Pessoa&lt;/span&gt; e nela teremos 2 campos, nome e telefone. O propósito não é mostrar aspectos do banco de dados como relacionamentos, consultas, etc. Apenas será mostrado como se conectar ao banco e inserir um registro. Sabendo disto, você pode pesquisar mais sobre o assunto depois e incrementar sua aplicação.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;O Banco de Dados&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;O banco de dados é a base do seu projeto. Se o banco é mal projetado, isso vai refletir negativamente no projeto inteiro, porque quase toda a aplicação vai trabalhar em cima dele. Por este motivo o banco deve ser bem projetado. Deve ser desenvolvido com base em informações sólidas sobre o modelo do negócio que se deseja implementar para evitar problemas futuros. É claro que neste exemplo mostrado aqui não teria muitos problemas,  o reparo seria simples. Mas essa advertência é válida para que todos saibam a importância dessa parte do projeto. Então vamos criar o banco.&lt;br /&gt;&lt;/div&gt;Execute o&lt;span style=&quot;font-style: italic;&quot;&gt; Workbench&lt;/span&gt;.&lt;br /&gt;Clique no menu&lt;span style=&quot;font-style: italic;&quot;&gt; File &gt; New Model&lt;/span&gt;.&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;No menu &lt;span style=&quot;font-style: italic;&quot;&gt;Database&lt;/span&gt; clique em &lt;span style=&quot;font-style: italic;&quot;&gt;Query Database&lt;/span&gt;...Uma Janela &lt;span style=&quot;font-style: italic;&quot;&gt;Connect to Database&lt;/span&gt; irá aparecer. Clique em &lt;span style=&quot;font-style: italic;&quot;&gt;OK&lt;/span&gt;. Se a instância do &lt;span style=&quot;font-style: italic;&quot;&gt;MySQL&lt;/span&gt; estiver instalada e executando vai pedir a senha.&lt;br /&gt;&lt;/div&gt;Entre com a senha e &lt;span style=&quot;font-style: italic;&quot;&gt;OK&lt;/span&gt;.&lt;br /&gt;Na aba &lt;span style=&quot;font-style: italic;&quot;&gt;SQL Query&lt;/span&gt; cole o seguinte código:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;sql&quot;&gt;&lt;br /&gt;CREATE DATABASE AGENDA;&lt;br /&gt;USE AGENDA;&lt;br /&gt;&lt;br /&gt;CREATE TABLE PESSOA(&lt;br /&gt; Nome VARCHAR(100),&lt;br /&gt; Telefone VARCHAR(100),&lt;br /&gt;&lt;br /&gt; PRIMARY KEY(Nome)&lt;br /&gt;&lt;br /&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Clique no ícone &lt;span style=&quot;font-style: italic;&quot;&gt;Execute SQL Script in Connected Server&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7426nMbOktw1JEw_7D9s8OUdiw_dlIOgRdQg2WUiddmnyYKKpNNMBGpm-LoReSOiQIPecOTrNwYrbEpxH5XtBhARnlzmS-EE576mLo_GTLqyan1AFiAYESltpP1mmuOK7_Di5ILAfPXdI/s1600/SQL1.jpg&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 274px; height: 99px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7426nMbOktw1JEw_7D9s8OUdiw_dlIOgRdQg2WUiddmnyYKKpNNMBGpm-LoReSOiQIPecOTrNwYrbEpxH5XtBhARnlzmS-EE576mLo_GTLqyan1AFiAYESltpP1mmuOK7_Di5ILAfPXdI/s320/SQL1.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5503755858303361138&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Se tudo der certo, na aba &lt;span style=&quot;font-style: italic;&quot;&gt;Output&lt;/span&gt; vai aparecer a mensagem:&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;0 row(s) affected&lt;/span&gt;.&lt;br /&gt;Se não der vai aparecer um erro parecido com este:&lt;br /&gt;&lt;/div&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Error Code: 1064&lt;/span&gt; &lt;span style=&quot;font-style: italic;&quot;&gt;You have an error in your SQL syntax; ...&lt;/span&gt;&lt;br /&gt;Clique com o botão direito na parte &lt;span style=&quot;font-style: italic;&quot;&gt;Object Browser&lt;/span&gt; e &lt;span style=&quot;font-style: italic;&quot;&gt;Refresh All&lt;/span&gt;. O novo banco deve aparecer.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhP0P26AVBHLHuVe3f83oVnIXd06W-S5yrQMKmuxnDiXzeBj8s-UnrEraF3FBrYiZQpGBrTrF2-YKKho9gA2K6Y2n-d-5j-hUi3aBSx4cgzRvMZT5mguZyx-ObECIcCx8_NDhK5BXW0Vc7z/s1600/SQL2.jpg&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 256px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhP0P26AVBHLHuVe3f83oVnIXd06W-S5yrQMKmuxnDiXzeBj8s-UnrEraF3FBrYiZQpGBrTrF2-YKKho9gA2K6Y2n-d-5j-hUi3aBSx4cgzRvMZT5mguZyx-ObECIcCx8_NDhK5BXW0Vc7z/s320/SQL2.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5503756366527285890&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Pronto. Criamos um simples banco de dados chamado &lt;span style=&quot;font-style: italic;&quot;&gt;Agenda&lt;/span&gt; e dentro dele somente uma tabela chamada &lt;span style=&quot;font-style: italic;&quot;&gt;Pessoa&lt;/span&gt; com dois campos para nome e telefone, sendo o nome a chave primária (campo que identifica cada registro unicamente e não pode ser duplicado).&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;A Parte Gráfica&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Abra o &lt;span style=&quot;font-style: italic;&quot;&gt;Eclipse&lt;/span&gt; e na parte &lt;i&gt;Package Explorer&lt;/i&gt; clique com o botão direito e &lt;i&gt;New &gt; Java Project&lt;/i&gt;. Em &lt;i&gt;Project Name&lt;/i&gt; digite &quot;ProjetoExemplo&quot; e &lt;i&gt;Finish&lt;/i&gt;. No menu do &lt;span style=&quot;font-style: italic;&quot;&gt;Eclipse&lt;/span&gt; tem um botão chamado &lt;i&gt;New Java Class&lt;/i&gt;, clique nele e depois em &lt;i&gt;Visual Class&lt;/i&gt;:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgB1jWLpFMMgx__uQePRjT330-A5RAx_qxOZW5Lt19BCdavGRd2NQfGccbFfEalihR-Y9gpvVPIehxOH7ao9HBjvyRUNl8mOgQg3DcALzvQUnZvAaqmCxXrwQkQ4TQnUF7HcC1Bx9hWD1PG/s1600/projeto1.jpg&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 409px; height: 207px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgB1jWLpFMMgx__uQePRjT330-A5RAx_qxOZW5Lt19BCdavGRd2NQfGccbFfEalihR-Y9gpvVPIehxOH7ao9HBjvyRUNl8mOgQg3DcALzvQUnZvAaqmCxXrwQkQ4TQnUF7HcC1Bx9hWD1PG/s320/projeto1.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5503511425738656114&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Na janela que aparecer será solicitado o nome da classe em &lt;i&gt;Name&lt;/i&gt;, digite &lt;i&gt;Principal&lt;/i&gt;. Ainda nesta janela mais embaixo tem uma parte chamada &lt;i&gt;Style&lt;/i&gt;. Nesta parte navegue por &lt;i&gt;Swing &gt; Frame&lt;/i&gt;. Ao lado marque a caixa &lt;i&gt;public static void main(String[] args)&lt;/i&gt;. Sua janela deverá ficar igual a esta (clique para ampliar):&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisLlZQ1biXw7uybjSnepEnHQWyv53Bu2x03bg8a_nB2NXKoabbtCdoFF1mGidVODCfLjgZa8VmnTYw31j6XGGQxr6nk3g-e4znjlLPh4g38_iDt0yzGa1-dOYmQF_iaRxHkpOKUTUF3CH8/s1600/projeto2.jpg&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 357px; height: 378px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisLlZQ1biXw7uybjSnepEnHQWyv53Bu2x03bg8a_nB2NXKoabbtCdoFF1mGidVODCfLjgZa8VmnTYw31j6XGGQxr6nk3g-e4znjlLPh4g38_iDt0yzGa1-dOYmQF_iaRxHkpOKUTUF3CH8/s320/projeto2.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5503512091291366626&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Clique em &lt;i&gt;Finish&lt;/i&gt;.&lt;br /&gt;No meio da interface do &lt;span style=&quot;font-style: italic;&quot;&gt;Eclipse&lt;/span&gt; teremos uma divisão entre a parte visual e a parte dos códigos. Tudo que é feito em um reflete no outro. Pode-se alternar as partes utilizando as setas como mostra o círculo entre elas:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXIQZ0BaZRSXzk1fR6dj3hlo20MetQs_jjynGuZ5dRE8ARvwKNGDGRm7Dae0PhIgofmk60S9u71wpWQBxyk8WCpwaX7gRtv3DnUL1BLoqNWX1K6YKJj-speT-QKuGxnD4e6RcAKO-pUOOE/s1600/projeto3.jpg&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 254px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXIQZ0BaZRSXzk1fR6dj3hlo20MetQs_jjynGuZ5dRE8ARvwKNGDGRm7Dae0PhIgofmk60S9u71wpWQBxyk8WCpwaX7gRtv3DnUL1BLoqNWX1K6YKJj-speT-QKuGxnD4e6RcAKO-pUOOE/s320/projeto3.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5503512678412109106&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;A seta indicada pelo outro círculo mais acima abre a paleta de objetos:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhergORjzW8l-8KmMoGWM2J2XiRSjLQGs_-TE_In50GLtx4GUGscBfH4omPOYxWIH2eoqeOZGRAzGFisAzeRpAuFFew1p2y4afNjIvfE-wAG0v8rrmYyFo9DTy7QST8ZSKlfr6ZXiUyESrK/s1600/projeto4.jpg&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 139px; height: 320px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhergORjzW8l-8KmMoGWM2J2XiRSjLQGs_-TE_In50GLtx4GUGscBfH4omPOYxWIH2eoqeOZGRAzGFisAzeRpAuFFew1p2y4afNjIvfE-wAG0v8rrmYyFo9DTy7QST8ZSKlfr6ZXiUyESrK/s320/projeto4.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5503513005706643570&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Antes de começar a colocar os objetos vamos definir o tipo de &lt;span style=&quot;font-style: italic;&quot;&gt;layout&lt;/span&gt;. Clique no meio do &lt;span style=&quot;font-style: italic;&quot;&gt;frame&lt;/span&gt; como botão direito e vá em &lt;i&gt;Set Layout &gt; null&lt;/i&gt;. Este&lt;span style=&quot;font-style: italic;&quot;&gt; layout&lt;/span&gt; nos dá mais liberdade para posicionar os itens no &lt;span style=&quot;font-style: italic;&quot;&gt;frame&lt;/span&gt;. Os outros tipos colocam os objetos em partes pré-definidas para que não se desorganizem quando a tela for maximizada. Opcionalmente também pode-se fazer com que os objetos se alinhem à grade, para isto clique novamente no &lt;span style=&quot;font-style: italic;&quot;&gt;frame&lt;/span&gt; com o botão direito e &lt;i&gt;Snap To Grid&lt;/i&gt;.&lt;br /&gt;Para colocar os objetos no &lt;span style=&quot;font-style: italic;&quot;&gt;frame&lt;/span&gt; basta clicar no objeto desejado e depois clicar no &lt;span style=&quot;font-style: italic;&quot;&gt;frame &lt;/span&gt;onde quiser colocá-lo. Quando clicar no &lt;span style=&quot;font-style: italic;&quot;&gt;frame&lt;/span&gt; para inserir o objeto, ele vai perguntar qual nome queremos dar a ele. Use nomes com prefico&lt;span style=&quot;font-style: italic;&quot;&gt; lb&lt;/span&gt; para &lt;span style=&quot;font-style: italic;&quot;&gt;labels&lt;/span&gt;, &lt;span style=&quot;font-style: italic;&quot;&gt;tx&lt;/span&gt; para &lt;span style=&quot;font-style: italic;&quot;&gt;textfields&lt;/span&gt; e &lt;span style=&quot;font-style: italic;&quot;&gt;bt&lt;/span&gt; para botões. Depois do prefixo use um substantivo iniciando com letra maiúscula que identifique aquele objeto. Usar estes padrões de nomeação é importante e ajuda bastante na hora de chamar os objetos via código.&lt;br /&gt;Então vamos criar 2 &lt;span style=&quot;font-style: italic;&quot;&gt;jLabels,&lt;/span&gt; 2 &lt;span style=&quot;font-style: italic;&quot;&gt;jTextFields&lt;/span&gt; e um &lt;span style=&quot;font-style: italic;&quot;&gt;jButtton&lt;/span&gt;. Para os &lt;span style=&quot;font-style: italic;&quot;&gt;jLabels&lt;/span&gt; use &lt;span style=&quot;font-style: italic;&quot;&gt;lbNome&lt;/span&gt; e &lt;span style=&quot;font-style: italic;&quot;&gt;lbTelefone&lt;/span&gt;. Para os &lt;span style=&quot;font-style: italic;&quot;&gt;jTextFields&lt;/span&gt; use &lt;span style=&quot;font-style: italic;&quot;&gt;txNome&lt;/span&gt; e &lt;span style=&quot;font-style: italic;&quot;&gt;txTelefone&lt;/span&gt;. E para o botão use &lt;span style=&quot;font-style: italic;&quot;&gt;btSalvar&lt;/span&gt;. Você deverá ter algo parecido com isto:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKkpj2vJOOdeI0xchoWveupPk1uhT3r7I2D-vZ4IAcQggd3qRqjLLzYV0vLLB2d0_ORYFIXBS5Wdn6o2xosa8OgpOi-Ar2G5OkhKgd68S7fCZDu1-bqYYHGxVjedNEQ70_31-G9rduvWis/s1600/projeto5.jpg&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 308px; height: 209px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKkpj2vJOOdeI0xchoWveupPk1uhT3r7I2D-vZ4IAcQggd3qRqjLLzYV0vLLB2d0_ORYFIXBS5Wdn6o2xosa8OgpOi-Ar2G5OkhKgd68S7fCZDu1-bqYYHGxVjedNEQ70_31-G9rduvWis/s320/projeto5.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5503514024938841474&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Mas nossos&lt;span style=&quot;font-style: italic;&quot;&gt; labels&lt;/span&gt; e o botão ainda estão sem um nome. Para dar um rótulo a eles clique com o botão direito em cada um e depois em &lt;i&gt;Set Text&lt;/i&gt;. Pronto! Agora sim:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7QKpPCPLyWZRWEsQ_JSUWLQacVm-3XeTGu9DFpaxZLnl0DxKWupv2EE_uAtFeHSTAlc6zx9oW8ZN-a3cChWMrZfSCUKTSMb1Cv8wOoXyhUZf6C0SKd1RnpzYY8NnyBfR0FMYeo2tQB6QL/s1600/projeto6.jpg&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 313px; height: 212px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7QKpPCPLyWZRWEsQ_JSUWLQacVm-3XeTGu9DFpaxZLnl0DxKWupv2EE_uAtFeHSTAlc6zx9oW8ZN-a3cChWMrZfSCUKTSMb1Cv8wOoXyhUZf6C0SKd1RnpzYY8NnyBfR0FMYeo2tQB6QL/s320/projeto6.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5503514280646907010&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Cada uma destas propriedades que configuramos para os objetos pode ser modificada através da aba &lt;i&gt;Properties&lt;/i&gt;:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieBVexWxlp3qiTuE2H6X0-QgLU-RNfZFUargI6NRtPg1WAVTdQHyHhv-LzM_2MFSw9NetE3TnufRvmGHp5DZDRXCX9eMe57eExvPzum1I4aul8fwyGAUs3BPvmItI8tTO6f8pj1CbFAykd/s1600/projeto7.jpg&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 358px; height: 159px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieBVexWxlp3qiTuE2H6X0-QgLU-RNfZFUargI6NRtPg1WAVTdQHyHhv-LzM_2MFSw9NetE3TnufRvmGHp5DZDRXCX9eMe57eExvPzum1I4aul8fwyGAUs3BPvmItI8tTO6f8pj1CbFAykd/s320/projeto7.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5503514580016829682&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Basta clicar no objeto que suas propriedades serão mostradas. Cada uma delas também pode ser acessada via código para fazer alterações como mudar o tamanho, cor, rótulo, desativar, esconder, etc.&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Dica:&lt;/span&gt; Quando levar seu projeto para outro computador ou se tiver que instalar o&lt;span style=&quot;font-style: italic;&quot;&gt; Eclipse&lt;/span&gt; novamente e depois importar o projeto pode ser que as classes visuais não abram com &lt;span style=&quot;font-style: italic;&quot;&gt;Visual Editor&lt;/span&gt;, e apenas mostrem a parte do código. Neste caso clique com o botão direito na classe e &lt;span style=&quot;font-style: italic;&quot;&gt;Open With &gt; Visual Editor&lt;/span&gt;.&lt;br /&gt;Bom, agora a parte visual do nosso projeto está concluída. Mas antes de continuar vamos dar uma breve explicação sobre o que é o &lt;span style=&quot;font-style: italic;&quot;&gt;MVC&lt;/span&gt; e porque devemos utilizá-lo.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;MVC&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;MVC&lt;/span&gt; ou &lt;i&gt;Model View Controller&lt;/i&gt; é um padrão de desenvolvimento onde seu projeto é dividido em 3 partes:&lt;span style=&quot;font-style: italic;&quot;&gt; Model, View&lt;/span&gt; e &lt;span style=&quot;font-style: italic;&quot;&gt;Controller&lt;/span&gt;.&lt;br /&gt;Primeiro vou falar da parte &lt;span style=&quot;font-style: italic;&quot;&gt;View&lt;/span&gt; que é a mais simples. &lt;span style=&quot;font-style: italic;&quot;&gt;View&lt;/span&gt; é a visão. &lt;span style=&quot;font-style: italic;&quot;&gt;View&lt;/span&gt; é a parte visual do projeto, ou seja, é a parte que acabamos de ver no capítulo anterior. É a interface, as janelas, botões, figuras, etc. Nada de código aqui, só visual.&lt;br /&gt;Ok, agora vamos ver &lt;span style=&quot;font-style: italic;&quot;&gt;Model&lt;/span&gt;. &lt;span style=&quot;font-style: italic;&quot;&gt;Model&lt;/span&gt; vem de modelo. &lt;span style=&quot;font-style: italic;&quot;&gt;Model&lt;/span&gt; é a parte do seu projeto onde se modela os dados. Vou dar um exemplo bem prático: Num cadastro de clientes temos um modelo de cliente. Não é nada mais do que uma classe que possui os atributos desejados para aquele objeto (e métodos para acessá-los e alterá-los).  Os atributos são os mesmos que encontramos na tabela cliente do banco de dados. Se não entendeu, tudo bem, fique tranquilo que daqui a pouco quando desenvolver esta parte vai ficar mais claro.&lt;br /&gt;Por último temos o &lt;span style=&quot;font-style: italic;&quot;&gt;Controller&lt;/span&gt;. O &lt;span style=&quot;font-style: italic;&quot;&gt;Controller&lt;/span&gt; é o cara que faz acontecer. Ele valida os dados e faz a ligação entre &lt;span style=&quot;font-style: italic;&quot;&gt;View&lt;/span&gt; e &lt;span style=&quot;font-style: italic;&quot;&gt;Model&lt;/span&gt;. No final das contas ele que é o responsável por fazer as operações no banco de dados, caso tudo esteja bem.&lt;br /&gt;Com isto vimos que o modelo&lt;span style=&quot;font-style: italic;&quot;&gt; MVC&lt;/span&gt; separa as partes do projeto e deixa cada uma a cargo de determinada tarefa. Isso é bom porque tudo fica mais organizado, erros são isolados e tratados, a manutenção é feita com mais facilidade.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgc3F_X4P2ZOJC4uMGc0fQil_yE7Mq5r-0MkNuL8rd8OuB1jy6cLEDs7Gi1TY65jkr3SwrH_VcVOKEE3KItjuBLnSkS1EkWK1Xp3VNosK9EwDqK5o4TSPa6Mlcfm61t6HI3NcWh4wmurych/s1600/mvc1.png&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 278px; height: 252px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgc3F_X4P2ZOJC4uMGc0fQil_yE7Mq5r-0MkNuL8rd8OuB1jy6cLEDs7Gi1TY65jkr3SwrH_VcVOKEE3KItjuBLnSkS1EkWK1Xp3VNosK9EwDqK5o4TSPa6Mlcfm61t6HI3NcWh4wmurych/s320/mvc1.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5503777403412845154&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Model&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Segundo o modelo &lt;span style=&quot;font-style: italic;&quot;&gt;MVC&lt;/span&gt; vamos criar uma classe para representar a entidade &lt;span style=&quot;font-style: italic;&quot;&gt;Pessoa&lt;/span&gt; que está em nosso banco de dados. Vamos criar um modelo que represente uma unidade desta entidade, este tipo de classe é normalmente chamada de &lt;i&gt;Bean&lt;/i&gt; ou &lt;i&gt;JavaBean&lt;/i&gt;. Vamos ver um pouco de ação. Clique com o botão direito em cima do nosso projeto e &lt;i&gt;New &gt; Package&lt;/i&gt;. Dê o nome a este pacote de &lt;i&gt;beans&lt;/i&gt;. Clique agora no pacote com o botão direito e &lt;i&gt;New &gt; Class&lt;/i&gt;. Dê o nome a esta classe de &lt;i&gt;Pessoa&lt;/i&gt;. Implemente a classe desta forma:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;public class Pessoa {&lt;br /&gt;// Atributos&lt;br /&gt;private String Nome;&lt;br /&gt;private String Telefone;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Veja que temos os mesmos atributos do banco de dados. Esses atributos devem ser encapsulados para maior segurança e por isso precisamos criar os métodos para manipulá-los. Vamos fazer isto automaticamente: Clique com o botão direito dentro da classe onde se deseja criar os métodos e &lt;i&gt;Source &gt; Generate Getters and Setters&lt;/i&gt;. Clique em &lt;i&gt;Select All&lt;/i&gt; e &lt;span style=&quot;font-style: italic;&quot;&gt;OK&lt;/span&gt;. Pronto, agora teremos algo parecido com isto:&lt;br /&gt;&lt;/div&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;package beans;&lt;br /&gt;&lt;br /&gt;public class Pessoa {&lt;br /&gt;// Atributos&lt;br /&gt;private String Nome;&lt;br /&gt;private String Telefone;&lt;br /&gt;&lt;br /&gt;// Construtor sem parâmetro&lt;br /&gt;public Pessoa() {&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Construtor que já inicializa recebendo nome e telefone&lt;br /&gt;public Pessoa(String nome, String telefone) {&lt;br /&gt;super();&lt;br /&gt;Nome = nome;&lt;br /&gt;Telefone = telefone;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Getters e Setters&lt;br /&gt;public String getNome() {&lt;br /&gt;return Nome;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setNome(String nome) {&lt;br /&gt;Nome = nome;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String getTelefone() {&lt;br /&gt;return Telefone;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setTelefone(String telefone) {&lt;br /&gt;Telefone = telefone;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Veja também que temos dois construtores: um sem parâmetro e outro com. Você pode gerar estes construtores em &lt;i&gt;Source &gt; Generate Constructor using Fields&lt;/i&gt;. O construtor com parâmetros permite já inicializar o objeto passando os atributos de uma vez. O outro permite que inicialize o objeto e depois passe os atributos através dos métodos &lt;span style=&quot;font-style: italic;&quot;&gt;Getters&lt;/span&gt; e &lt;span style=&quot;font-style: italic;&quot;&gt;Setters&lt;/span&gt;. Lembre-se que se não criar nenhum construtor, o Java criará um sem parâmetros automaticamente. Mas se criar um com parâmetro, o Java não criará outro. Veja mais sobre construtores &lt;a href=&quot;http://marciosouzajunior.blogspot.com/2010/07/construtores-java.html&quot;&gt;aqui&lt;/a&gt;.&lt;br /&gt;Com isto temos nosso modelo pronto e podemos passar para o &lt;span style=&quot;font-style: italic;&quot;&gt;Controller&lt;/span&gt;, mas antes vamos ver como se conectar ao banco.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Conexão com o Banco&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Clique com o botão direito no projeto e &lt;i&gt;Build Path &gt; Configure Build Path&lt;/i&gt;. Clique em &lt;i&gt;ADD External JARs...&lt;/i&gt; e selecione o arquivo &lt;i&gt;mysql-connector-java-5.1.13-bin.jar&lt;/i&gt; que se encontra dentro da pasta do driver que você baixou. Clique em &lt;span style=&quot;font-style: italic;&quot;&gt;OK&lt;/span&gt;. Agora o driver já está instalado no projeto. Para conectar crie uma classe dentro do pacote &lt;i&gt;default&lt;/i&gt; com o nome &lt;i&gt;Conexao&lt;/i&gt; e implemente conforme este exemplo:&lt;br /&gt;&lt;/div&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;package Principal;&lt;br /&gt;&lt;br /&gt;import java.sql.*;&lt;br /&gt;import javax.swing.JOptionPane;&lt;br /&gt;&lt;br /&gt;public class Conexao {&lt;br /&gt;public static Connection getConnection() throws SQLException {&lt;br /&gt;try {&lt;br /&gt; Class.forName(&quot;com.mysql.jdbc.Driver&quot;);// Registrando o driver&lt;br /&gt; // Retorna a conexão&lt;br /&gt; return DriverManager.getConnection(&lt;br /&gt;   &quot;jdbc:mysql://localhost:3306/agenda&quot;, &quot;root&quot;, &quot;senha&quot;);&lt;br /&gt;} catch (ClassNotFoundException e) {&lt;br /&gt; JOptionPane.showMessageDialog(null,&lt;br /&gt;   &quot;Não foi possível se conectar ao banco!\nInformações sobre o erro: &quot;&lt;br /&gt;     + e, &quot;Conexao&quot;, JOptionPane.ERROR_MESSAGE);&lt;br /&gt; return null;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Na linha onde retorna a conexão você deve mudar a senha. Geralmente as classes de conexão tem outras coisas a mais. Esta aí é bem simples e por enquanto dá pro gasto, mas seria interessante que você fizesse uma pesquisa para saber mais sobre. Vamos deixar essa classe aí e continuar com o projeto.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Controller&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Esta parte do projeto é onde &quot;conversamos&quot; com o banco de dados. Geralmente chamamos as classes que fazem este papel de &lt;span style=&quot;font-style: italic;&quot;&gt;DAO&lt;/span&gt; ou &lt;i&gt;Data Access Object,&lt;/i&gt; porque são objetos que acessam os dados. &lt;span style=&quot;font-style: italic;&quot;&gt;DAO&lt;/span&gt; é um padrão para persistência de dados que separa regras de negócio das regras de acesso ao banco de dados. No&lt;span style=&quot;font-style: italic;&quot;&gt; MVC&lt;/span&gt;, todas as funcionalidades do bancos de dados devem ser feitas por classes &lt;span style=&quot;font-style: italic;&quot;&gt;DAO&lt;/span&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Então crie um pacote chamado &lt;span style=&quot;font-style: italic;&quot;&gt;DAO&lt;/span&gt; (você já deve ter percebido que criar pacotes para cada parte do &lt;span style=&quot;font-style: italic;&quot;&gt;MVC&lt;/span&gt; é uma boa prática).  Dentro do pacote crie uma classe chamada &lt;i&gt;PessoaDAO&lt;/i&gt;, que deverá ter o corpo parecido com isto:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;package DAO;&lt;br /&gt;&lt;br /&gt;import java.sql.Connection;&lt;br /&gt;import java.sql.PreparedStatement;&lt;br /&gt;import java.sql.SQLException;&lt;br /&gt;import java.util.List;&lt;br /&gt;import javax.swing.JOptionPane;&lt;br /&gt;import beans.Pessoa;&lt;br /&gt;//Import que precisa ser corrigido&lt;br /&gt;import Principal.Conexao;&lt;br /&gt;&lt;br /&gt;public class PessoaDAO {&lt;br /&gt;&lt;br /&gt;// Cria uma conexao&lt;br /&gt;private Connection con;&lt;br /&gt;&lt;br /&gt;// Inicializa a conexão no construtor&lt;br /&gt;public PessoaDAO() throws SQLException {&lt;br /&gt;con = Conexao.getConnection();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void remove(Pessoa pessoa) {&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public List/*Pessoa*/ retrieveAll() {&lt;br /&gt;return null;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public Pessoa retrieveByID(String nome) {&lt;br /&gt;return null;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void update(Pessoa pessoa) {&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void save(Pessoa pessoa) {&lt;br /&gt;// Aqui vamos fazer coisas legais!!!&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;A princípio esta classe poderá causar alguns erros. No início criamos a classe de conexão no pacote &lt;i&gt;default&lt;/i&gt;, porém agora para importá-la precisamos que ela esteja em algum pacote. Então crie um pacote chamado &lt;span style=&quot;font-style: italic;&quot;&gt;Principal&lt;/span&gt; e arraste as classes &lt;span style=&quot;font-style: italic;&quot;&gt;Principal&lt;/span&gt; e &lt;span style=&quot;font-style: italic;&quot;&gt;Conexao&lt;/span&gt; para este novo pacote. Outra coisa a ser corrigida é na linha 25 onde tem o método &lt;span style=&quot;font-style: italic;&quot;&gt;retrieveAll&lt;/span&gt; veja que o tipo da lista está comentado /*Pessoa*/ mas deveria estar sem comentar e entre os sinais de maior e menor como pede a sintaxe. Tive que deixar assim porque o blog estava achando que era uma tag de html e causando erro no código.&lt;br /&gt;Esta classe tem vários métodos para manipular os registros do banco de dados. Observe que todos eles utilizando o &lt;i&gt;bean&lt;/i&gt; &lt;span style=&quot;font-style: italic;&quot;&gt;Pessoa &lt;/span&gt;como parâmetro. Neste exemplo não vou mostrar como implementar todos eles, mas somente o &lt;i&gt;save&lt;/i&gt; (no código que vou disponibilizar para download  possui o &lt;span style=&quot;font-style: italic;&quot;&gt;remove&lt;/span&gt; também). Os outros métodos, depois você conseguirá fazer seguindo o mesmo exemplo do &lt;i&gt;save&lt;/i&gt; e com mais algum conhecimento em linguagem &lt;span style=&quot;font-style: italic;&quot;&gt;SQL&lt;/span&gt;. Vejamos como ficará o nosso método &lt;i&gt;save&lt;/i&gt; então:&lt;br /&gt;&lt;/div&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;public void save(Pessoa pessoa) {&lt;br /&gt; // Pega a conexão estabelecida&lt;br /&gt; Connection conn = this.con;&lt;br /&gt; // Cria um PreparedStatement&lt;br /&gt; PreparedStatement pstm = null;&lt;br /&gt;&lt;br /&gt; try {&lt;br /&gt;  // Monta a string sql&lt;br /&gt;  String sql = &quot;Insert into Pessoa(Nome,Telefone) values(?,?);&quot;;&lt;br /&gt;&lt;br /&gt;  /*&lt;br /&gt;   * Lembrando que esta string pode ser montada diretamente com os&lt;br /&gt;   * valores recebidos de pessoa por exemplo:&lt;br /&gt;   * &quot;Insert into Pessoa(Nome,Telefone) values(&quot; + pessoa.getNome() +&lt;br /&gt;   * &quot;... mas usamos os ? ? para uma maior segurança.&lt;br /&gt;   */&lt;br /&gt;&lt;br /&gt;  // Passa a string para o PreparedStatement&lt;br /&gt;  pstm = conn.prepareStatement(sql);&lt;br /&gt;&lt;br /&gt;  // Coloca os verdadeiros valores no lugar dos ?, ?&lt;br /&gt;  pstm.setString(1, pessoa.getNome());&lt;br /&gt;  pstm.setString(2, pessoa.getTelefone());&lt;br /&gt;  // Executa&lt;br /&gt;  pstm.execute();&lt;br /&gt;  // Retorna uma mensagem&lt;br /&gt;  JOptionPane.showMessageDialog(null, &quot;Dados salvos com sucesso!&quot;,&lt;br /&gt;    &quot;Salvar&quot;, JOptionPane.INFORMATION_MESSAGE);&lt;br /&gt; } catch (SQLException e) {&lt;br /&gt;  // Retorna uma mensagem informando o erro&lt;br /&gt;  JOptionPane.showMessageDialog(null,&lt;br /&gt;    &quot;Não foi possível salvar os dados!\nInformações sobre o erro: &quot;&lt;br /&gt;      + e, &quot;Salvar&quot;, JOptionPane.ERROR_MESSAGE);&lt;br /&gt;  e.printStackTrace();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Dica&lt;/span&gt;: Para achar o método olhe a parte direita na interface do Eclipse chamada &lt;i&gt;Outline&lt;/i&gt; e procure por &lt;i&gt;main&lt;/i&gt; (serve pra encontrar outros métodos ou variáveis também).&lt;br /&gt;Agora sempre que o programa for iniciado uma conexão será aberta (e na finalização seria interessante fechar esta conexão mas por hoje não vou mostrar como fazer).&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Inserindo Dados&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;A inserção de dados deverá ocorrer sempre que o botão salvar for acionado. Então vamos chamar o código sempre que este evento acontecer. Para isto clique com o botão direito no botão salvar e &lt;i&gt;Events &gt; actionPerformed&lt;/i&gt;. Será gerado um código igual a este:&lt;br /&gt;&lt;/div&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;  btSalvar.addActionListener(new java.awt.event.ActionListener() {&lt;br /&gt;   public void actionPerformed(java.awt.event.ActionEvent e) {&lt;br /&gt;    System.out.println(&quot;actionPerformed()&quot;); // TODO Auto-generated Event stub actionPerformed()&lt;br /&gt;   }&lt;br /&gt;  });&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Sempre que o botão for clicado este método será executado. No código gerado ele cria um &lt;i&gt;System.out.println(&quot;actionPerformed()&quot;);&lt;/i&gt; como padrão. Apague esta linha e coloque o seguinte código no lugar:&lt;br /&gt;&lt;/div&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;//Criamos um bean&lt;br /&gt;    Pessoa pessoa = new Pessoa(txNome.getText(), txTelefone.getText());&lt;br /&gt;   &lt;br /&gt;    /* Passou os parâmetros pelo construtor mas&lt;br /&gt;     * poderia ter um construtor vazio e passar&lt;br /&gt;     * por metodo set.&lt;br /&gt;     */&lt;br /&gt;    //Vai criar o DAO e inserir&lt;br /&gt;    try {&lt;br /&gt;    &lt;br /&gt;     PessoaDAO pessoaDAO = new PessoaDAO();&lt;br /&gt;     pessoaDAO.save(pessoa); //Aqui é o pulo do gato&lt;br /&gt;    &lt;br /&gt;     //Limpa as caixas&lt;br /&gt;     txNome.setText(&quot;&quot;);&lt;br /&gt;     txTelefone.setText(&quot;&quot;);&lt;br /&gt;     //Nome pede o focus&lt;br /&gt;     txNome.requestFocus();&lt;br /&gt;    &lt;br /&gt;    } catch (SQLException e1) {&lt;br /&gt;     // TODO Auto-generated catch block&lt;br /&gt;     e1.printStackTrace();&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;O código poderá apresentar alguns erros devidos aos &lt;span style=&quot;font-style: italic;&quot;&gt;imports&lt;/span&gt;, neste caso verifique se no canto esquedo da linha que causa o erro mostra um pequeno ícone com uma lâmpada e um X. Clique neste ícone e um menu com soluções vai aparecer, então dê dois cliques na primeira solução que será &lt;i&gt;&#39;Import PessoaDAO&#39; (DAO)&lt;/i&gt;. Veja:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiF3gk-Nd8_os-hWn3yXJ7juOwlan8ItqRE50d28nTAxiZ50eY_8mjarjnAumE3tnwEV6AFsv_5qf0sVhbiq8CHR_8hvkpAkJ9-LPCADq8r_YxBHxMccGHnuWD1WEhd2ejvil6SRsuF2lm/s1600/erro+import.jpg&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 151px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiF3gk-Nd8_os-hWn3yXJ7juOwlan8ItqRE50d28nTAxiZ50eY_8mjarjnAumE3tnwEV6AFsv_5qf0sVhbiq8CHR_8hvkpAkJ9-LPCADq8r_YxBHxMccGHnuWD1WEhd2ejvil6SRsuF2lm/s320/erro+import.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5503762708804024194&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Feito isto finalmente podemos executar nossa aplicação. Clique com o botão direito no código e &lt;i&gt;Run As &gt; Java Application 1&lt;/i&gt;.&lt;br /&gt;Se tudo ocorrer bem o programa irá rodar e se conectar ao banco. Para testar digite dados nos campos e clique em salvar. Se os dados forem salvos uma mensagem será mostrada informando o sucesso da operação:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYdCqjHP4fWtQhuTHUbRGJABMQFJ74b5ZGSI7zO33lqE5dS0euPZx-XHORbuulxq2zT4xLsGsa_rKrzyd6gON99peBESksAmk_9AbbhYLamCyaLnxAUSTOh9II2WOK1ieVES8FQUaSStjK/s1600/IMAGEM+SALVOU+OK.jpg&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 164px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYdCqjHP4fWtQhuTHUbRGJABMQFJ74b5ZGSI7zO33lqE5dS0euPZx-XHORbuulxq2zT4xLsGsa_rKrzyd6gON99peBESksAmk_9AbbhYLamCyaLnxAUSTOh9II2WOK1ieVES8FQUaSStjK/s320/IMAGEM+SALVOU+OK.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5503763812647565186&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Mas os campos não limparam depois de salvar. Para fazer isto coloque dentro do seu &lt;span style=&quot;font-style: italic;&quot;&gt;try&lt;/span&gt; logo após chamar o &lt;span style=&quot;font-style: italic;&quot;&gt;save&lt;/span&gt;, o código:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;//Limpa as caixas&lt;br /&gt;txNome.setText(&quot;&quot;);&lt;br /&gt;txTelefone.setText(&quot;&quot;);&lt;br /&gt;//Nome pede o focus&lt;br /&gt;txNome.requestFocus();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Como ter certeza que os dados foram inseridos no banco? Para saber se os dados foram todos salvos volte ao &lt;span style=&quot;font-style: italic;&quot;&gt;Workbench&lt;/span&gt;, vá em &lt;span style=&quot;font-style: italic;&quot;&gt;File &gt; New Script Tab&lt;/span&gt;. Vamos utilizar uma simples sentença de pesquisa:&lt;br /&gt;&lt;/div&gt;&lt;pre name=&quot;code&quot; class=&quot;sql&quot;&gt;&lt;br /&gt;SELECT * FROM PESSOA;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Mande executar. Se a inserção funcionou então deveremos ver os dados retornados como na figura:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_lK5BBtGTDkWuRujPjJLO2qrfAAdf5cAIxez0sN1L47rv67fWEYFR3Z5bc3pC9d5Rss8cKQ29wQ-fVdx4xt3YLvygyACUyyzYC62m2axdRBRnFE12_sstU_mxoualzfvamyGnpN4y3g_B/s1600/PESQUISA+BANCO.jpg&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 166px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_lK5BBtGTDkWuRujPjJLO2qrfAAdf5cAIxez0sN1L47rv67fWEYFR3Z5bc3pC9d5Rss8cKQ29wQ-fVdx4xt3YLvygyACUyyzYC62m2axdRBRnFE12_sstU_mxoualzfvamyGnpN4y3g_B/s320/PESQUISA+BANCO.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5503765256353932530&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Se por algum motivo os dados não forem salvos, possivelmente será mostrada uma mensagem com informações relevantes sobre o erro ocorrido. Se por acaso não salvar e mesmo assim nenhuma mensagem de erro não aparecer tente verificar se a sentença &lt;span style=&quot;font-style: italic;&quot;&gt;SQL&lt;/span&gt; está correta. Para fazer isto coloque o comando abaixo antes que o &lt;i&gt;execute&lt;/i&gt; seja chamado no &lt;span style=&quot;font-style: italic;&quot;&gt;DAO&lt;/span&gt;:&lt;br /&gt;&lt;/div&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;JOptionPane.showMessageDialog(null, pstm);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Fazendo isto você vai mostrar uma mensagem com a string &lt;span style=&quot;font-style: italic;&quot;&gt;SQL&lt;/span&gt; antes de executar e poderá verificar se tem algo de errado com ela. No exemplo mostrado dificilmente você vai errar porque tem poucos parâmetros mas em programas maiores é sempre bom conferir se a montagem está correta.&lt;br /&gt;Agora tente executar uma nova inserção com o mesmo nome. Uma mensagem de erro será mostrada:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkzCKdWzmTsk48JcizDcl0XETD7zCfjGuSSpp_sBzSunmNIrno0DXgIkGvx1ocRbVpSaHFvWYgS7BhGowUxtvN_PT3jq0yLegv211SyrdCSBpalKmDi9jaapAiOV5iqWT-Qg2o4exwnFRE/s1600/ERRO+PRIMARY+KEY.jpg&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 55px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkzCKdWzmTsk48JcizDcl0XETD7zCfjGuSSpp_sBzSunmNIrno0DXgIkGvx1ocRbVpSaHFvWYgS7BhGowUxtvN_PT3jq0yLegv211SyrdCSBpalKmDi9jaapAiOV5iqWT-Qg2o4exwnFRE/s320/ERRO+PRIMARY+KEY.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5503767612085320802&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Como o campo nome foi definido como &lt;span style=&quot;font-style: italic;&quot;&gt;PRIMARY KEY&lt;/span&gt; (chave primária) e houve uma tentativa de violar a chave, uma exceção foi lançada.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Conclusão&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Sei que é muita informação para um post só mas é isso aí. Tentei passar de uma forma bem simples e espero ter contribuído. Aqui vai o &lt;a href=&quot;http://www.4shared.com/file/0VHq__U6/ProjetoExemplo.html&quot;&gt;código fonte do projeto&lt;/a&gt; pra quem quiser dar uma olhada. Até a próxima!&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marciosouzajunior.blogspot.com/feeds/2697420228357333152/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://marciosouzajunior.blogspot.com/2010/08/eclipse-visual-editor-mysql.html#comment-form' title='8 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/2697420228357333152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/2697420228357333152'/><link rel='alternate' type='text/html' href='http://marciosouzajunior.blogspot.com/2010/08/eclipse-visual-editor-mysql.html' title='Eclipse - Visual Editor - MySQL'/><author><name>Márcio de Souza Júnior</name><uri>http://www.blogger.com/profile/01965624113971008303</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7426nMbOktw1JEw_7D9s8OUdiw_dlIOgRdQg2WUiddmnyYKKpNNMBGpm-LoReSOiQIPecOTrNwYrbEpxH5XtBhARnlzmS-EE576mLo_GTLqyan1AFiAYESltpP1mmuOK7_Di5ILAfPXdI/s72-c/SQL1.jpg" height="72" width="72"/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5856286885704734621.post-8063301642797053621</id><published>2010-07-30T12:57:00.000-03:00</published><updated>2013-03-20T08:10:22.130-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="scjp"/><category scheme="http://www.blogger.com/atom/ns#" term="threads"/><title type='text'>Threads - Java</title><content type='html'>Olá, tudo bem?&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Hoje vou tratar de um assunto muito interessante: &lt;i&gt;Threads&lt;/i&gt;. Mas antes quero comentar outra coisa: Tenho desenvolvido uma forma bem legal de estudar para a certificação e creio que possa se aplicar a outros campos também. Funciona da seguinte maneira: Você vai lendo até chegar numa parte que o assunto ficou cansativo, então pule para outro capítulo que ache interessante. Isso proporciona uma visão global do assunto quando voltar aos primeiros capítulos e te mantém interessado nos estudos.&lt;/div&gt;
&lt;br /&gt;
Mas vamos ao que interessa. Pra começar, o que são &lt;span style=&quot;font-style: italic;&quot;&gt;threads&lt;/span&gt;???&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-style: italic;&quot;&gt;Threads&lt;/span&gt; são linhas de execução de um processo. É a maneira de um processo se dividir em duas ou mais partes para que possam ser executadas &quot;ao mesmo tempo&quot;. Nem sempre é ao mesmo tempo porque na maioria das vezes temos somente uma &lt;span style=&quot;font-style: italic;&quot;&gt;CPU&lt;/span&gt; disponível. Então alguém fica a cargo de dividir as fatias de tempo entre os concorrentes. Embora quase sempre, mesmo com apenas uma &lt;span style=&quot;font-style: italic;&quot;&gt;CPU&lt;/span&gt;, temos a impressão de que tudo está sendo feito ao mesmo tempo. Mas não está! A &lt;span style=&quot;font-style: italic;&quot;&gt;CPU&lt;/span&gt; está processando um pouco de cada coisa pra te dar essa impressão. Este assunto é bem vasto, mas vamos nos ater aos&lt;span style=&quot;font-style: italic;&quot;&gt; threads&lt;/span&gt;.&lt;br /&gt;
Um processo no contexto que estou falando seria o programa. Poderíamos desejar que o programa faça várias coisas ao mesmo tempo. Por exemplo, um &lt;span style=&quot;font-style: italic;&quot;&gt;browser&lt;/span&gt;: Quando o &lt;span style=&quot;font-style: italic;&quot;&gt;browser&lt;/span&gt; carrega uma página com muitas imagens, ele se conecta a vários &lt;span style=&quot;font-style: italic;&quot;&gt;links&lt;/span&gt; para baixar as imagens ao mesmo tempo. Ele não abre uma por uma, existe um &lt;span style=&quot;font-style: italic;&quot;&gt;thread&lt;/span&gt; para cada tarefa de forma que todas são executadas ao mesmo tempo. Lembre-se que &quot;ao mesmo tempo&quot; nem sempre é verdade, mas vamos acreditar que seja.&lt;br /&gt;
Em &lt;span style=&quot;font-style: italic;&quot;&gt;Java&lt;/span&gt;, podemos implementar &lt;span style=&quot;font-style: italic;&quot;&gt;threads&lt;/span&gt; instanciando a classe &lt;i&gt;java.lang.Thread&lt;/i&gt;. Um objeto do tipo &lt;span style=&quot;font-style: italic;&quot;&gt;Thread&lt;/span&gt; é um objeto como qualquer outro, possui métodos e variáveis. A grande diferença é que ele pussui sua própria pilha de chamada (falei da pilha &lt;a href=&quot;http://marciosouzajunior.blogspot.com/2010/07/construtores-java.html&quot;&gt;nesse post&lt;/a&gt; sobre construtores). O método &lt;i&gt;main&lt;/i&gt; é responsável por iniciar todo o processamento, portanto ele é considerado o &lt;span style=&quot;font-style: italic;&quot;&gt;thread &lt;/span&gt;principal.&lt;br /&gt;
As perguntas sobre &lt;span style=&quot;font-style: italic;&quot;&gt;thread&lt;/span&gt; no exame são consideradas a mais difíceis! Portanto é bom praticar muito.&lt;/div&gt;
Vamos ver um pouco de ação:&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
class MyRunnable implements Runnable /*ou extends Thread*/{

public void run() {
  System.out.println(&quot;Rodando meu Thread&quot;);
}

}&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Como você pode ver, temos uma classe que implementa &lt;i&gt;Runnable&lt;/i&gt;. Existem duas formas de se trabalhar com threads, implementando &lt;i&gt;Runnable&lt;/i&gt; ou estendendo &lt;i&gt;Thread&lt;/i&gt;. Você deve conhecer estas duas formas para o exame, mas geralmente a melhor prática é implementar, pois assim fica livre para estender outra classe.&lt;br /&gt;
Quando implementamos &lt;i&gt;Runnable&lt;/i&gt; devemos sobrescrever o método &lt;i&gt;run&lt;/i&gt;. Dentro do método &lt;i&gt;run&lt;/i&gt; colocamos todo o trabalho que desejamos executar concorrentemente. Se por acaso tivéssemos escolhido estender &lt;i&gt;Thread&lt;/i&gt;, o método &lt;span style=&quot;font-style: italic;&quot;&gt;run&lt;/span&gt; deveria ser sobrescrito da mesma forma.&lt;br /&gt;
Mas esta classe não faz nada ainda. Apenas estamos dizendo que o código dentro de &lt;i&gt;run&lt;/i&gt; deverá ser executado por um &lt;span style=&quot;font-style: italic;&quot;&gt;thread&lt;/span&gt;. Agora realmente vamos ter um pouco de ação:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
public class MyThread {

public static void main(String[] args) {

  MyRunnable mr = new MyRunnable();
  Thread t = new Thread(mr);
  t.start();

}
}&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Em uma outra classe instanciamos &lt;span style=&quot;font-style: italic;&quot;&gt;MyRunnable&lt;/span&gt;. Criamos um objeto tipo &lt;i&gt;Thread&lt;/i&gt; e passamos como parâmetro a variável que faz referência a &lt;span style=&quot;font-style: italic;&quot;&gt;MyRunnable&lt;/span&gt;. Então iniciamos o &lt;span style=&quot;font-style: italic;&quot;&gt;thread&lt;/span&gt;. O resultado é:&lt;br /&gt;
&lt;pre&gt;
Rodando meu Thread.&lt;/pre&gt;
&lt;br /&gt;
Sempre devemos deixar o código do trabalho a ser feito pelo&lt;span style=&quot;font-style: italic;&quot;&gt; thread &lt;/span&gt;separado do código que vai chamá-lo, da maneira como foi mostrado. Em uma classe escrevemos o que era pra ser feito, em outra pedimos pra fazer.&lt;br /&gt;
Também é importante lembrar que o &lt;span style=&quot;font-style: italic;&quot;&gt;thread&lt;/span&gt; sempre espera que sua classe tenha um método &lt;i&gt;run&lt;/i&gt; sem parâmetros. Se este método for sobrecarregado, o &lt;span style=&quot;font-style: italic;&quot;&gt;thread &lt;/span&gt;não vai chamá-lo, e mesmo que você chame-o, a execução não será a esperada de um &lt;span style=&quot;font-style: italic;&quot;&gt;thread.&lt;/span&gt; A execução acontecerá na mesma pilha de &lt;i&gt;main&lt;/i&gt;.&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Instanciando um thread&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Podemos instanciar um &lt;span style=&quot;font-style: italic;&quot;&gt;thread&lt;/span&gt; de duas formas. A primeira acontece quando estendemos &lt;i&gt;Thread&lt;/i&gt;:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
class MyRunnable extends Thread{

public void run() {
  System.out.println(&quot;Rodando meu Thread&quot;);
}
}

public class MyThread{

public static void main(String[] args) {

  MyRunnable mr = new MyRunnable();
  //Thread t = new Thread(mr);
  mr.start();

}
}&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Veja que esta forma é mais simples, pois &lt;i&gt;MyRunnable&lt;/i&gt; já estendeu &lt;span style=&quot;font-style: italic;&quot;&gt;Thread&lt;/span&gt;. Então precisamos somente instanciar para executar. Mas temos implicações, pois não podemos estender outras classes. A segunda forma é a que foi mostrada primeiramente, onde implementamos &lt;span style=&quot;font-style: italic;&quot;&gt;Runnable.&lt;/span&gt; Primeiro precisamos instanciar &lt;i&gt;MyRunnable&lt;/i&gt; e depois &lt;i&gt;Thread&lt;/i&gt;:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
MyRunnable mr = new MyRunnable();
Thread t = new Thread(mr);&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Também poderíamos passar &lt;i&gt;MyRunnable&lt;/i&gt; para diferentes &lt;span style=&quot;font-style: italic;&quot;&gt;threads&lt;/span&gt;, de modo que todos eles executem a mesma tarefa:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
MyRunnable mr = new MyRunnable();
Thread t1 = new Thread(mr);
Thread t2 = new Thread(mr);
Thread t3 = new Thread(mr);

t1.start();
t2.start();
t3.start();&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Outra observação válida para o exame é que podemos passar um &lt;span style=&quot;font-style: italic;&quot;&gt;thread&lt;/span&gt; ao construtor de outro &lt;span style=&quot;font-style: italic;&quot;&gt;thread&lt;/span&gt;. Suponhamos que neste caso&lt;i&gt; MyRunnable&lt;/i&gt; estende &lt;i&gt;Thread&lt;/i&gt;, portanto ela É-UM &lt;span style=&quot;font-style: italic;&quot;&gt;thread&lt;/span&gt;. Então podemos passá-la a um construtor de outro &lt;span style=&quot;font-style: italic;&quot;&gt;thread&lt;/span&gt;:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
Thread t = new Thread(new MyRunnable());&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Isso é possível porque &lt;i&gt;Thread&lt;/i&gt; possui vários construtores sobrecarregados e um deles aceita objetos &lt;span style=&quot;font-style: italic;&quot;&gt;Runnable&lt;/span&gt;. Então como &lt;span style=&quot;font-style: italic;&quot;&gt;Thread&lt;/span&gt; implementa &lt;span style=&quot;font-style: italic;&quot;&gt;Runnable&lt;/span&gt;, podemos passar tanto um &lt;span style=&quot;font-style: italic;&quot;&gt;Runnable&lt;/span&gt; quanto um &lt;span style=&quot;font-style: italic;&quot;&gt;Thread&lt;/span&gt;.   Mas passar um &lt;span style=&quot;font-style: italic;&quot;&gt;Thread&lt;/span&gt; é totalmente desnecessário porque cria um novo&lt;span style=&quot;font-style: italic;&quot;&gt; thread&lt;/span&gt; sendo que o ideal é passar somente um &lt;i&gt;Runnable&lt;/i&gt;.&lt;br /&gt;
Tenha em mente também que chamar o método &lt;i&gt;run&lt;/i&gt; diretamente de uma classe que implementa &lt;i&gt;Runnable&lt;/i&gt; é válido, porém não significa que vai se comportar como um&lt;span style=&quot;font-style: italic;&quot;&gt; thread&lt;/span&gt;:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
MyRunnable mr = new MyRunnable();
mr.run();&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
A chamada entrará na pilha local, pois sempre que quisermos executar com &lt;span style=&quot;font-style: italic;&quot;&gt;thread &lt;/span&gt;devemos instanciar &lt;i&gt;Thread&lt;/i&gt;. Lembre-se que o método que inicia o &lt;span style=&quot;font-style: italic;&quot;&gt;thread&lt;/span&gt; é &lt;i&gt;start()&lt;/i&gt; e não &lt;i&gt;run&lt;/i&gt;.&lt;br /&gt;
Até agora estamos indo bem, mas não tiramos proveito do recurso em momento algum. Como saberemos se os &lt;span style=&quot;font-style: italic;&quot;&gt;threads&lt;/span&gt; estão sendo executados ao mesmo tempo? Como poderemos ter certeza que eles não estão sendo executados um após o outro em sequência? Vamos modificar a classe &lt;i&gt;MyRunnable&lt;/i&gt;:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
class MyRunnable implements Runnable{
public void run() {
  System.out.println(&quot;Meu nome é: &quot; + Thread.currentThread().getName());
}
}&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Agora cada &lt;span style=&quot;font-style: italic;&quot;&gt;thread&lt;/span&gt; que executar terá que mostrar seu nome. Não se preocupe em não ter uma instância de &lt;i&gt;Thread&lt;/i&gt; na classe pois o método chamado é estático. Ele retorna uma referência ao &lt;span style=&quot;font-style: italic;&quot;&gt;thread&lt;/span&gt; em execução e depois pega o nome dele. Agora vamos executar:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
public class MyThread{

public static void main(String[] args) {

  MyRunnable mr = new MyRunnable();
  Thread t1 = new Thread(mr);
  Thread t2 = new Thread(mr);
  Thread t3 = new Thread(mr);

  t1.start();
  t2.start();
  t3.start();
}
}&lt;/pre&gt;
&lt;br /&gt;
A saída será parecida com a seguinte:&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Meu nome é: Thread-0&lt;br /&gt;Meu nome é: Thread-2&lt;br /&gt;Meu nome é: Thread-1&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
E se mandar executar outra vez?&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Meu nome é: Thread-2&lt;br /&gt;Meu nome é: Thread-0&lt;br /&gt;Meu nome é: Thread-1&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
E em cada execução o resultado poderá ser diferente. Não podemos prever a ordem que eles serão executados. Não há garantia nenhuma. O mecanismo responsável por alocar os &lt;span style=&quot;font-style: italic;&quot;&gt;threads&lt;/span&gt; (agendador) é quem decide quem vai entrar em execução (ou sair, ou esperar). A única coisa que podemos ter certeza é que cada &lt;span style=&quot;font-style: italic;&quot;&gt;thread&lt;/span&gt; será iniciado e executado até a sua conclusão.&lt;br /&gt;
Vamos ver mais um exemplo pra fechar o post. Faça a seguinte mudança no método &lt;i&gt;run&lt;/i&gt;:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
public void run() {
    for(int x = 0; x /* sinal de menor aqui */ 100; x++){
System.out.println(&quot;Meu nome é: &quot; + Thread.currentThread().getName() + &quot; e x = &quot; + x);
}&lt;/pre&gt;
&lt;br /&gt;
A saída que eu obtive em uma das execuções foi:&lt;br /&gt;
&lt;pre&gt;Meu nome é: Thread-0 e x = 0
Meu nome é: Thread-0 e x = 1
Meu nome é: Thread-0 e x = 2
Meu nome é: Thread-1 e x = 0
Meu nome é: Thread-1 e x = 1
Meu nome é: Thread-1 e x = 2
Meu nome é: Thread-1 e x = 3
Meu nome é: Thread-1 e x = 4
Meu nome é: Thread-1 e x = 5
Meu nome é: Thread-0 e x = 3
Meu nome é: Thread-0 e x = 4
Meu nome é: Thread-0 e x = 5
...&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Veja que &lt;span style=&quot;font-style: italic;&quot;&gt;Thread-0&lt;/span&gt; toma a &lt;span style=&quot;font-style: italic;&quot;&gt;CPU&lt;/span&gt; e conta até 2, então sai de cena. Entra &lt;span style=&quot;font-style: italic;&quot;&gt;Thread-1&lt;/span&gt;. Por algum motivo que não sabemos explicar, a &lt;span style=&quot;font-style: italic;&quot;&gt;CPU&lt;/span&gt; permitiu que &lt;span style=&quot;font-style: italic;&quot;&gt;Thread-1&lt;/span&gt; contasse até 5. Então a &quot;bola&quot; volta pra &lt;span style=&quot;font-style: italic;&quot;&gt;Thread-0&lt;/span&gt; que continua. E &lt;span style=&quot;font-style: italic;&quot;&gt;Thread-2&lt;/span&gt;? Até o momento ainda não recebeu sua parcela da &lt;span style=&quot;font-style: italic;&quot;&gt;CPU,&lt;/span&gt; coitado!&lt;/div&gt;
Então finalizo este post e aproveito para dizer que o conteúdo passado aqui é somente o básico, tem muito mais sobre&lt;span style=&quot;font-style: italic;&quot;&gt; threads&lt;/span&gt; do que você imagina. Se possível outro dia volto a falar&lt;span style=&quot;font-style: italic;&quot;&gt; &lt;/span&gt;mais sobre o assunto.&lt;br /&gt;
&lt;br /&gt;
Bons estudos!</content><link rel='replies' type='application/atom+xml' href='http://marciosouzajunior.blogspot.com/feeds/8063301642797053621/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://marciosouzajunior.blogspot.com/2010/07/threads-java_30.html#comment-form' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/8063301642797053621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/8063301642797053621'/><link rel='alternate' type='text/html' href='http://marciosouzajunior.blogspot.com/2010/07/threads-java_30.html' title='Threads - Java'/><author><name>Márcio de Souza Júnior</name><uri>http://www.blogger.com/profile/01965624113971008303</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5856286885704734621.post-6997283635301508569</id><published>2010-07-28T17:51:00.000-03:00</published><updated>2013-02-01T08:54:28.505-02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="primitivos"/><category scheme="http://www.blogger.com/atom/ns#" term="scjp"/><category scheme="http://www.blogger.com/atom/ns#" term="variáveis"/><title type='text'>Tipos Primitivos - Java</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
Hoje vou falar sobre tipos primitivos em Java. Veremos uma breve introdução sobre variáveis e em seguida detalhes sobre cada tipo.&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Variáveis&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Variáveis são espaços na memória onde podemos guardar informações. Provavelmente todos programas que você escrever vão usar variáveis, seja para guardar um nome, o caminho de uma pasta, etc. Também, como o próprio nome diz, elas podem variar, ter seu valor modificado durante a execução do programa.&lt;br /&gt;
Variáveis são nada mais que depósitos de bits. Cada valor é convertido para binário e então pode ser colocado na memória. Usamos o nome da variável para acesar o valor. O nome da variável é apenas o endereço para acessar o valor atribuído a ela.&lt;br /&gt;
As variáveis possuem tipos diferentes, dependendo da informação a ser armazenada. Por exemplo: Podemos ter um depósito tipo &lt;i&gt;short&lt;/i&gt; que nos dará um espaço para guardar qualquer valor que convertido em binário possua 16 bits (65535 valores possíveis).&lt;br /&gt;
Em Java temos os seguintes tipos primitivos:&lt;/div&gt;
&lt;blockquote&gt;
&lt;pre&gt;Tipo      Bits      Bytes
___________________________
byte     8         1
short    16        2
int      32        4
long     64        8
float    32        4
double   64        8
char     16        2
boolean  -         -&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Eles são chamados de tipos primitivos porque são tipos já pre definidos pela linguagem e seus nomes são palavras reservadas. Eles não são como os objetos. Objetos são um tipo de dado criado pelo usuário que possuem um estado e tem métodos. Primitivos não possuem estados nem métodos. Objetos podem mudar de tipo, mas os primitivos não. Uma vez declarado o tipo, assim ele será e somente o valor poderá mudar.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Os primitivos apenas determinam o tipo e o tamanho da informação a ser guardado. Vou fazer um breve comentário sobre os tipos primitivos disponíveis em Java:&lt;/div&gt;
&lt;ul style=&quot;text-align: justify;&quot;&gt;
&lt;li&gt;&lt;i style=&quot;font-weight: bold;&quot;&gt;byte&lt;/i&gt;: O &lt;i&gt;byte&lt;/i&gt; aceita até 256 valores. Eles podem estar compreendidos entre -128 &amp;lt;= x &amp;lt;= 127. Porque alguém usaria um tipo desses? Poderia usar para salvar &lt;span style=&quot;font-style: italic;&quot;&gt;bytes&lt;/span&gt; num grande vetor, como uma memória virtual. &lt;/li&gt;
&lt;li&gt;&lt;i style=&quot;font-weight: bold;&quot;&gt;short&lt;/i&gt;: O tipo &lt;span style=&quot;font-style: italic;&quot;&gt;short &lt;/span&gt;suporta valores entre -32,768 &amp;lt;= x &amp;lt;= 32,767. Ele possui o dobro de tamanho do &lt;span style=&quot;font-style: italic;&quot;&gt;byte&lt;/span&gt; e sua aplicação poderia ser a mesma. Não se preocupe em decorar esses intervalos. Apenas o intervalo do tipo &lt;span style=&quot;font-style: italic;&quot;&gt;byte&lt;/span&gt; é bom saber mas os outros saiba apenas o número de bits de acordo com a tabela. &lt;/li&gt;
&lt;li&gt;&lt;i style=&quot;font-weight: bold;&quot;&gt;int&lt;/i&gt;: O tipo &lt;i&gt;int&lt;/i&gt; está compreendido entre -2,147,483,648 &amp;lt;= x &amp;lt;= 2,147,483,647. Geralmente esse tipo é usado como padrão para valores inteiros. E muitas vezes, para os valores que seu programa usará, este tipo dá e sobra! &lt;/li&gt;
&lt;li&gt;&lt;i style=&quot;font-weight: bold;&quot;&gt;long&lt;/i&gt;: Um valor do tipo &lt;i&gt;long&lt;/i&gt; pode estar entre 9,223,372,036,854,775,808 &amp;lt;= x &amp;lt;= 9,223,372,036,854,775,807. Como você pode ver, este tipo é usado quando precisar guardar valores realmente grandes que o &lt;i&gt;int&lt;/i&gt; não poderia fazê-lo.&lt;/li&gt;
&lt;li&gt;&lt;i style=&quot;font-weight: bold;&quot;&gt;float&lt;/i&gt;: O intervalo de números deste tipo é complicado de determinar, apenas saiba que ele possui 32 bits de precisão. Ele é usado para representar os números reais, não só inteiros mas também os fracionários. O formato desse tipo de número é normalmente chamado de &lt;i&gt;floating point&lt;/i&gt; ou ponto flutuante. Eles podem representar números com uma boa precisão fornecendo uma aproximação para valores imensos. A forma como são representados pela linguaguem é um assunto muito interessante, recomendo que você procure &lt;a href=&quot;http://pt.wikipedia.org/wiki/Ponto_flutuante&quot;&gt;algo sobre&lt;/a&gt; se ainda não conhece. Obs.: Este tipo nunca deve ser usado para valores realmente precisos, como moeda por exemplo. Para isto use a classe &lt;i&gt;java.math.BigDecimal&lt;/i&gt;.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;double&lt;/span&gt;:&lt;/i&gt; Assim como o &lt;i&gt;float&lt;/i&gt;, o &lt;i&gt;double&lt;/i&gt; representa números &lt;i&gt;floating point&lt;/i&gt;. A diferença é que ele possui 64 bits de precisão. Para valores decimais (não inteiro) esse tipo é a melhor escolha. Como mencionado anteriormente, ele também não pode ser usado para representar valores de moeda.&lt;/li&gt;
&lt;li&gt;&lt;i style=&quot;font-weight: bold;&quot;&gt;char&lt;/i&gt;: O tipo &lt;i&gt;char&lt;/i&gt; representa um único caractere &lt;a href=&quot;http://java.about.com/od/programmingconcepts/a/unicode.htm&quot;&gt;&lt;i&gt;Unicode&lt;/i&gt;&lt;/a&gt;. &lt;i&gt;Unicode&lt;/i&gt; é um padrão para representar caracteres utilizando números inteiros de 16 bits (sem sinal). Assim ele pode armazenar o mesmo tamanho de informação que um &lt;i&gt;short&lt;/i&gt; poderia, exceto que ele sua faixa é apenas números positivos. Pode-se digitar valores &lt;i&gt;Unicode&lt;/i&gt; utilizano o prefixo &quot;\u&quot;.&lt;/li&gt;
&lt;li&gt;&lt;i style=&quot;font-weight: bold;&quot;&gt;boolean&lt;/i&gt;: Esse tipo de dado só tem duas possibilidades: &lt;i&gt;false&lt;/i&gt; ou &lt;i&gt;true&lt;/i&gt;. Ele representa um bit de informação, embora seu &quot;tamanho&quot; não é algo precisamente definido. Desta forma valores booleanos podem ser somente uma das possibilidades citadas, nunca tente usar 0 ou 1! Outras linguagens como c++ aceitam isto, mas Java não.&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
É importante saber a sequência: &lt;i&gt;byte&lt;/i&gt;, &lt;i&gt;short&lt;/i&gt;, &lt;i&gt;int&lt;/i&gt;, &lt;i&gt;long&lt;/i&gt;, &lt;i&gt;float&lt;/i&gt;, &lt;i&gt;double&lt;/i&gt;.  Lembre que &lt;i&gt;double&lt;/i&gt; é maior que &lt;i&gt;float&lt;/i&gt;, o próprio nome diz que é o dobro de precisão.&lt;br /&gt;
Outro detalhe é que todos tipos numéricos possuem sinal, isto é, podem ser tanto positivos quanto negativos e que isto afeta seu intervalo.&lt;br /&gt;
Como disse no começo do tópico, os valores são guardados em formato binário (001011...), sendo assim precisamos de um desses bits para definir o sinal do número. Este bit será o que se encontra mais a esquerda do número. Por exemplo: Temos um &lt;i&gt;byte&lt;/i&gt; 00010011. O primeiro zero a esquerda representa o sinal. Sobram sete bits para representar o número, ou seja, 2^7 = 128 possibilidades.&lt;br /&gt;
Portanto, o &lt;i&gt;byte&lt;/i&gt; pode representar valores entre -128 &amp;lt;= x &amp;lt;= 127, ou melhor: de -128 a -1 e de 0 a 127. Também podemos dizer que há 256 valores aí, metade negativa e metade -1 positiva. Menos um porque os positivos começam pelo zero, e ele é considerado um binário positivo.&lt;br /&gt;
A fórmula para calcular o intervalo mínimo (negativo) é -2^(bits - 1) e o máximo (positivo) é 2^(bits - 1) - 1.&lt;br /&gt;
Lembrando também que em Java não existe a palavra &lt;span style=&quot;font-style: italic;&quot;&gt;unsigned&lt;/span&gt; como em c++. Isto que dizer que todos valores devem respeitar as faixas permitidas como foi mostrado anteriormente. Não tente fazer algo como &lt;span style=&quot;font-style: italic;&quot;&gt;byte b = 128;&lt;/span&gt; sem fazer nenhuma conversão.&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Bom, por hoje é só e bons estudos!&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://marciosouzajunior.blogspot.com/feeds/6997283635301508569/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://marciosouzajunior.blogspot.com/2010/07/tipos-primitivos-java.html#comment-form' title='9 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/6997283635301508569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/6997283635301508569'/><link rel='alternate' type='text/html' href='http://marciosouzajunior.blogspot.com/2010/07/tipos-primitivos-java.html' title='Tipos Primitivos - Java'/><author><name>Márcio de Souza Júnior</name><uri>http://www.blogger.com/profile/01965624113971008303</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5856286885704734621.post-2725712007001120258</id><published>2010-07-23T17:02:00.001-03:00</published><updated>2014-09-20T15:01:12.064-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="overloading"/><category scheme="http://www.blogger.com/atom/ns#" term="overrinding"/><category scheme="http://www.blogger.com/atom/ns#" term="scjp"/><category scheme="http://www.blogger.com/atom/ns#" term="sobrecarga"/><category scheme="http://www.blogger.com/atom/ns#" term="sobrescrita"/><title type='text'>Sobrescrita / Sobercarga (Overriding / Overloading) - Java</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
O assunto de hoje é sobre o objetivo 1.5 e 5.4 do exame SCJP. Os objetivos são basicamente determinar se um método esta corretamente sendo sobrescrito ou sobrecarregado e sobre os tipos de retorno válidos para o método.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Também fala sobre desenvolver código que declare e chame métodos sobrescritos ou sobrecarregados, e códigos que chamem construtores da superclasse sendo eles sobrescritos ou sobrecarregados.&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Métodos sobrescritos&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Sempre que herdamos um método da superclasse, podemos sobrescrevê-lo. Fazendo isto temos a oportunidade de determinar um comportamento específico do método para a subclasse. Então estamos dizendo &lt;i&gt;&quot;Sei que existe um método genérico herdado da superclasse para fazer isto, mas este método não me serve e quero que esta subclasse tenha o seu próprio&quot;.&lt;/i&gt; Tudo bem, mas não esqueça que métodos marcados como &lt;i&gt;final, private ou static&lt;/i&gt; não são herdados e por este motivo não podem ser sobrescritos.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Para demonstrar como os métodos são sobrescritos vou usar o mesmo código que usei no tópico sobre &lt;a href=&quot;http://marciosouzajunior.blogspot.com/2010/07/conversao-de-tipos-ou-casting-java.html&quot;&gt;&lt;i&gt;casting&lt;/i&gt;&lt;/a&gt;:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;//Superclasse
public class Animal {

void comer(){
 System.out.println(&quot;Animal comendo...&quot;);
}

}
//Subclasse
class Dog extends Animal{

void rolar(){
 System.out.println(&quot;Dog rolando...&quot;);
}
//Dog sobrescreveu o método comer
void comer(){
 System.out.println(&quot;Dog comendo...&quot;);
}
}&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Dog herdou o método comer de animal mas por algum motivo teve que escrever seu próprio método comer. Então se num determinado momento quisermos chamar:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;new Dog().comer();&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Teremos o resultado &lt;i&gt;Dog comendo...&lt;/i&gt;. Sem problemas.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Vamos analisar alguns casos agora. Se você herdou métodos abstratos de uma classe abstrata, então é obrigatório sobrescrevê-los (na prática você estaria implementando porque não tem nada pra sobrescrever). Mas se sua classe também for abstrata não precisa, você pode simplente &quot;passar a vez&quot; para a última classe concreta da árvore. Só não esqueça que em algum momento você será obrigado a sobrescrever os métodos &lt;i&gt;abstract&lt;/i&gt;.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Uma questão interessante que também foi abordada no post sobre &lt;a href=&quot;http://marciosouzajunior.blogspot.com/2010/07/conversao-de-tipos-ou-casting-java.html&quot;&gt;&lt;i&gt;casting&lt;/i&gt;&lt;/a&gt; é a seguinte: Quando sobrescrevemos um método e depois fazemos o &lt;i&gt;upcast&lt;/i&gt;, qual método será chamado? Seguindo o mesmo exemplo do código acima, se fizermos a seguinte chamada:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;Animal a = new Dog();
a.comer();&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Qual versão do método será executada? Sabemos que quando convertemos pra cima da árvore de herança, os métodos do subtipo são perdidos mas neste caso a versão executada será a do subtipo. Porque? O compilador só verifica o tipo da variável e não da da instância. A referência é do tipo Animal? Então só métodos de Animal poderão ser executados. Mas em tempo de execução, o objeto real que está sendo executado é Dog, então o método de Dog será chamado.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Parece confuso mas pense: Estamos criando uma referência Animal para Dog. O que o compilador vai fazer? Ele vai pensar &lt;i&gt;&quot;Vou criar um objeto tipo Dog na memória e uma variável x tipo Animal que aponte pra este objeto.&quot;&lt;/i&gt; A variável sendo do tipo Animal não tem conhecimento dos métodos em Dog. Acontece que quando o programa for executado a JVM vai pensar &lt;i&gt;&quot;A variável x está chamando o método em Animal, mas o objeto sobrescreveu? Então execute o método do objeto!&quot;&lt;/i&gt;.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Outro ponto importante é que os métodos sobrescritos não podem declarar um &lt;a href=&quot;http://marciosouzajunior.blogspot.com/2010/07/modificadores-de-acesso-em-java.html&quot;&gt;modificador de acesso&lt;/a&gt; mais restritivo do que o que foi sobrescrito. Por exemplo:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;//Superclasse
public class Animal {

protected void comer(){
 System.out.println(&quot;Animal comendo...&quot;);
}

}
//Subclasse
class Dog extends Animal{

void comer(){ //Problema!!!
 System.out.println(&quot;Dog comendo...&quot;);
}
}&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Declaramos o método como &lt;i&gt;protected&lt;/i&gt; mas depois tentamos deixá-lo &lt;i&gt;default&lt;/i&gt;. Isto não compila porque &lt;i&gt;default&lt;/i&gt; é mais restritivo que &lt;i&gt;protected&lt;/i&gt;. Como expliquei antes, em tempo de execução, a JVM chama a versão do método sobrescrito, e o modificador de acesso ficou mais restrito. Se ele estivesse em um pacote diferente não poderia ser chamado.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Vamos ver agora umas regras importantes:&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;b&gt; A lista de argumentos deve se manter a mesma!&lt;/b&gt;. Se ela mudar o método não será mais sobrescrito e sim sobrecarregado. Lembre-se que sobrescrever não é nada mais que usar o mesmo nome do método herdado.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;b&gt; O modificador de acesso do novo método não pode ser mais restritivo (menos pode)&lt;/b&gt;. Já falei sobre isto!&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;b&gt; Métodos só podem ser sobrescritos se forem herdados. Ou seja, métodos final, private ou static não podem.&lt;/b&gt; E classes fora do pacote só podem sobrescrever métodos &lt;i&gt;public&lt;/i&gt; ou &lt;i&gt;protected&lt;/i&gt; (métodos &lt;i&gt;protected&lt;/i&gt; são herdados).&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;b&gt; O tipo de retorno deve ser o mesmo ou um subtipo do método original&lt;/b&gt;. Isto chama-se retornos covariantes ou &lt;i&gt;covariant returns&lt;/i&gt;. Este é um assunto a parte mas apenas lembre-se que o tipo de retorno pode ser o mesmo ou um subtipo. Não tem problema em retornar um subtipo porque  com certeza ele &quot;cabe&quot; no supertipo. &lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;b&gt; O método que sobrescreveu pode lançar qualquer exceção de tempo de execução (não verificada / &lt;i&gt;unchecked&lt;/i&gt;), mesmo que o método original não tenha lançado&lt;/b&gt;.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;b&gt; O método que sobrescreveu não pode lançar exceções verificadas (&lt;i&gt;checked&lt;/i&gt;) novas ou mais abrangentes que as declaras pelo método original&lt;/b&gt;. Este é um assunto para outro post.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Pra finalizar a parte de sobrescrita vou fazer só mais duas observações importantes: Podemos chamar a versão da superclasse do método usando a palavra chave &lt;i&gt;super&lt;/i&gt;:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;//Superclasse
public class Animal {

void comer() {
 System.out.println(&quot;Animal comendo...&quot;);
}

public static void main(String[] args) {
 Dog g = new Dog();
 g.comer();
}
}

// Subclasse
class Dog extends Animal {

void rolar() {
 System.out.println(&quot;Dog rolando...&quot;);
}

// Dog sobrescreveu o método comer
void comer() {
 super.comer(); //Chamou a versão da superclasse
 System.out.println(&quot;Dog comendo...&quot;);
}

}&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
E outra, mesmo não tento falado sobre exceções vou insistir em colocar uma questão aqui que poderá cobrada no exame:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;//Superclasse
public class Animal {

void comer() throws Exception {
 //Lança uma exceção
}
public static void main(String[] args) {
 Animal a = new Dog(); //Referência polimórfica
 a.comer();
}
}

// Subclasse
class Dog extends Animal {

void rolar() {
 System.out.println(&quot;Dog rolando...&quot;);
}

// Dog sobrescreveu o método comer
void comer() {
 System.out.println(&quot;Dog comendo...&quot;);
}
}&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Um método foi sobrescrito, mas está sendo chamado através de uma referência polimórfica (do superclasse) para apontar para o objeto do subtipo. Como vimos o compilador vai pensar que você está chamando a versão da superclasse. Mas a JVM em tempo de execução vai chamar a versão da subclasse. A versão da superclasse declarou uma exceção, mas a do subtipo não. O código não compila devido a exceção declarada. Mesmo que a versão usada em tempo de execução seja a do subtipo.&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt; Métodos Sobrecarregados &lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Metodos sobrecarregados tem uma diferença básica dos métodos sobrescritos: Sua lista de argumentos DEVE ser alterada. Por este motivo, os métodos sobrecarregados permitem que se utilize o mesmo nome do método numa mesma classe ou subclasse e isto pode ser usado para dar mais opções a quem for chamar o método. Por exemplo, podemos ter um método que receba uma variável &lt;i&gt;int&lt;/i&gt; e outro que receba &lt;i&gt;double&lt;/i&gt;, e a pessoa que for chamar não precisará se preocupar com fazer nenhuma conversão.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Diferente dos métodos sobrescritos, os sobrecarregados podem mudar o tipo de retorno e o modificador de acesso sem restrições. Eles também podem lançar exceções verificadas novas ou mais abrangentes.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Os métodos sobrecarregados podem ser declarados na mesma classe ou na subclasse. Saber diferenciar métodos sobrecarregados dos sobrescritos é importante pra não cair em pegadinhas como:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;public class Animal {

public void comer(int x, String s) {
 System.out.println(&quot;Animal comendo...&quot;);
}
}

class Dog extends Animal {

protected void comer(int x, float s) {
 System.out.println(&quot;Dog comendo...&quot;);
}
}&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
O código acima pode parecer violar uma das regras de sobrescrita (modificador mais restritivo) porém ele está é sobrecarregando pois houve mudança na lista de argumentos.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Uma questão importante em métodos sorbrecarregados é: Qual método será chamado? Isso vai depender exclusivamente dos argumentos passados. Por exemplo, no caso anterior se você chamar:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;new Dog().comer(2, &quot;a&quot;);&lt;/pre&gt;
&lt;br /&gt;
Vai retornar &lt;i&gt;Animal comendo...&lt;/i&gt;. Mas e se usarmos argumentos de objetos ao invés de tipos primitivos?&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;public class Animal {

void teste(Animal a) {
 System.out.println(&quot;Animal&quot;);
}


public static void main(String[] args) {
 new Dog().teste(new Dog()); //Chamou passando um Dog
 new Dog().teste(new Animal()); //Chamou passando um Animal
}
}

class Dog extends Animal {

void teste(Dog d) {
 System.out.println(&quot;Dog&quot;);
}
}&lt;/pre&gt;
&lt;br /&gt;
A saída será normal, executou o método de acordo com o tipo passado:&lt;br /&gt;
&lt;i&gt;Dog&lt;br /&gt;Animal&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Mas e se a referência usada fosse polimórfica:&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;Animal a = new Dog();
a.teste(a);&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Qual versão será executada? Você poderia pensar que seria a versão de Dog, porque estamos passando uma referência ao objeto Dog. Mas não é, a saída seria &lt;i&gt; Animal &lt;/i&gt; pois mesmo sabendo que em tempo de execução o objeto utilizado será um Dog e não um Animal, quando o método é sobrecarregado isto não é decidido em tempo de execução. Então lembre-se: &lt;b&gt; Quando o método é sobrecarregado, apenas o tipo da referência importa para saber qual método será chamado&lt;/b&gt;.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Resumindo, o método sobrescrito a ser chamado é definido em tempo de execução e o sobrecarregado no tempo de compilação.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Então pra fechar o tópico vou dar mais uma dica: Fique atento aos métodos que parecem ser sobrescritos mas estão sendo sobrecarregados:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;public class Animal {

void teste() { }

}

class Dog extends Animal {

void teste(String s) {}

}&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
A classe Dog tem dois métodos: A versão teste sem argumentos que herdou de Animal e a versão sobrecarregada. Um código que faz referência a Animal pode chamar somente teste sem argumentos mas uma referência a Dog pode chamar qualquer um.&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Dever de casa&lt;/b&gt;&lt;br /&gt;
Dado:&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;class Plant{

String getName() { return &quot;plant&quot;; }
Plant getType() { return this; }

}

class Flower extends Plant{

 //Insira o código aqui

}

class Tulip extends Flower { }&lt;/pre&gt;
&lt;br /&gt;
Quais instruções, inseridas na linha comentada, irão compilar? (Marque todas corretas)&lt;br /&gt;
&lt;blockquote&gt;
A. Flower getType() {  return this; }&lt;br /&gt;
B. String getType() { return &quot;this&quot;; }&lt;br /&gt;
C. Plant getType() { return this; }&lt;br /&gt;
D. Tulip getType() { return new Tulip(); }&lt;/blockquote&gt;
</content><link rel='replies' type='application/atom+xml' href='http://marciosouzajunior.blogspot.com/feeds/2725712007001120258/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://marciosouzajunior.blogspot.com/2010/07/sobrescrita-sobercarga-overriding.html#comment-form' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/2725712007001120258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/2725712007001120258'/><link rel='alternate' type='text/html' href='http://marciosouzajunior.blogspot.com/2010/07/sobrescrita-sobercarga-overriding.html' title='Sobrescrita / Sobercarga (Overriding / Overloading) - Java'/><author><name>Márcio de Souza Júnior</name><uri>http://www.blogger.com/profile/01965624113971008303</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5856286885704734621.post-8256432484435696370</id><published>2010-07-22T09:58:00.000-03:00</published><updated>2013-03-21T13:39:06.080-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cast"/><category scheme="http://www.blogger.com/atom/ns#" term="casting"/><category scheme="http://www.blogger.com/atom/ns#" term="conversão"/><category scheme="http://www.blogger.com/atom/ns#" term="herança"/><category scheme="http://www.blogger.com/atom/ns#" term="polimorfismo"/><category scheme="http://www.blogger.com/atom/ns#" term="scjp"/><title type='text'>Conversão de Tipos ou Casting - Java</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
Não sei se alguem já notou mas as anotações sobre Java que estou postando aqui são apropriadas para quem vai prestar o exame SCJP (Sun Certified Java Programmer). Como também pretendo ser um programador certificado pela Sun, estou estudando e quero aproveitar para compartilhar com você meus resumos.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Hoje vou falar sobre o objetivo 5.2 do exame que é sobre Conversão de Variáveis de Referência (também conhecido por Cast ou Casting de tipos):&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;i&gt;Dado um cenário, desenvolver código que demonstre o uso do polimorfismo. Além disso, determinar quando a conversão será necessária e saber diferenciar erros de compilação de erros de tempo de execução relacionados a conversão de referências a objetos.&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Temos 2 pontos principais neste objetivo: Uso do polimorfismo e saber diferenciar erros de compilação e de tempo de execução. Veja também que no final está &lt;i&gt;&quot;referências a objetos&quot;&lt;/i&gt;. Isto quer dizer que esse tipo de conversão não é como conversão entre tipos primitivos (que não será abordado neste post).&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Vamos começar analisando o código:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
//Superclasse
public class Animal {
 
 void comer(){
  System.out.println(&quot;Animal comendo...&quot;);
 }
 
}
//Subclasse
class Dog extends Animal{
 
 void rolar(){
  System.out.println(&quot;Dog rolando...&quot;);
 }
}&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt; Upcasting ou Conversão ampliadora&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Considerando o código acima poderíamos naturalmente fazer as seguintes declarações:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
Animal animal; //Declarou um tipo genérico
animal = new Dog(); //Apontou para um mais específico
//Ou simplesmente:
Animal animal = new Dog();
//Ou ainda:
Animal animal = (Animal)new Dog(); //Conversão explícita&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Porque? &lt;i&gt;Tipos genéricos podem apontar para tipos mais específicos.&lt;/i&gt; Isto chama-se &lt;i&gt;upcasting&lt;/i&gt; ou conversão ampliadora. Esta conversão é sempre segura, pois estamos indo de um tipo mais específico para um mais genérico (de baixo pra cima na árvore de herança) e sabemos que a superclasse poderá fazer tudo que a subclasse fazia pois herdou dela. Mas fazendo isto estamos perdendo os métodos de Dog. &lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Nesse caso a variável de referência &lt;i&gt;animal&lt;/i&gt; que é do tipo Animal faz referência a Dog e isto é possível porque &lt;i&gt;Dog É-UM Animal&lt;/i&gt; (Este relacionamento É-UM significa que Dog extends Animal).&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Por estes motivos o compilador permite fazer o cast sem nenhuma notação especial nem nada explícito.&lt;/div&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkiJ9nf4SJULMX2t6sSOMBvzXYJ0s7Bx9xoq4Xu3o1j_Z4yawH9kqkO-MfeI_OmE_wUhzi3pYeBIsINIRc7dI0-5JzTziQr8K5L3RI0Aeow2YZWNeFLqET78XI27X4ridZEl4OAHguH2ea/s1600/upcast.jpg&quot; onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5496734802729659218&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkiJ9nf4SJULMX2t6sSOMBvzXYJ0s7Bx9xoq4Xu3o1j_Z4yawH9kqkO-MfeI_OmE_wUhzi3pYeBIsINIRc7dI0-5JzTziQr8K5L3RI0Aeow2YZWNeFLqET78XI27X4ridZEl4OAHguH2ea/s320/upcast.jpg&quot; style=&quot;cursor: hand; cursor: pointer; display: block; height: 289px; margin: 0px auto 10px; text-align: center; width: 320px;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Até aqui tudo bem, mas e se tentar realizar um comportamento mais específico? Por exemplo, tentar chamar um método que só existe em Dog? Não pode porque só comportamentos de Animal serão aceitos:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
animal.rolar(); //Problema! Método não definido para o tipo Animal&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
O código não compila porque animal não tem o método rolar(). Entenda que estamos transformando um Dog num tipo mais genérico e que ele agora só poderá executar ações deste novo tipo. Ele perdeu os comportamentos específicos que tinha. &lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Mas um coisa interessante é que se Dog sobrescrever algum método de Animal, qual dos métodos será executado? Vamos modificar o código:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
//Superclasse
public class Animal {
 
 void comer(){
  System.out.println(&quot;Animal comendo...&quot;);
 }
 
}
//Subclasse
class Dog extends Animal{
 
 void rolar(){
  System.out.println(&quot;Dog rolando...&quot;);
 }
 //Dog sobrescreveu o método comer
 void comer(){
  System.out.println(&quot;Dog comendo...&quot;);
 }
}&lt;/pre&gt;
&lt;br /&gt;
Suponhamos que faça a seguinte chamada:&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
Animal animal = new Dog();
animal.comer();&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Quem vai comer? Animal ou Dog? Neste caso o método em Dog seria executado porque ele sobrescreveu. Então quando fazemos o &lt;i&gt;upcasting&lt;/i&gt; perdemos os métodos do subtipo mas se algum for sobrescrito a versão a ser executada é a do subtipo. Muito louco isso não é?&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt; Downcasting &lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Seguindo a raciocínio do &lt;i&gt;upcasting&lt;/i&gt;, se quisermos &quot;voltar&quot; um tipo genérico para o mais específico (conversão redutora), devemos fazer a conversão explicitamente:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
Dog dog = (Dog) animal;
dog.comer();&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Veja que mudamos apenas o tipo da variável, não o tipo da referência. Então esta conversão se torna possível pois animal faz referência a Dog.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Então você se pergunta: Porque o &lt;i&gt;upcasting&lt;/i&gt; é automático e o &lt;i&gt;downcasting&lt;/i&gt; não? Agora chegamos num ponto interessante: No &lt;i&gt;upcasting&lt;/i&gt; a conversão nunca falha. No &lt;i&gt;downcasting&lt;/i&gt;, nem sempre teremos esta certeza. No exemplo citado acima, a conversão deu certo porque animal fazia referência a Dog mas e se não fizesse? Se animal fizesse referência a Animal mesmo?&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
Animal animal = new Animal();
Dog dog = (Dog) animal;&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Como isso poderá ser feito se Animal não é um Dog? Animal nem sabe da existência de Dog. A conversão não pode ser feita porque os tipos são incompatíveis.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Só que o mais intrigante vem agora: O código compila! &lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Se você usa o Eclipse vá em &lt;i&gt;Project &amp;gt; Clean...&lt;/i&gt;, selecione seu projeto e veja se apareceu algum erro em &lt;i&gt;Problems&lt;/i&gt;? Não vai aparecer nada, porque pro compilador está tudo bem, ele não sabe e nem quer saber se animal faz referência a Animal ou Dog. Mas quando tentar executar:&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;i&gt;Exception in thread &quot;main&quot; java.lang.ClassCastException: Animal cannot be cast to Dog&lt;br /&gt;at Animal.main(Animal.java:46)&lt;/i&gt;  &lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Então não tente converter um objeto para um tipo que ele não é. Mas lembre-se que o compilador não sabe se você vai tentar isto.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Para saber se dada conversão é aceita devemos usar o operador &lt;i&gt;instanceof&lt;/i&gt;. Este operador retorna true ou false para uma comparação entre tipos:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
 if (dog instanceof Animal)
 {
  System.out.println(&quot;dog é um Animal.&quot;);
 }&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Na IDE Eclipse, quando começar a digitar &quot;ins&quot; e pressionar Ctrl + Barra de espaço ele já sugere o operador, então pressionando Enter ele já vai preencher um bloco de código igual a este:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
 if (name instanceof type) {
  type new_name = (type) name;
  
 }&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Aí é só você ir dando TAB e preenchendo os campos. Ele faz isso porque sabe que quase sempre que usamos o instanceof é pra saber se um objeto é de determinado tipo, e sendo positivo, já queremos que o objeto seja convertido neste tipo.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;i&gt;Aproveitando que já dei essa dica, tem outras duas que eu também uso muito para criar o método main e pro comando System.out.println: Para o main apenas digite main e Ctrl + Barra de espaço, para o println digite sysout Ctrl + Barra de espaço.&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Só por curiosidade: Podemos converter qualquer objeto no tipo Object, como já falei no outro post, o Object é como uma classe &quot;mãe&quot; no Java:&lt;/div&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
Object obj = (Object)new Animal();&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Mas essa conversão não tem muita utilidade pois faz com que animal perca todos seus métodos como já foi explicado. Por hoje é só!&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Bons estudos e boas conversões!&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://marciosouzajunior.blogspot.com/feeds/8256432484435696370/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://marciosouzajunior.blogspot.com/2010/07/conversao-de-tipos-ou-casting-java.html#comment-form' title='12 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/8256432484435696370'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5856286885704734621/posts/default/8256432484435696370'/><link rel='alternate' type='text/html' href='http://marciosouzajunior.blogspot.com/2010/07/conversao-de-tipos-ou-casting-java.html' title='Conversão de Tipos ou Casting - Java'/><author><name>Márcio de Souza Júnior</name><uri>http://www.blogger.com/profile/01965624113971008303</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkiJ9nf4SJULMX2t6sSOMBvzXYJ0s7Bx9xoq4Xu3o1j_Z4yawH9kqkO-MfeI_OmE_wUhzi3pYeBIsINIRc7dI0-5JzTziQr8K5L3RI0Aeow2YZWNeFLqET78XI27X4ridZEl4OAHguH2ea/s72-c/upcast.jpg" height="72" width="72"/><thr:total>12</thr:total></entry></feed>