我们可以在接口中有一个main(),在实现该接口的类中有main()的不同实现吗



我知道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");
    }
}

不可以,因为main必须是静态的才能用作入口点,而接口在Java 7之前不允许使用静态。

是的,如果您在Java 8中工作,您可以在接口中运行psvm。因为从Java 8开始的接口中允许使用静态方法。

当然,您不能重写main方法,因为psvm是一个静态方法。

使用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 !!");
    }
}

您的问题有两个答案。

  1. 首先,Interface中不能有static方法
  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");
    }
}

当您启动上面的类时,输出将是"entry point"

我不确定,但在多个类(不是同一个类)中可以有多个主方法。我们用要运行其主方法的类的名称启动程序。因此,JVM将只在该类中查找主方法。所以应该没有任何问题。

我不确定,所以如果我错了,请告诉我。

您可以创建自己的启动机制,但我不确定您为什么要这样做。

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();
}

BTW:你不必有main()方法,例如

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

编译并运行时没有出现错误。

您在Testclass1中将main(String[]args)声明为static,但在接口"test"中它是非静态的,接口不允许main(String[]args)为static。即使您将Testcalss1中的main(String[]args。你又犯了一个错误,把接口测试初始化为t。你不能这么做。

main()是静态的。因此,我们不能覆盖静态方法。接口允许抽象方法方法&它们将在子类中实现。因此,抽象方法永远不会是静态的。最后我得出结论,main()不可能在接口中执行。

您可以在java 8的Interface中编写静态主方法,但不能覆盖它,因为它是一个静态方法。

希望这个例子能有所帮助:

要访问接口静态方法,我们需要使用接口名称:来自java1.8

interface A {
    public static void main(String[] args) {
        System.out.println("Interface main method");
    }
}
public class MyClass {
    public static void main(String args[]) {
        A.main(new String[]{});
        System.out.println("Main main");
    }
}
输出:

接口主方法

我想你遗漏了一些东西。静态方法(如Testclass1Testclass2中的主方法)不能覆盖子类方法。

回答:是的,我们可以提供在接口中声明的main()的不同实现,以及通过重写方法实现该接口的类,如果在接口中定义了静态main方法,则可以重载该方法。

有关Java 8中接口更改的更多信息。

在Java8之前,不可能在接口内定义方法。

但Java 8在接口方面有一些变化,可以在接口内定义默认和静态方法。因此,下面的代码将正常工作,没有任何问题。

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

这是一个编译器错误。您不能覆盖非静态接口静态方法

相关内容

  • 没有找到相关文章

最新更新