黑马程序员技术交流社区

标题: main(String{} args)你不了解的细节 [打印本页]

作者: 海狮    时间: 2015-10-14 12:47
标题: main(String{} args)你不了解的细节
大家都知道main()方法是一个Java程序的入口,是一个很特殊的方法。但你知道main()其实也有跟一般方法一样,可以重载、调用、继承、隐藏。这里,我帮大家揭开它的神秘面纱。
先看一下main()方法原型
  1. class MainDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 System.out.println("mainDemo");
  6.                 for(int i=0;i<args.length;i++)
  7.                 {
  8.                         System.out.println(args[i]);
  9.                 }
  10.         }
  11. }
复制代码
简单说下main()方法修饰符
由于java虚拟机外部调用main()方法,所以main()必须是public权限
而java虚拟机是直接调用方法,而不是先产生对象再调用,所以方法必须静态方法所以加static
main()不需要返回值,所以void
参数方面,可以写成 (String[] args)也可以写成(String args[]),当然形参名称不限
参数是虚拟机调用main()方法时传入,例如:
编译,在命令提示符中输入(地址方面设置classpath或者转到当面目录下就不写了,大家都会)
  1. javac MainDemo.java
复制代码
运行,在命令提示符中输入
  1. java MainDemo String1 String2
复制代码
结果如下:
  1. mainDemo
  2. String1
  3. String2
复制代码
main()方法接收参数时,以空格作为参数之间的分隔符,所以agrs[0]="String1".agrs[1]="String2".
那么要是我们的参数包含空格怎么办!比如"zhang san","li si","wang wu"
要是这么输入
  1. java MainDemo zhang san li si wang wu
复制代码
结果是:
  1. mainDemo
  2. zhang
  3. san
  4. li
  5. si
  6. wang
  7. wu
复制代码
不是我们想要的。
这时只要加上("")双引号就行,告诉虚拟机,这是一个字符串~
运行:
  1. java MainDemo "zhang san" "li si" "wang wu"
复制代码
结果不告诉你们,自己尝试下
下面才是重点
1,main()方法的重载
一般函数方法都能重载,那main()方法呢?我们测试一下:
  1. class MainDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 System.out.println("我是main(String[] args)方法");
  6.                 main();
  7.                 main(2);
  8.                 main(2,3);
  9.         }
  10.         public static void main()
  11.         {
  12.                 System.out.println("我是main()方法");
  13.         }
  14.         public static void main(int i)
  15.         {
  16.                 System.out.println("我是main(int i)方法");
  17.                
  18.         }
  19.         public static void main(int i,int j)
  20.         {
  21.                 System.out.println("我是main(int i,int j)方法");
  22.         }
  23. }
复制代码
编译,运行
  1. java MainDemo
复制代码
结果如下:
  1. 我是main(String[] args)方法
  2. 我是main()方法
  3. 我是main(int i)方法
  4. 我是main(int i,int j)方法
复制代码
说明main()方法可以被重载;
2,调用main()方法
作为JAVA虚拟机御用的程序入口main(String[] args)方法,能被其他方法调用吗??
小程序测试下:
  1. class MainDemo
  2. {
  3.         public static int time=6;
  4.         public static void main(String[] args)
  5.         {
  6.                 System.out.println("我被调用了"+time+"次");
  7.                 if(time>0)
  8.                         main2(args);
  9.         }
  10.         public static void main2(String[] args)
  11.         {
  12.                 time--;
  13.                 main(args);
  14.         }
  15. }
复制代码
编译,运行
  1. java MainDemo
复制代码
结果如下:
  1. 我被调用了6次
  2. 我被调用了5次
  3. 我被调用了4次
  4. 我被调用了3次
  5. 我被调用了2次
  6. 我被调用了1次
  7. 我被调用了0次
复制代码
由此证明,程序入口可以被其他方法调用。
3.main(String[] args)方法能被子类继承吗?
还是小程序测试:
  1. class MainDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 System.out.println("hello java");
  6.         }
  7. }
  8. class SubMainDemo extends MainDemo
  9. {
  10. //没有定义任何方法,自动继承了main(String[] args)
  11. }
复制代码
编译:
  1. javac MainDemo.java
复制代码
运行父类:
  1. java MainDemo
复制代码
结果
  1. hello java
复制代码
那么运行子类试试?
  1. java SubMainDemo
复制代码
结果:
  1. hello java
复制代码
诶?!结果还是这个,跟父类一样,说明main(String[] args)也是可以被继承的
4,还有一个特殊情况,main方法被隐藏
老朋友小程序:
  1. class MainDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 System.out.println("hello java");
  6.         }
  7. }
  8. class SubMainDemo extends MainDemo
  9. {
  10.                 public static void main(String[] args)
  11.         {
  12.                 System.out.println("SubMainDemo's hello java");
  13.         }
  14. }
复制代码
编译:
  1. javac MainDemo.java
复制代码
运行父类:
  1. java MainDemo
复制代码
结果
  1. hello java
复制代码
那么运行子类试试?
  1. java SubMainDemo
复制代码
结果:
  1. SubMainDemo's hello java
复制代码
这里的子类运行了自己的程序入门,看起来被“重写”了,但注意,这不是重写,具体原因以后再说
总结,我们揭开了main方法的神秘面纱,其实就是一个普通方法,只是java虚拟机就乐意在这个方法开始,其他跟一般方法没什么一样的。
有趣的是,在写程序是,不写public 或者 不写 static。即写成:
  1. class MainDemo
  2. {
  3.         static void main(String[] args)
  4.         {
  5.                 System.out.println("hello java");
  6.         }
  7. }
复制代码
或者
  1. class MainDemo
  2. {
  3.         public void main(String[] args)
  4.         {
  5.                 System.out.println("hello java");
  6.         }
  7. }
复制代码
都能编译通过,但是运行会出错(至于什么错误,自己去尝试下)。这说明,编译器只是把main()方法当成普通方法去编译,只是运行时先找它而已。
可以的话求点技术分
作者: SF_NEVERMORE    时间: 2015-10-14 18:27
看起来好高深的样子。
作者: toypaoa    时间: 2015-10-14 20:46
学习了。。。没想那么多
作者: 15001162522    时间: 2015-10-14 21:33
比较仔细 赞你的学习态度哦
作者: 海狮    时间: 2015-10-15 12:43
SF_NEVERMORE 发表于 2015-10-14 18:27
看起来好高深的样子。

其实并不高深,main方法就是普通方法,只是被当成入口




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2