Visibilidade no main

7 respostas
void

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

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

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

7 Respostas

V

ih caraca :?:

T

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.

void

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

T

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

V

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

T

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

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

I

Void,

A VM  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.
Criado 21 de agosto de 2006
Ultima resposta 21 de ago. de 2006
Respostas 7
Participantes 5