黑马程序员—main(String{} args)你不了解的细节

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
大家都知道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()方法当成普通方法去编译,只是运行时先找它而已

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值