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.
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
[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
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.