Можем ли мы перегрузить метод main () в Java? - PullRequest
2 голосов
/ 17 февраля 2011

Следующий код просто печатает слово "hi" при запуске.

import java.util.*;
import java.io.*;

class poly
{
    public static void main(String c)
    {
        System.out.println("enter a char");
        InputStreamReader ir=new InputStreamReader(System.in);
        BufferedReader br =new BufferedReader(ir);
        //char l= br.readLine();
        System.out.println("this is "+c);
    }

    public static void main(String args[]) throws Exception
    {
        System.out.println("hi");
    }
}

Есть ли способ перегрузить метод main()?

Ответы [ 8 ]

19 голосов
/ 17 февраля 2011

Ваша программа начинается только с одного местоположения, так что это не имеет смысла.Кроме того, полиморфизм - это совершенно другое понятие;это называется перегрузка , не полиморфизм.

7 голосов
/ 17 февраля 2011

То, что вы пытаетесь сделать, это перегрузка main метод, не делая его полиморфным.И нет, вы не можете этого сделать (или, если быть точным: перегрузить можно, только JVM не будет вызывать перегруженные версии).JVM ищет метод main с определенной сигнатурой, а именно с параметром String[].

Возможно, если вы расскажете нам больше о фактической проблеме, которую вы пытаетесь решить, мы можем предложить альтернативные решения.

1 голос
/ 22 января 2015

Вкратце вы можете перегрузить основную функцию, такую ​​как:

class A
{

    public static void main(String s) {
        System.out.println(s);
    }

    public static void main(int s) {
        System.out.println(s);
    }

    public static void main(String args[])
    {
        System.out.println("inside main entry");
        main("me");
    }

}

Выход:

внутри основной записи

me

Мы можем иметьномер основного метода, который может быть перегружен, но основной поток приложения всегда будет начинаться с метода с сигнатурой:

       public static void main(String[] args)

и ничего больше.

В Java аргументы содержатпредоставленные аргументы командной строки в виде массива объектов String.

1 голос
/ 17 февраля 2011

Код правильный, вы перегрузили основной метод.Но, как упоминал Питер, основной поток приложения всегда будет начинаться с метода с подписью

 public static void main(String[] args)

и ничем иным.Для запуска приложения JVM игнорирует все другие main методы.Чтобы выполнить содержимое, вы должны будете вызвать его в своем коде, например, так:

 public static void main(String args[]) {
    main("me");
 }

(должно выводить «this is me» на консоль)

0 голосов
/ 11 ноября 2014

Я не совсем уверен, что вы спрашиваете, но я не вижу причин, по которым вы не можете перегрузить основной метод. «Основной метод, который, я думаю, вы имеете в виду, это

public static void main(String c)
{
    System.out.println("enter a char");
    InputStreamReader ir=new InputStreamReader(System.in);
    BufferedReader br =new BufferedReader(ir);
    //char l= br.readLine();
    System.out.println("this is "+c);
}

Чтобы перегрузить этот метод, я бы создал такой метод, как

public static void main(){}

Это должен быть тот же класс, что и другой основной метод, чтобы сделать его перегруженным. Ключевое слово static означает общее с классом ..... (нет необходимости использовать объект для доступа к методу из метода main(String[] args).

В моем случае создание перегруженного метода в классе аналогично созданию другого метода. Разные аргументы, список параметров ====> разные подписи ======> разные методы.

Надеюсь, это поможет.

0 голосов
/ 17 февраля 2011

Среда выполнения Java ищет только точное совпадение с public static void main(String[]), которое определяется как точка входа для автономных приложений Java.

Чтобы смоделировать поведение, которое вы хотите, вы должны вызвать другую главную функцию самостоятельно:

/**
* Your method called main, ignored by the java runtime since
* it does not match the signature. Called by the valid main(String[]) 
**/
public static void main(String c)
    {
    System.out.println("enter a char");
    InputStreamReader ir=new InputStreamReader(System.in);
    BufferedReader br =new BufferedReader(ir);
    //char l= br.readLine();
    System.out.println("this is "+c);

}
/**
* Starting point of your program, called by the java runtime.
*/
public static void main(String args[])throws Exception
    {
    if(args.length >= 1){
       main(args[0]);

    }else{

        System.out.println("hi");
    }
}

Как и другие указывают на то, что несколько методов с одинаковым именем, но с разными параметрами, вызываются через * загрузка * и не полиморфизм (более * запись *).

0 голосов
/ 17 февраля 2011

Может быть, вы хотите что-то подобное?

import java.util.*;
import java.io.*;

class poly {

   public static void main(String c)
   {
      System.out.println("enter a char");
      InputStreamReader ir=new InputStreamReader(System.in);
      BufferedReader br =new BufferedReader(ir);
      //char l= br.readLine();
      System.out.println("this is "+c);

   }
   public static void main(String args[])throws Exception
   {
       if (args.length == 1) {
          poly.main(args[0]);
       }
       else {
          System.out.println("hi");
       }
   }
}
0 голосов
/ 17 февраля 2011

Вы можете перегрузить основной метод в Java;однако, запуск загрузчика классов из перегруженного метода main будет довольно хитрым.

Проверяется класс, который вы передаете исполняемому файлу java, читаются его статические методы и контроль передаетсятолько к тому, который выглядит как

public static void main(String[] args) { ... }

Поскольку это статический метод, а в Java нет концепции наследования статических методов, у вас нет возможности перегрузить этот метод.Поскольку в Java нет концепции наследования статических методов, подклассификация статических битов класса является бессмысленной идеей.

...