Entendendo static  XML
Índice dos Fóruns » Artigos e Tutoriais
Autor Mensagem
Administrador
Java Eldar

Membro desde: 02/08/2002 12:27:02
Mensagens: 0
Offline

Assunto: Você se sente confuso quanto à utilidade da palavra-chave static? Não sabe quando nem como usar? Seus problemas acabaram, leia este tutorial aqui do GUJ e acabe com suas dúvidas.

Você pode ler este artigo na íntegra em http://www.guj.com.br/java.artigo.121.1.guj

Por favor, coloque os seus comentários sobre este artigo aqui.

This message was edited 1 time. Last update was at 20/04/2005 17:45:09

[Email]
dango
JavaEvangelist
[Avatar]

Membro desde: 09/11/2002 08:56:47
Mensagens: 497
Localização: Catanduva SP
Offline

Adorei o seu artigo. Muito claro e direto!

Entretanto gostaria de saber de você se já esteve em alguma situação onde determinados métodos precisavam existir, mas simplesmente não se encaixavam em nenhuma classe da aplicação. E como você resolveu o problema? Que técnicas ou design patterns teve de usar ou "quebrar"?

Abraços.
Paulo Silveira
Administrador
[Avatar]

Membro desde: 07/08/2002 18:38:50
Mensagens: 4204
Localização: São Paulo
Offline

Um método static realmente se parece com uma funcao
Cabe a voce a decisao de onde ele deve ficar. Pois voce pode mudar muito bem onde o metodo estatico esta para outra classe, sem maiores problemas.

A SUN criou a classe Math para ter os metodos estaticos que abordam o mesmo assunto. Voce vai ver por ai muita gente ter uma classe que chama "MeuProjetoUtils" contendo uma serie de cosntantes e metodos estaticos. Apesar de eu tambem usar isso, creio que a melhor solucao seja ter classes que possuem metodos estaticos e nao estaticos. Assim como a aclasse Integer têm.

http://blog.caelum.com.br twitter: @paulo_caelum


[Email] [WWW]
richardpeder
GUJ Master
[Avatar]

Membro desde: 15/10/2002 08:39:04
Mensagens: 1548
Localização: Minas Tirith
Offline

Muito bom o artigo sobre static.......uma vez estava desenvolvendo um projeto em java e apanhei muito ocm variaveis estaticas....deu muito pau no meu programa e eu nao sabia pq, depois fui descobrir que eram variaveis estaticas do programa.

ate mais...


"I see in your eyes the same fear that would take the heart of me. A day may come when the courage of men fail. When we forsake our friends and break all bonds of fellowship, but it is not this day. This day we fight!" (Discurso de Aragorn no Portão Negro de Mordor)


[Email] [WWW] [MSN] [ICQ]
PJ2002
Debugger

Membro desde: 11/11/2002 23:15:35
Mensagens: 54
Localização: São Paulo
Offline

Gostaria de deixar a minha dica aqui sobre o assunto. Bem, se uma classe generica possui um dado statico... cujo valor 1... Todas as classe que a utilizarem (a classe generica) possuiram o valor 1 do dado. Agora se alterarmos na classe generica o valor do dado p/ por exemplo 2, todas as classe q utilizam ( a classe generica ) teram o valor 2. Um exemplo p/ ficar mais claro da logica... Eh soh imaginarmos o jogo pac-man... Por que todos os fantasminhas (objetos) fogem quando o comecome (objeto) se alimenta das frutas? Ai estah um exemplo na pratica do uso de static.
Gostei do artigo...
PJ2002.
[Email] [MSN]
Rafael Steil
Administrador
[Avatar]

Membro desde: 31/08/2002 02:35:53
Mensagens: 5984
Localização: São Paulo
Offline

Exatamente. Como soh existe uma unica referencia na memoria, caso alguem altere o valor, o efeito sera global. Uma saida para garantir a seguranca, caso o valor nao possa ser alterado de maneira alguma, eh simplesmente declarar como "final" tambem.

Rafael

"working code attracts people who want to code. Design documents attract people who want to talk about coding - Charles Miller"

http://rafaelsteil.com
http://twitter.com/rafaelsteil
http://www.jforum.net
http://www.flickr.com/photos/rafaelsteil
[Email] [WWW]
Gerson
JavaChild
[Avatar]

Membro desde: 26/01/2003 19:48:37
Mensagens: 113
Localização: São Paulo
Offline

Lá vai mais algumas dicas:

-- Métodos estáticos nunca são VIRTUAIS, e não podem ser sobreescritos (Overriding) em suas subclasses! Isso explica a impossibilidade de usar Polimorfismo, onde qualquer referência é resolvida através de early binding!

-- Static são úteis para membros, seja uma variavel ou metodo, que não depende da instância de uma classe, isto é, quando não existe nenhum vínculo/dependencia com o estado de um objeto.

-- membros statics são corregados em memória assim que o programa é executado.

-- Ah, uma outra coisa interessante.. o metodo entry point main() precisa ser static justamente pq a VM nao cria nenhuma instancia de sua classe.

Espero ter contribuído!

Gerson K.
[MSN]
Rafael Steil
Administrador
[Avatar]

Membro desde: 31/08/2002 02:35:53
Mensagens: 5984
Localização: São Paulo
Offline

Eu nao sei exatamente como definir, mas é possivel sobrescrever um metodo static:



Resultado:



Note que, ao contrario de um metodo normal, chamar



