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