我知道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 !!");
}
}
您的问题有两个答案。
- 首先,
Interface
中不能有static
方法 - 是的,您可以重载
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");
}
}
输出:
接口主方法
主
我想你遗漏了一些东西。静态方法(如Testclass1
和Testclass2
中的主方法)不能覆盖子类方法。
回答:是的,我们可以提供在接口中声明的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
这是一个编译器错误。您不能覆盖非静态接口静态方法