Instância de classe na JVM em chamada de método estático

Bem, aqui no trabalho a discussão foi grande hehe. Na ferramenta de modelagem Rational Rose(não sei quanto às outras) e na própria definição da OMG sobre UML, em um diagrama de sequência como do exemplo a seguir, uma instância de uma classe(Principal.class) cria um objeto(instância de uma classe, neste caso da classe Objeto1) e o nomeia como obj. Até aí tudo normal e para demonstrar isso coloquei alguns métodos que identificam essa instância criada(pega o hashCode e o nome da classe a partir da qual o objeto foi instanciado e imprime os dois - ver arquivo JAR). Em seguida faz uma chamada ao método static imprime() da classe Objeto2. Aí está a discussão. Pela uml no momento em que o método imprime() é chamado, essa chamada é feita à uma instância da classe Objeto2. Sei que obviamente nenhum instância foi criada de modo explicito(new Objeto2()), sendo assim, a JVM criaria um instância de Objeto2() que responde à chamada? Se é criada essa instância de Objeto2(), porque os métodos que colokei dentro do construtor da classe não são executados? ou porque essa instância não “seta” as variáveis testeHC e testeClass(veja código no arquivo JAR) que eu pedi que fossem setadas quando fosse criada uma instância dessa classe?
http://rev.alcides.sites.uol.com.br/uml.jpg

http://rev.alcides.sites.uol.com.br/TesteObj.jar

as urls estão funcionando… mas se apresentarem problemas é só copiar, abrir outra janela do navegador, colar a url e abrir.

Valeu!!

Até onde eu sei(posso estar errado, eu nunca estudei isso a fundo), quando um método estático é chamado, nenhuma instancia precisa ser gerada, nem explicita nem implicitamente. A prova disso voce mesmo já deu, que o construtor da classe não foi chamado no seu teste. As chamadas são feitas diretamente à classe, ao invés de diretamente às instancias.
Olhe o código:

[code]public class Teste2 {
public static void main(String[] args) {
Teste.a = 4;
System.out.println((new Teste).a); // Imprime ‘4’ :wink:
}

class Teste {
public static int a;
}[/code]

Isso não aconteceria se fosse criada uma instancia da classe quando eu tento acessar um método/atributo estático seu.
[/code]

todo conteúdo static da classe será executado qnd o JVM carregar a classe na memória, tanto métodos quanto blocos static { } , por ex:

[code]class C {

static {

  System.out.println( "Eu Amo o Portal Java" );

}

public static void metodo() {

  System.out.println( "metodo" );

}

public C() {

  System.out.println( "construtor" );

}

}[/code]

essa classe irá imprimir “Eu Amo o Portal Java” no console qnd o JVM carregá-la na memória, e vai imprimir “metodo” qnd vc chamar o método, … e não vai imprimir “construtor” enquanto vc não chamar new para uma instancia da classe! se vc usar C.metodo(), ele só vai imprimir “Eu Amo o Portal Java”, agora, se vc fizer:

new C().metodo();

ai sim, vai imprimir “construtor” e “Eu Amo o Portal Java”

Bem… concordo com vcs em tudo isso. Na minha opnião a JVM não instancia um objeto se apenas um método static de sua respectiva classe é chamado. Mas nesse caso não há um import? A JVM só “carrega” o método static separado de todo o restante da classe? Como eu posso monitorar tudo que ocorre dentro da JVM? Na especificação da UML por exemplo, é IMPOSSIVEL um objeto chamar uma classe, só é permitido que se chame uma instância de classe… sendo assim, acho ki a própria classe (arquivo.class) deve ser tratado com uma instância de java.lang.Class. E aí? O que acham? A UML está errada? Me lembro de ter lido algo em alguma especificação da sun nesse sentido mas nunca mais achei…[/b]

então acredito q a UML seja limitada quanto a isso… :roll: