一个 java 程序里有两个主函数,为什么不是错误??

ITwp1992 2013-04-23 01:34:51
public class A {
public static void main(String[] args) {
Other.main(new String[]{"a","b","c"});
}
}

class Other {
public static void main(String[] args){
for( String s: args)
System.out.print( s + "");
}
}


这个程序输出 abc .

我想知道为什么这个程序有两个主函数??
...全文
10854 28 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
戰_ 2015-10-18
  • 打赏
  • 举报
回复
当编写一个Java源代码文件时,此文件通常被称为编译单元(有时也称为转译单元)。每个编译单元都必须要有一个后缀为.java,而在编译单元内测可以 有一个public类,该类的名称必须与文件名称相同(包括大小写,但不包括文件的后缀名.java)。每个编译单元只能有一个public类,否则编译 器就不会接受。如果在该编译单元之中还有额外的类的话,那么在包之外的世界是无法看见这些类的,这是因为他们不是public类,而且他们主要用来为主要 public类提供支持。
有明丶 2014-09-08
  • 打赏
  • 举报
回复
首先纠正一下 main 不应该叫做主函数,应该叫做入口函数更加准确,java只有一个入口函数,默认情况下,java会到每一个类里找入口函数,如果找到了,就执行(封装jar也可手动选择入口)。 既然是要保证入口函数能被执行,首先就得保证入口函数对外可见。这个例子中,Other类对外是不可见的,所以这个main是不能被当作入口的。
qiuqiupeng 2014-09-08
  • 打赏
  • 举报
回复
你只是写在同一个文件里,编译好的.class文件还是2个
Kenney_Qin 2014-09-07
  • 打赏
  • 举报
回复
程序是运行public类里的main,其他类里的无所谓的,反正又不会去运行,可能你会想:那如果我有两个public类呢?你可以试试,它不允许你有两个public类~希望能帮到你~
ewevn 2014-09-05
  • 打赏
  • 举报
回复
亲 我想问myeclipse运行程序时没提示你选择哪个main么? 注掉了当然是运行另外一个了,没有main方法eclipse是不能运行的!
zad19910805 2014-09-02
  • 打赏
  • 举报
