【细说Java】揭开Java的main方法神秘的面纱(转)
大家都知道,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方法神秘的面纱(转)的更多相关文章
- 【细说Java】揭开Java的main方法神秘的面纱
大家都知道,main方法是Java应用程序的入口,其定义格式为: public static void main(String[] args) 可是为什么要这么定义呢?不这样定义可以么?main方法可 ...
- Java程序入口:main()方法讲解
Java程序的入口---main()方法的签名为:public static void main(String[] args) {...} ,其中, ♦ public修饰符:Java类由JVM调用,为 ...
- java语言规范,main方法必须声明为public
注释: 根据java语言规范,main方法必须声明为public. 当main方法不是public时,有些版本的java解释器也可以执行java应用程序.有个程序员报告了这个bug. 如果感兴趣可以查 ...
- 第4篇-JVM终于开始调用Java主类的main()方法啦
在前一篇 第3篇-CallStub新栈帧的创建 中我们介绍了generate_call_stub()函数的部分实现,完成了向CallStub栈帧中压入参数的操作,此时的状态如下图所示. 继续看gene ...
- 第29篇-调用Java主类的main()方法
在第1篇中大概介绍过Java中主类方法main()的调用过程,这一篇介绍的详细一点,大概的调用过程如下图所示. 其中浅红色的函数由主线程执行,而另外的浅绿色部分由另外一个线程执行,这个线程最终也会负责 ...
- 解决Java接口内部类的main()方法无法打印输出的问题
问题源自<Thinking in Java>关于内部类的章节,例子如下: public interface ClassInInterface{ void howdy(); public c ...
- [Java] JVM 在执行 main 方法前的行为
JVM 执行一个 Java 程序时,先从某个指定的 Java 类的 main 方法开始执行代码,同时,传一个字符串数组作为 main 方法的参数.例如在 Unix 系统上,执行下面的命令 java T ...
- 简述java程序中的main方法
简述main方法: 在java语言程序编写时都会涉及到一个main方法,它的格式为: public static void main(String[] args)(一般必须这么定义,这是java规范) ...
- Java使用agent实现main方法之前
创建Agent项目 PreMainExecutor 类,在main方法之前执行此方法 public class PreMainExecutor { public static void premain ...
随机推荐
- 射频识别技术漫谈(27)——CPU卡概述
智能卡按安全级别可以分为三类:存储器卡.逻辑加密卡和CPU卡,其中CPU卡是安全级别最高的.从“CPU”这个名字可以看出,CPU卡最大的特点就是卡片里面有一个"CPU",有了CPU ...
- 盛希泰:办公室就像男人的春药——人的一生的精力是有限的,你把有限的时间分配给谁决定你的成败——你有N多选择,你人生的积累就是N多选择加起来的结果
欢迎关注“创事记”的微信订阅号:sinachuangshiji 创事记注:12月22日晚上,盛希泰在清华大学旧经管报告厅面对清华师生讲了一堂<创业引导课>.本文由洪泰帮根据课堂录音整理完成 ...
- JS获取整个HTML网页代码 - Android 集美软件园 - 博客频道 - CSDN.NET
JS获取整个HTML网页代码 - Android 集美软件园 - 博客频道 - CSDN.NET JS获取整个HTML网页代码 分类: Android提高 2012-01-12 23:27 1974人 ...
- mahout贝叶斯算法开发思路(拓展篇)2
如果想直接下面算法调用包,可以直接在mahout贝叶斯算法拓展下载,该算法调用的方式如下: $HADOOP_HOME/bin hadoop jar mahout.jar mahout.fansy.ba ...
- 【iOS开发-52】假设要模仿练习,怎样找到其它应用程序的icon、使用框架等资源?
(1)在91助手等站点下载ipa格式的安装包.假设是安卓的应该是apk格式的.此处仅仅说iOS的.比方以下这个,下载到电脑. (2)然后,找到它,右击"归档",相当于解压. (3 ...
- JDBC初步(一)
import java.sql.*; public class TestJDBC { // orcl为oracle数据库中的数据库名,localhost表示连接本机的oracle数据库 // 1521 ...
- [译]Stairway to Integration Services Level 15 – SSIS 参数回顾
介绍 在本文中我们会研究SSIS变量姐妹: SSIS 变量. 我们会演示参数配置,通过包参数管理动态属性值,然后会演示SSIS包执行的时候参数怎么被配置的. SSIS Parameters 101 S ...
- BZOJ 3293 分金币
整体来说,这道题与之前做的1045题目完全一样,出了说法不一样外,思路及做法可以照搬,因此在这里便不再详解. 程序如下:(如有疑问请参看我的博客http://www.cnblogs.co ...
- BZOJ 1898: [Zjoi2004]Swamp 沼泽鳄鱼( dp + 矩阵快速幂 )
----------------------------------------------------------------------- #include<cstdio> #incl ...
- php随笔4-thinkphp 学习-ThinkPHP3.1快速入门(2)数据CURD
ThinkPHP3.1快速入门(2)数据CURD 浏览:194739 发布日期:2012/09/05 分类:文档教程 关键字: 快速入门 CURD 上一篇中,我们了解了ThinkPHP的基础部分, ...