13
respostas

Sobre a declaração static void main(string[]args)

insira seu código aquiOlá, boa tarde. Queridos colegas do fórun, hoje à tarde estava fazendo algumas pesquizas, e me veio uma pequena duvida à cabeça: para que temos de colocar em todo inicio de aplicação console, no programa principal a declaração static void main(string[]args)? eu sei que static significa que o método é estático, que para o acessar teriamos de acessar pela classe, e não apartir de uma instânsia. void significa que ele não retorna nada, e string[] args me parece a declaração de um vetor de strings. mas métodos estaticos só podem acessar conteúdos estáticos, correto? então como atravez desse static void main, eu consigo chamar outros métodos, atribuir valores para variáveis e tals? Como isso se torna possível? Aguardo a resposta, ótima tarde e ótimo fim de semana a todos. Maurílio

13 respostas

Boa tarde Maurilio,

Precisamos colocar essa declaração pois quando executámos uma classe com esse método, na verdade estamos pedindo pra JVM roda-lo. Assim ela não precisa instanciar sua classe e nem esperar nada como resposta, apenas invoca o método padrão main podendo ou não passar parâmetros.

Espero ter esclarecido sua dúvida.

Abraços

Maurilio,

Como o Guilherme já comentou o método main é a porta de entrada para executar o seu programa. Por esse motivo ele é estático e não retorna valor. No caso do array de String (args), quando você executa um programa pelo cmd pode usar um comando parecido com esse abaixo:

C:\>MeuPrograma "parametro1" "parametro2"

Nesse exemplo será chamado o método main do "MeuPrograma" e esses valores que eu passei separados por espaço em branco serão colocados dentro do args, podendo ser acessados no formato de array.

Espero que essas respostas te ajudem a esclarecer sua dúvida. Abraço.

insira seu código aquiOi caras, boa tarde. Em primeiro, agradeço pela boa vontade em me ajudar. E tipo: a duvida me persiste no seguinte motivo: se eu não passo parâmetros, o que o vetor de strings recebe? E poderiam me explicar mais um pouco sobre esse método padrão? Eu ainda fico me perguntando como ele pode permitir que chamemos métodos de outras instânsias, sendo que métodos estaticos só permite chamar coisa estática. E isso meio que me confunde. Outra coisa: fiz um teste aqui para programar extruturado com o c#, e eu criei um método private. e chamei esse método no decorrer do programa e deu erro. O método ta na mesma classe do programa principal. Ele só permitiu que eu chamasse quando marquei com static. por que isso?

Então Maurilio, a principio a informação mais importante é que essa assinatura é padrão e fixa do java. Sempre que quiser executar uma classe precisa do método com a assinatura public static void main(String[] args). Ele é publico para que a JVM possa chama-lo. É static para que a JVM não precise instanciar um objeto da sua classe e void porque não retorna nada para a JVM. Agora dentro do método main não podemos invocar nenhuma propriedade da sua instancia(através de this) mas podemos criar outros objetos (instancias de outras classes) e chamar seus métodos tranquilamente.

Logo, um método static não pode acessar membros da classe(variáveis ou métodos) que não sejam static, mas podem criar outros objetos e chamar seus métodos

Maurilio,

No caso de não passar parâmetros o array fica vazio, só isso. No caso dos métodos estáticos, você pode chamar métodos de outras classes desde que eles sejam estáticos ou que tenha uma classe instanciada. Por exemplo:

static void main(String[] args)
{
    Metodo();

    new Classe().Metodo();
}

static void Metodo() {}

class Classe
{
    void Metodo(){}
}

Se você criar uma instância de uma classe é possível chamar métodos não estáticos dentro de métodos estáticos. Outro caso, todo método main está dentro de uma classe certo?

class Classe
{
    static void main(String[] args)
    {
        new Classe().Metodo();
    }

    void Metodo(){}
}

Pra chamar um método da classe onde está o main, você também deve criar uma instância da classe.

Espero que isso te ajude. Qualquer dúvida não deixe de perguntar. Abraço.

insira seu código aquiOi, então caras. vou falar o que entendi e vocês me dizem se entendi corretamente, pode ser? Caras, a melhor coisa que me aconteceu foi esse fórun. rs. então vamos la. Métodos estaticos podem acessar somente coisas estáticas da própria classe, mas podem acessar métodos de outras instânsias tranquilamente. é isso? sobre eu definir um método antes do static void main, se o método não for estático, só pode ser acessado se eu crio por exemplo, uma instânsia da classe program. correto?

Maurilio,

Basicamente é isso aí. Só um detalhe, Dentro de um método estático você pode chamar métodos de outras classes, desde que crie uma instância dessa classe ou o método dessa classe ser estático.

Abraço.

Isso mesmo Maurilio, pois ai você está chamando o método de uma instância. A ideia do static é essa mesmo.

insira seu código aquiO que me deixou muito entrigado foi o fato do array poder ficar vazio; eu pensava por exemplo, se a função recebe um argumento, ela não pode ficar vazia. pelomenos em pascal é assim que funciona. Acho que com o tempo agente se acostuma. Sobre executar qualquer classe com o static void main, aqui eu tentei uma vez e ocorreu um erro de compilação; e amigos, sobre o problema da variável não ser estatica que digo, é a seguinte situação por exemplo: você tem la static void main(string[]args) { string nome = "maurilio"; Console.WriteLine(nome); ele executa isso de boa, e a variável no caso não é estática. ele não pode acessar variáveis fora do método, então. é isso?

no seu exemplo:

public static void main(string[]args) { 
    String nome = "maurilio";

String é uma varíavel local e não de classe, então ela pode ser usada dentro do método normalmente.

Agora o que estamos passando como argumento é na verdade um varargs que pode receber 0 ou mais valores, por isso podemos passar vazio.

insira seu código aquiEntendi. Ou melhor, estou começando a entender. Essas dúvidas são extremamentes xatinhas quando agente começa em orientação a objetos. Sobre isso de tentar executar dois arquivos que tem a public static void main, ou isso de dar erro quando tentamos instansiar um objeto de uma classe que contenha a declaração, seria algo para eu me preocupar mais para frente, no caso?

Você tem que pensar que o método main é igual a outro método, porém é invocado pela JVM. Dentro do seu programa pode ter outras classes com o método main, porém ao criar um jar(executável) você deve referenciar apenas uma classe que será executada pela JVM. Geralmente temos uma classe com o método main que da o "start"no projeto e acaba rodando o resto da aplicação.

Maurilio,

Pelo que percebi nos seus comentários você executando código .NET, com C#. No caso de ter dois métodos main, indo pelo Visual Studio, dentro das configurações do projeto na aba "Application" tem um opção chamada "Startup Object", ali você seleciona a classe que tem o método Main que você quer que seja o ponto inicial do seu programa.

Abraço.