大家都知道,main方法是Java应用程序的入口,其定义格式为:

  public static void main(String[] args)

  可是为什么要这么定义呢?不这样定义可以么?main方法可以继承么?可以重载么?可以被其他方法调用么?

1. main方法为什么这么定义?

  (1) 因为main方法在启动时是通过Java的虚拟机,也就是JVM来调用的,并且没有通过对象的引用来调用,所以main方法是public和static的。而void是因为,main方法在退出时,没有给退出代码,而是在需要时使用System.exit(int status)方法来返回,所以返回类型是void。而字符串数组参数是程序用来运行时接受用户输入的,具体长度取决于用户输入参数的个数。

  (2)我们试着修改main方法的原型,如去掉static访问控制符,编译没有问题,而运行时出现了如下问题:

  Exception in thread "main" java.lang.NoSuchMethodError:main

  然后修改返回值或参数,运行时都会出现错误信息,因为虚拟机要调用的是带有static的main方法,而程序中main方法与标准的main方法是不一致的,所以调用时会找不到需要的main方法,所以会报错。

2.main方法可以重载么?

  在程序中,我们定义四个同名的方法,运行一下,看一下结果:

   public static void main(String[] args) {
System.out.println("我是应用程序的入口");
main();
main(1);
main(2,2);
} public static void main() {
System.out.println("我是无参的main方法");
} public static void main(int x) {
System.out.println("我是参数类型为int的main方法");
} public static void main(int x, int y) {
System.out.println("我是有两个参数类型的main方法");
}

运行结果为:

1
2
3
4
我是应用程序的入口
我是无参的main方法
我是参数类型为int的main方法
我是有两个参数类型的main方法

通过以上例子,可以说明main方法是可以重载的。

3. main方法是否可以被其他方法调用?

public class JavaTest {
private static int times = 3; public static void main(String[] args) {
if (times < 0) {
System.exit(0);
}
test(args); } public static void test(String[] args) {
times--;
System.out.println("调用main方法次数.");
main(args);
}
}

结果为:

调用main方法次数.
调用main方法次数.
调用main方法次数.
调用main方法次数.

本例中,main方法调用test方法,而test方法又调用main方法,产生了递归调用,所以我们使用了一个静态变量用于指定调用的次数。

通过本例可以看出,main方法也可以被其他方法调用。

4. main方法可以继承么?

  Java中,当类继承后,子类可以访问父类的变量和方法,那么,把问题特殊化,当父类定义了main方法,而子类没有定义main方法,子类是否可以正常的访问呢。换句话说,子类是否可以继承父类的main方法呢?

public class JavaTest extends SuperClass {

}

class SuperClass {
public static void main(String[] args) {
System.out.println("test");
}
}

我们使用命令行进行操作:

java SuperClass

没有问题,输出了正常结果:

test

现在我们用:

java JavaTest

程序也输出了结果:

test

从JavaTest中看,类中没有定义任何成员,但同样可以正常运行,并且与父类有着相同的结果。因此可以说明,main方法也是可以被继承的。

5. main方法是否可以被隐藏?

  既然main方法可以继承,那是否可以在子类中定义自己的main方法,隐藏掉父类的main方法呢?

public class JavaTest extends SuperClass {
public static void main(String[] args) {
System.out.println("JavaTest");
}
} class SuperClass {
public static void main(String[] args) {
System.out.println("SuperClass");
}
}

通过运行结果我们知道,JavaTest这个类调用了自己的main方法,从而隐藏掉了父类的main方法。

注意:隐藏和重写还是有一点区别的,因为隐藏只针对static方法,至于具体的区别,后面再详细讲。

总结:其实main方式和普通的静态方法没有太大的区别,唯一的区别就是它被JVM选择做了Java应用程序的入口。

参考自:《细说Java》

http://www.cnblogs.com/xiaozhang2014/p/5322022.html