回复
引用 19 楼 u011192793 的回复:
一个java文件中两个类而已,运行时会提供你两个入口 让你通知jvm从哪个入口执行。。一个类中只能有一个main方法。。外部类内部类也是同样的道理,两个main方法两个入口,选择一个。。。
那么,我想切换入口时怎么办呢? 上代码…… package statictest; public class StaticTest { public static void main(String[] args){ Employee[] staff=new Employee[3]; staff[0]=new Employee("Tom",40000); staff[1]=new Employee("Dick",60000); staff[3]=new Employee("Harry",65000); for(Employee e:staff){ //for(int i=0;i<staff.length;i++) e.setId(); System.out.println("name="+e.getName()+", id="+e.getId()+", salary="+e.getSalary()); } int n=Employee.getNextId(); // System.out.println("Next available id="+n); } } class Employee{ private static int nextId=1; private String name; private double salary; private int id; Employee(String name, double salary){ this.name=name; this.salary=salary; this.id=0; } public String getName(){ return this.name; } public double getSalary(){ return this.salary; } public int getId(){ return this.id; } public void setId(){ id=nextId; nextId++; } public static int getNextId(){ return nextId; } /*public static void main(String[] args){ Employee e=new Employee("Harry",50000); System.out.println(e.getName()+" "+e.getSalary()); }*/ } 第一次执行的时候用的是Employee里的main方法,但是当Employee中的main方法被注释掉后,我想切换到StaticTest中的main方法,怎么操作?我用的MyEclipse2013
永不感冒患者 2014-08-27
  • 打赏
  • 举报
回复
运行的时候会选择运行哪个类
于金龙 2014-08-27
  • 打赏
  • 举报
回复 6
其实这个很简单了! 让我们回顾一下Java文件命名规则!!! 在Java中多个类虽然可以写在一个.java文件中,但是这些类中只能有一个是public 的!!!而且这个public的必须是跟.java文件的名称相同!!!但是在编译的时候,分别编译成了不同的.class文件 换句话说,你编译了A.java文件后,实际上是生成了2个.class文件,一个是A.class,一个是Other.class 等你执行的时候,你执行的是A,所以在A.class中寻找main方法,这里是程序入口!!! A.class的main方法调用了Other.class的一个名称为main的方法!!!
ewevn 2014-08-26
  • 打赏
  • 举报
回复
一个java文件中两个类而已,运行时会提供你两个入口 让你通知jvm从哪个入口执行。。一个类中只能有一个main方法。。外部类内部类也是同样的道理,两个main方法两个入口,选择一个。。。
accomplish2015 2014-08-26
  • 打赏
  • 举报
回复
楼上各位大神啊,求膜拜啊
candledragon001 2014-08-26
  • 打赏
  • 举报
回复
主函数本身就是一个函数在这个程序中类A为程序的入口,它调用了类other中的main方法
S117 2014-07-25
  • 打赏
  • 举报
回复
不是同一个类呀
徐阳Anyway 2014-07-25
  • 打赏
  • 举报
回复
首先你说的并不是一个程序,只是一个java文件罢了 所以并不是一个程序里两个主函数,只是在一个java文件里写了两个类 两个类没有任何关系,只是调用关系而已 实际运行的时候通知jvm哪个是你的主函数就ok了 希望可以理解
zhangrongchao_ 2013-11-20
  • 打赏
  • 举报
回复
是《thinking in Java》里的吧,原来如此,多谢指点
hymKing 2013-09-21
  • 打赏
  • 举报
回复
不知道这个问题你是否已经搞明白,我的理解和实践是这样的。 你看的实际是假象,并不是两个主函数并存了。你可以做如下两个尝试: 在A类中mian()添加other.main(),点击运行按钮,你看的结果是:两个函数的system语句的内容都输出了。根据这个测试以及你看的结果,显然在运行程序的时候,jvm实际上只是调用了一个main(),而并不是两个main函数并存。基于你的本身的结果,只是运行了A类的main,而other类的一个只是和A类main同名的函数并没有调用。 第二个尝试,你删掉A类的main函数,然后再点击运行,系统会报错,nosuchmethod“main”。说明jvm没有找到main函数。这就更进一步的说明了,对于一个javaproject只有一个主程序,名字是main(),但同时可以在其它的类中有同名的main函数。至于为什么A类的mian()函数注册成了主程序,你可以继续做测试。想要理解的更透彻,我想应该深入的了解jvm的运行机制以及javamain()的特征和调用原理,甚至会涉及到线程相关的知识。
南极洲的情绪 2013-07-21
  • 打赏
  • 举报
回复
错误: 找不到或无法加载主类 TestVariable 我的一个java项目里建了两个不相关的类 用了两个主函数main,结果就这样了。 跪求大神指点!!
南极洲的情绪 2013-07-21
  • 打赏
  • 举报
回复
错误: 找不到或无法加载主类 TestVariable eclipse 运行时报错,是什么情况?
ZzmNobelist 2013-04-24
  • 打赏
  • 举报
回复
只要不是一个类中有多个主函数都没有问题。 你回想一下你是如何执行java程序的,是“java 类名”这样执行的吧?(使用IDE也类似,虽然你是按了一个按钮,但是IDE帮你执行了这个命令) 因此,所谓java虚拟机会自动寻找主函数只是从当前类中寻找,并不是从几十、上百个类中寻找main。 当虚拟机找到你给定的类当中的main函数后,就按照顺序结构,一条条运行main中的语句,当你的main 中出现调用其他类的方法、变量、实例化其他类的时候,才跳转到其他类中去寻找对应的方法、变量、类。 因此你说的问题,不是问题
  • 打赏
  • 举报
回复
引用 7 楼 Li_894389175 的回复:
在eclipse中运行会报错的 不知道你的是什么运行环境
。个人认为不是这样吧,我在Myeclipse和DOS下都试过是可以的,看看你的代码是不是写错了?
  • 打赏
  • 举报
回复
另外做一点补充,也是最主要的,感觉昨天没说清楚。java是完全面向对象的,所以他的main函数式写在类中的,而c和c++中main函数是写在类外的,这样也就决定了他们只能有一个main函数,否则编译器都不知道哪一个是程序的入口函数了(这放到java中实际上就是一个类中只能有一个static main()函数)。而在java中他的规则前面已经提到过,那就是他会把最先找到的main作为程序的入口。所以一个包中可以有很多main函数。但一个java程序的入口(即主函数)只能有一个!
加载更多回复(7)

58,452

社区成员

发帖
与我相关
我的任务
社区描述
Java Eclipse
社区管理员
  • Eclipse
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