chama o metodo da classe Pai, ao contrario da classe Filho, o que eh a acao a acontecer em um metodo "normal". A especificacao diz que metodos static sao explicitamente "final", tanto que se voce remover a palavra-chave "static" da classe Filho, um erro de compilacao ira ocorrer. Mas com a assinatura igual, funciona.

Rafael

"working code attracts people who want to code. Design documents attract people who want to talk about coding - Charles Miller"

http://rafaelsteil.com
http://twitter.com/rafaelsteil
http://www.jforum.net
http://www.flickr.com/photos/rafaelsteil
[Email] [WWW]
Gerson
JavaChild
[Avatar]

Membro desde: 26/01/2003 19:48:37
Mensagens: 113
Localização: São Paulo
Offline

Rafael,

Não dá pra sobreescrever um método estatico não. O que acontece é que existe uma sobreposição de método, onde um deles fica oculto.

O método "p2.escreve()" chamou o método da classe pai justamente pq um método estático não é virtual, diferentemente dos métodos non-static, que por padrão, são implicitamente virtuais (diferentemente de C++). Não sei se está claro esse conceito... Se não, procure por "Virtual Function".

Não lembro onde exatamente lí isso... Mas, de qquer forma, é só dar uma olhada no proprio tutorial da sun.

"Also, a subclass cannot override methods that are declared static in the superclass. In other words, a subclass cannot override a class method. A subclass can hide a static method in the superclass by declaring a static method in the subclass with the same signature as the static method in the superclass. "

http://java.sun.com/docs/books/tutorial/java/javaOO/override.html

Espero ter contribuído!

Gerson K.
[MSN]
Paulo Silveira
Administrador
[Avatar]

Membro desde: 07/08/2002 18:38:50
Mensagens: 4204
Localização: São Paulo
Offline

gerson e rafael, voces estao falando a mesma coisa

metodos statics nao podem ser reescritos, apenas hidden (pensem e faz todo sentido do mundo isso acontecer)

outra coisa. eh mais facil lembrar eh o seguinte: o unico lugar em que ocorre chamada de metodo virtual sao em metodos de instancia. de todos os outros jeitos, a resolucao ocorre em TEMPO DE COMPILACAO

entao se PAI e FILHO tiverem um public int x, e voce fizer

Pai p = new Filho();
imprime(p.x);

vai sair a variavel do Pai mesmo, e nao do filho, pq existem DUAS. a do filho apenas escondeu a do pai em determinadas situacoes

Geron. membros estaticos NAO sao carregados quando o programa executa. Eles sao carregados quando o ClassLoader le a classe X, e se esse X tiver membros etaticos, eles sao carregados.

http://blog.caelum.com.br twitter: @paulo_caelum


[Email] [WWW]
Elvis.The.Pelvis
JavaGuru
[Avatar]

Membro desde: 18/12/2002 17:45:34
Mensagens: 220
Localização: Recife/PE
Offline

Mas se você fizer Pai p = new Filho(); System.out.println(p.x); Vai imprimir o x do pai de qualquer maneira. Dinamic binding só ocorre com métodos.

Se não fosse o C, até hoje estaríamos programando em BASI, PASAL e OBOL.
Elvis.The.Pelvis é Daniel Freitas
[Email] [WWW] [MSN]
Rafael Steil
Administrador
[Avatar]

Membro desde: 31/08/2002 02:35:53
Mensagens: 5984
Localização: São Paulo
Offline

Sim, eu li a JLS depois que tinha postado a minha msg, pois tava vendo uns lance com protected tambem, e la falava do hidding e tal.

Rafael

"working code attracts people who want to code. Design documents attract people who want to talk about coding - Charles Miller"

http://rafaelsteil.com
http://twitter.com/rafaelsteil
http://www.jforum.net
http://www.flickr.com/photos/rafaelsteil
[Email] [WWW]
Paulo Silveira
Administrador
[Avatar]

Membro desde: 07/08/2002 18:38:50
Mensagens: 4204
Localização: São Paulo
Offline

Elvis.The.Pelvis wrote:Mas se você fizer Pai p = new Filho(); System.out.println(p.x); Vai imprimir o x do pai de qualquer maneira. Dinamic binding só ocorre com métodos.


exatamente, eh o que eu e o gerson falamos acima!

http://blog.caelum.com.br twitter: @paulo_caelum


[Email] [WWW]
Umlauf
JavaEvangelist
[Avatar]

Membro desde: 17/09/2002 21:30:44
Mensagens: 456
Localização: São Paulo/SP
Offline

Pessoal,

Outro dia estava lendo um ótimo tutorial no JavaRanch, How my Dog learned Polymorphism e lá diz que Java sempre faz late-binding. Por exemplo, se eu executar...



...o método play() chamado será da classe Dog, e não da classe Animal.

Late-binding, então, ocorre apenas para métodos, e não para variáveis?

[Email] [WWW] [Yahoo!] aim icon [MSN] [ICQ]
Paulo Silveira
Administrador
[Avatar]

Membro desde: 07/08/2002 18:38:50
Mensagens: 4204
Localização: São Paulo
Offline

Rob Fleming wrote:Pessoal,
Late-binding, então, ocorre apenas para métodos, e não para variáveis?


exato
associacao de atributos sao resolvidos em tempo de compilacao (early binding), metodos nao estaticos sao resolvidos em tempo de execucao (virtual method invocation, melhor q "late binding")

http://blog.caelum.com.br twitter: @paulo_caelum


[Email] [WWW]
 
Índice dos Fóruns » Artigos e Tutoriais
Ir para:   
Powered by JForum 2.1.8 © JForum Team