【细说Java】揭开Java的main方法神秘的面纱(转)的更多相关文章

  1. 【细说Java】揭开Java的main方法神秘的面纱

    大家都知道,main方法是Java应用程序的入口,其定义格式为: public static void main(String[] args) 可是为什么要这么定义呢?不这样定义可以么?main方法可 ...

  2. Java程序入口:main()方法讲解

    Java程序的入口---main()方法的签名为:public static void main(String[] args) {...} ,其中, ♦ public修饰符:Java类由JVM调用,为 ...

  3. java语言规范,main方法必须声明为public

    注释: 根据java语言规范,main方法必须声明为public. 当main方法不是public时,有些版本的java解释器也可以执行java应用程序.有个程序员报告了这个bug. 如果感兴趣可以查 ...

  4. 第4篇-JVM终于开始调用Java主类的main()方法啦

    在前一篇 第3篇-CallStub新栈帧的创建 中我们介绍了generate_call_stub()函数的部分实现,完成了向CallStub栈帧中压入参数的操作,此时的状态如下图所示. 继续看gene ...

  5. 第29篇-调用Java主类的main()方法

    在第1篇中大概介绍过Java中主类方法main()的调用过程,这一篇介绍的详细一点,大概的调用过程如下图所示. 其中浅红色的函数由主线程执行,而另外的浅绿色部分由另外一个线程执行,这个线程最终也会负责 ...

  6. 解决Java接口内部类的main()方法无法打印输出的问题

    问题源自<Thinking in Java>关于内部类的章节,例子如下: public interface ClassInInterface{ void howdy(); public c ...

  7. [Java] JVM 在执行 main 方法前的行为

    JVM 执行一个 Java 程序时,先从某个指定的 Java 类的 main 方法开始执行代码,同时,传一个字符串数组作为 main 方法的参数.例如在 Unix 系统上,执行下面的命令 java T ...

  8. 简述java程序中的main方法

    简述main方法: 在java语言程序编写时都会涉及到一个main方法,它的格式为: public static void main(String[] args)(一般必须这么定义,这是java规范) ...

  9. Java使用agent实现main方法之前

    创建Agent项目 PreMainExecutor 类,在main方法之前执行此方法 public class PreMainExecutor { public static void premain ...

随机推荐

  1. 从51跳新唐cortex学习3——细说新唐两种定时器

    的定时器我们已经是相当熟悉啦.但是,对于第一次接触新唐,第一次接触cortex的定时器一样,都是加1计数,但是功能和容量变大了),包括4个32位定时器(里面放24位的数据),还有分频功能.TMER0到 ...

  2. Delphi XE中使用dbExpress连接MySQL数据库疑难问题解决(对三层的例子配置有帮助)

    Delphi IDE中包含一个Data Explorer的组件,如下图所示: 该组件基于dbExpress(包含TSQLConnection.TSQLDataSet.TSQLQuery.TSQLSto ...

  3. 激活Windows 10 正式版

    原文 http://jingyan.baidu.com/article/27fa732684b5f646f8271ff4.html Windows 10只提供为期一年的免费升级.因此,不要无限拖延期自 ...

  4. android 播放assets文件里视频文件的问题

    今天做了一个功能,就是播放项目工程里面的视频文件,不是播放SD卡视频文件. 因为之前写webview加载assets文件夹时,是这样写的: webView = new WebView(this); w ...

  5. 宣布发布 Windows Azure ExpressRoute,宣告与 Level 3 建立全新的合作伙伴关系并推出关于其他 Azure 服务令人振奋的更新

     在我们与世界各地的客户和合作伙伴交谈时,总会听到他们说,希望找到一个提供商帮助他们最大限度地发挥内部部署投资的作用并且能够利用云的灵活性.这是我们构建混合云策略和云操作系统愿景的基本原则.本着我 ...

  6. Home | WebScraping.com

    Home | WebScraping.com We specialize in extracting data from websites, which is known as web scrapin ...

  7. I can do it!(贪心)

    I can do it! Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Tot ...

  8. hdu 1085 Holding Bin-Laden Captive! (母函数)

    //给你面值为1,2,5的三种硬币固定的数目,求不能凑出的最小钱数 //G(x)=(1+x+...+x^num1)(1+x^2+...+x^2num2)(1+x^5+,,,+x^5num3), //展 ...

  9. CSS中 清除浮动解决“包含问题”

    今天看到大神对浮动定位作了个详细的分析  刚好就分析了当时任务三遇到的问题 在一个div中定义了三个div,让横向排列,结果父元素div的背景色显示不出来了 ,这是个经典问题----包含浮动 < ...

  10. DevExpress ASP.NET 使用经验谈(9)-Dev控件客户端事件 ClientSideEvents

    上一节,已经介绍了ASPxGridView的自定义列和基本事件 ,本节接着将介绍Dev控件的客户端事件模型. 在上节示例基础上,我们增加一行菜单,使用Dev的ASPxMenu来实现,如下图所示. 图一 ...