首页 技术 正文
技术 2022年11月15日
0 收藏 865 点赞 2,472 浏览 2192 个字

大家都知道,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方法可以重载么?

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

【细说Java】揭开Java的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方法");
}

【细说Java】揭开Java的main方法神秘的面纱(转)

运行结果为:

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

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

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

【细说Java】揭开Java的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);
}
}

【细说Java】揭开Java的main方法神秘的面纱(转)

结果为:

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

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

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

4. main方法可以继承么?

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

【细说Java】揭开Java的main方法神秘的面纱(转)

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

【细说Java】揭开Java的main方法神秘的面纱(转)

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

java SuperClass

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

test

现在我们用:

java JavaTest

程序也输出了结果:

test

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

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

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

【细说Java】揭开Java的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");
}
}

【细说Java】揭开Java的main方法神秘的面纱(转)

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

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

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

参考自:《细说Java》

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

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,090
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,567
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,415
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,187
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,823
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,906