мы можем иметь main () в интерфейсе и разные реализации для main () в классах, которые реализуют этот интерфейс? - PullRequest
8 голосов
/ 14 марта 2012

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

main(String args[]) in an interface and implement it in different classes differently?

Например,

package test;
interface test
{
    public void main(String args[]);
    public void display();
}



package test;
class Testclass1 implements test
{
   public void display()
   {
       System.out.println("hello");
    }
   public static void main(String[] args)
   {
       test t;
       t.display();
    }
}


package temp;
import test.*;
abstract class Testclass2 implements test
{
   public static void main(String args[])
   {
       System.out.println("TESTING");
    }
}

Ответы [ 11 ]

15 голосов
/ 14 марта 2012

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

Да, вы можете запустить psvm в интерфейсе, если вы работаете в Java 8. Поскольку статические методы разрешены в интерфейсе, начиная с Java 8.

Но, конечно, вы не можете переопределить метод main, так как psvm является статическим методом.

9 голосов
/ 15 мая 2015

В Java-8 вы можете определить метод main внутри интерфейса, код ниже будет работать в Java-8.

public interface TestInterfaces {
    public static void main(String[] a){    
        System.out.println("I am a static main method inside Inteface !!");
    }
}
2 голосов
/ 14 марта 2012

Есть два ответа на ваш вопрос.

  1. Прежде всего, вы не можете иметь static методы в Interface
  2. Да, вы можете перегрузить main() метод, но когда вы запускаете ваш класс, только public static void main(String args[]){} метод будет рассматриваться как точка входа.

Например

public class Test {
    public static void main(String[] args) {
        System.out.println("entry point)");
    }

    public static void main(String arg1) {
        System.out.println("overload2");
    }

    public static void main(String arg1, String arg2) {
        System.out.println("overload3");
    }
}

Когда вы запустите вышеупомянутый класс, out будет "entry point"

0 голосов
/ 16 марта 2018

Вы можете написать статический метод main в Interface в java 8, но вы не можете переопределить его, поскольку он является статическим.

0 голосов
/ 14 июля 2017

Ответ: Да, мы можем предоставить различную реализацию main (), объявленную в интерфейсе, и классы, реализующие этот интерфейс, путем переопределения метода и могут перегрузить статический метод main, если он определен в интерфейсе.

Дополнительная информация оизменения интерфейса в Java 8.

До Java 8 было невозможно определить DEFINE методы внутри интерфейса.

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

public interface TestInterfaces {
    public static void main(String[] a){    
        System.out.println("I am a static main method inside Inteface !!");
    }
}

Для получения информации об этих функциях, пожалуйста, перейдите по ссылке ниже: http://www.journaldev.com/2752/java-8-interface-changes-static-method-default-method

0 голосов
/ 20 марта 2017

main () - это static.so, мы не можем переопределить статические методы. Интерфейсы позволяют использовать методы абстрактных методов, и они будут реализованы в подклассах. Итак, абстрактные методы никогда не будут статическими. Наконец, я пришел к выводу, что main () невозможно выполнить в интерфейсах.

0 голосов
/ 14 марта 2012

вы объявили main (String [] args) как статический в Testclass1, но в интерфейсе "test" он не является статичным и интерфейс не позволяет main (String [] args) в качестве статического .even, если вы переопределяете main (String) [] args) в Testcalss1 как нестатический, это не разрешено, потому что main (String args) уже определена в Testclass1.так вы не можете объявить main (String [] args) в интерфейсе. И вы сделали еще одну ошибку, инициализируя Тест интерфейса как т. Вы не можете сделать это.

0 голосов
/ 14 марта 2012

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

public class RunTests {
    public static void main(String... args) throws ClassNotFoundException {
        List<Class> classes = new ArrayList<Class>();
        try {
            for (String arg : args) {
                classes.add(Class.forName(arg));
            }
        } catch (ClassNotFoundException e) {
            if (classes.isEmpty())
                throw e;
        }
        String[] remainingArgs = Arrays.asList(args).subList(classes.size(), args.length).toArray(new String[0]);
        for(Class clazz: classes) {
            try {
                Test test = (Test) clazz.newInstance();
                test.main(remainingArgs);
                test.display();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

interface Test {
    public void main(String... args);
    public void display();
}

Кстати: вам не нужно использовать метод main (), например,

class NoMain {
    static {
       System.out.println("Hello World");
       System.exit(0);
    }
}

компилируется и запускается без ошибок.

0 голосов
/ 14 марта 2012

Я не уверен, но Вы можете иметь несколько основных методов в нескольких классах (не в одном классе) . Мы запускаем программу с именем класса, основной метод которого мы хотим запустить. Поэтому после этого JVM будет искать метод main только в этом классе. Так что не должно быть никаких проблем.

Я не уверен, поэтому, пожалуйста, дайте мне знать, если я ошибаюсь.

0 голосов
/ 14 марта 2012

Я думаю, что вы что-то упустили.Статические методы (например, метод main в Testclass1 и Testclass2) не могут переопределять методы подкласса.

...