Visibilidade no main

Gujs, Alguém sabe o motivo que o método main tem que ser public mais a classe não?

Arquivo Teste.java

[code]

class Bla {
public static void main(String args[]){
System.out.println(“GUJ GUJ!”);
}
}[/code]

:arrow: javac Teste.java
:arrow: java Bla

ih caraca :?:

Apenas dois tipos de classes podem ser compiladas ao nível de arquivos:

  • public
  • package-protected (ou seja, sem modificador “public”, “private” ou “protected”).

Você só pode declarar uma classe “protected” ou “private” dentro de outra classe.

Nesses dois casos (public ou “package-protected”), é possível instanciá-las diretamente pela linha de comando (java.exe). Note que no caso “package-protected” só outras classes do mesmo pacote podem instanciá-las diretamente.

Tente colocar o main como default, não vai rodar! tem que ser publica…
Isso no meu ponto de vista é um erro de visibilidade!

Visibilidade de classes é uma coisa, e de métodos é outra coisa.

O java.exe é um programa em C que faz o seguinte:

  • Carrega a DLL da JVM (jvm.dll);
  • Pega a classe cujo nome foi passado como parâmetro, e carrega-a com Class.forName;
  • Chama o método main, que deve ser “public static void”, e ter exatamente um parâmetro (String[]). Isso faz parte da definição da linguagem.

Se você quiser criar o seu java.exe que chame uma outra função com outra visibilidade, esteja à vontade. O fonte em C está disponível para ser baixado da Sun. Por exemplo, você poderia criar um “java.exe” que fizesse o seguinte:

  • Carrega a DLL da JVM (jvm.dll);
  • Pega a classe cujo nome foi passado como parâmetro, e chama seu construtor default;
  • Chama o método cujo nome é “principal”, que não tem parâmetros, mas deve ser um método de instância (não um método “static”). Pelas limitações de reflection, não deveria ser “private”.

O AppletViewer faz algo parecido, quando ele insiste em instanciar uma classe que tem obrigatoriamente de derivar de java.awt.Applet (da qual javax.swing.JApplet é uma subclasse), e chamar os métodos start, stop etc.)

class Bla { public static void main(String args[]){ System.out.println("GUJ GUJ!"); } }

minha duvida é o seguinte …
por eu não declara nada a minha classe Bla é package por default ?
outras classes de outros pacotes não enchergarão o metodo main, porem isso não faz diferença pois elas e que serão chamadas pelo main

esse parada confundiu minha cabeça

[quote=victorhugomuniz] class Bla { public static void main(String args[]){ System.out.println("GUJ GUJ!"); } }

minha duvida é o seguinte …
por eu não declara nada a minha classe Bla é package por default ?
outras classes de outros pacotes não enchergarão o metodo main, porem isso não faz diferença pois elas e que serão chamadas pelo main

esse parada confundiu minha cabeça[/quote]

sim… a visibilidade eh o default, ou seja, package private

Void,

     A VM só reconhece uma assinatura de main q é essa public static void main(String[] a) {}

     Vc pode colocar qualquer outra assinatura, mais o q vai decidir se sua classe é ou não "executavel" é essa assinatura citada acima.