我最近在考试中询问public static void main(String arg[])
格式的main
方法是否修复? 我们可以改变它吗? 我们可以使用main
而不是public
,static
或void
? 如果没有,为什么它不是硬编码,main(String arg[])
将始终代表public static void main(String arg[])
?java中的public static void main(String arg [])是否被修复?
回答
主要方法的签名在Java Language Specifications section 12.1.4规定,并明确规定:
The method main must be declared public, static, and void. It must specify a formal parameter (§8.4.1) whose declared type is array of String.
- 它必须是
public
否则就不可能把它 - 那一定是因为你
static
在调用它之前没有办法实例化对象 - 参数
String
的列表允许从命令行执行Java程序时传递参数。它有可能没有参数地定义它,但是更实用(类似于其他语言) - 返回类型为
void
,因为它没有任何意义:Java程序可以在到达之前终止主要方法的结尾(例如,通过调用System.exit()
)
方法签名,因此可以:
public static void main(String[] args)
public static void main(String... args)
注意,可变参数版本(...
)只是从Java 5
有效的Java语言允许括号[]
定位在类型或变量之后(第一个通常是首选),
public static void main(String args[]) // valid but usually non recommended
也是有效
我无法回答该方法的参数,但它必须是公开的,因为jvm必须能够访问该函数并且它必须是静态的,因为jvm不知道如何创建你的类的实例。
这篇文章提供了关于推理静态的好详细的解答:Why is the Java main method static?
这篇文章提供了为什么主要是无效的一个很好的答案:Why is main() in java void?
你可以,如果你创建了一个新的Loader改变你的应用。 public static void main(String args []) format仅仅是默认的解决方案,人们在JVM上发现调用你的Java程序,所以有一个明确的方法来做到这一点。
真正实现我们今天只是使用JNI接口使用this function调用公共静态无效的主要(字符串ARGS [])方法,因此,如果你想使用JNI,你可以很容易地写完全相同的代码和有不同的方法来加载你的应用程序。
Here's an example in code它取自this page。
这是当前的linux启动程序the method lookup starts here。
您确定吗?我的热点源代码有硬编码:'(* env) - > GetStaticMethodID(env,mainClass,“main”, “([Ljava/lang/String;)V”);' – Voo 2012-04-05 12:41:58
不是在语言规范中定义的,只有按照定义实施才能保证工作。任何不符合规格的东西都不能保证正常工作。 http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.1.4 – Matteo 2012-04-05 12:45:04
当然是,请检查启动器的源代码。 https://gist.github.com/2310831#L465 – 2012-04-05 12:50:21
如果你看看JDK的源代码(JDK-SRC \ J2SE的\ src \共享\ BIN \ java.c):
/* Get the application's main method */
mainID = (*env)->GetStaticMethodID(env, mainClass, "main",
"([Ljava/lang/String;)V");
...
{ /* Make sure the main method is public */
...
mods = (*env)->CallIntMethod(env, obj, mid);
if ((mods & 1) == 0) { /* if (!Modifier.isPublic(mods)) ... */
message = "Main method not public.";
messageDest = JNI_TRUE;
goto leave;
...
它变得非常清楚,它必须只有这个签名。
公共主()必须通过的任一个一起使用的方法的类的外部以及所述类内部,从而它的公共
静态静电是必要bcoz在Java如果我们定义类比我们为该类定义的对象,并且只有比我们可以使用该类...而不是我们直接使用写入单词静态
void-for main()不能返回任何值,如int或char main() - main是我们可以用来访问java的未来的函数或方法 字符串在Java中所有我们写考虑作为一个字符串 ARGS论点
If not, why is it not hard coded that main(String arg[]) would stand for public static void main(String arg[]) always?
你可以有方法称为“主”与你喜欢的任何签名和访问。特殊规则仅适用于您希望JVM调用以启动程序的方法。
public class Test {
public static void main(String[] args) {
StrangeMain m = new StrangeMain();
System.out.println(m.main());
System.out.println(m.main(new String[]{"aaa","bbb"}));
}
}
class StrangeMain{
protected String main(){
return "xyzzy";
}
protected String main(String[] arg){
return arg[0];
}
}
编译,运行,输出:
xyzzy
aaa
公开是一种访问符由于我们可以从类的外部访问。由于main是充当执行点的函数。主函数由类之外的JVM调用,因此它必须声明为public。
static是java中用来指定不需要创建任何实例的关键字。正如我们所知,main方法也驻留在类中,并且从类外部访问类的特定功能(在这种情况下来自JVM),因此需要该特定类的实例,因此为了避免这些,我们只需将静态访问课堂外的主要方法。
Void是返回类型,因为main方法中的其他返回类型是无意义的。
字符串是java中的预定义类名。而args []是数组类型的变量。它是一个String类型对象的变量名称。所以我们也可以改变args []的名字。字符串类及其对象可以作为参数在正在运行的程序中传递,以便将信息从命令行传递给主方法。
Public static void main(String [] ar)
为了理解这一点,我们需要知道方法和数组的语法。方法的
语法是:
返回类型方法名
所以主要方法与空隙是返回类型一起被写入。
语法阵列:
数据类型[] arrayName中
的方括号指示它是否是维阵列。既然我们有一对正方形的牙套它是一个维阵列。
字中的主要方法的含义:
公共:公用是访问指示符意为JVM的目的从任何地点执行的主要方法。
静态:静态是一个修饰符。主要方法必须声明为静态,以便JVM可以直接使用类名称访问主要方法。
当我们执行一个java程序时,我们使用类名,所以当我们写静态时它将帮助JVM访问主要方法。
如果我们删除静态,那么它将成为实例方法,访问我们应该创建的实例方法和对象,然后使用对象引用调用方法。
void:void是主方法的返回类型。主要方法的调用方是JVM,JVM不期望主方法有任何值,因此主方法不应返回任何值。这是指定Void的原因。
main:Main是方法名,它是根据Java编码规范修复的。
String []:它用于存储命令行参数。数组的名称可以是任何有效的Java标识符。
所以在String []之后,我们可以给任何有效的java标识符命名,它可以是'ar',也可以是'args'。
- 1. public static void main(String [] args)和public static void main(String args [])之间的区别?
- 2. `public static <T> void main(String [] args)`代表什么?
- 3. 我还是不明白public static void main(string [] args)
- 4. 我们可以使用public static void main(String [] [] args)吗?
- 5. 为什么要在public static void main(String [] args)上抛出异常?
- 6. 错误:请定义主要方法为:public static void main(String [] args)
- 7. 在Servlet中使用的Websocket,是“public static void main(final String [] args)”需要吗?
- 8. 使用int而不是字符串:public static void main(int [] args)
- 9. 试图在程序中新建一个ContextFactory> public static void Main
- 10. public static void <callbackMethodName>(IAsyncResult)
- 11. 替换数组项,源值也被替换为public static void
- 12. 为什么我无法从public static void main更改JLabel中的文本?
- 13. 编写一个没有“public static void main”的JMS发布服务器
- 14. Java:什么是 - public static <T> foo(){...}?
- 15. public vs public static方法
- 16. 为什么public static final string不能用在java开关
- 17. 差分<p>我想知道在主要方法<code>String[]</code>和<code>String</code>之间的差</p> <pre><code>public static void main(String[] args) { </code></pre> <p>VS</p> <pre><code>public static void main(String args) { </code></pre>
- 18. 这是什么语法 - public static 9000?
- 19. 如何调用public void protected void
- 20. Java课程:public void displayMessage()不工作
- 21. Java中的未声明类是否为public?
- 22. 什么是错误的void main()?
- 23. public void paintComponent(Graphics g)not working
- 24. main(String args [])和main(String [] args)之间有区别吗?
- 25. public interface inf1 {void show(); } public interface inf2 {void show(); }公共类A:INF1:INF 2 {}
- 26. static final String或strings.xml
- 27. C中的void和static void函数有什么区别?
- 28. Main类中的“string [] args”是什么?
- 29. 在D中使用`void main`
- 30. “在Java中将”frame“的修改器更改为”static“”
你可以很容易地创建一个新的启动器,它可以以不同的方式完成,方法不必是公开的(JNI接口允许你调用任何**方法),它不一定是静态的,JNI接口可以通过调用它的构造函数再次创建任何对象**,然后调用实例方法。 – 2012-04-05 12:53:36
@MaurícioLinhares我完全知道我可以打电话给我想要的任何东西,但不能保证它能正常工作。一个JVM(还有其他JVM也不是来自Oracle)只是被迫遵循规范。他们可能只是产生一个错误,并告诉你“没有办法,即使技术上可行,也不是标准的”。规范被称为规范的原因。 – Matteo 2012-04-05 12:56:42
**不能保证它会工作**?你是什么意思?我的个人发射器无法工作,因为规范说明了吗?任何启动程序**都可以工作**只要所启动的类符合标准,请检查其他答案和源代码示例。 – 2012-04-05 12:58:37