A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 寇龙飞 于 2012-7-28 13:47 编辑
  1. class MainDemo
  2. {
  3.         public static void main(String[] args)//new String[]
  4.         {
  5.                 String[] arr = {"hah","hhe","heihei","xixi","hiahia"};

  6.                 MainTest.main(arr);
  7.         }
  8. }

  9. class MainTest
  10. {
  11.         public static void main(String[] args)
  12.         {
  13.                 for(int x=0; x<args.length; x++)
  14.                         System.out.println(args[x]);
  15.         }
  16. }
复制代码
  1. javac MainDemo.java
  2. java MainDemo
复制代码
能运行。如题,为什么可编译通过?

12 个回复

倒序浏览
这虽然是放在一个文件里 但是 是两个类 啊 , 两个含有main 的类 都可以独立运行的
回复 使用道具 举报
首先我觉得这是同一个.java文件没错,写了两个类,且都有主函数Main,
但当你javac MainTest的时候,其实就是在告诉虚拟机,你现在要编译的是MainTest类,
如果通过编译,这时会产生一个.class文件
而主函数是随着类的加载而开始存在的,这时候会分给它存储空间。

但当你javac MainDemo的时候,其实就是在告诉虚拟机,你现在要编译的是MainDemot类,
如果通过编译,这时也会产生另一个与之对应的.class文件
而主函数是随着类的加载而开始存在的,这时候会分给它存储空间。

注意,他俩分别编译时产生了两个java源文件(当然,他俩也不可能同时被编),你觉得,两个main函数会是在同一片存储区吗?
所以当你javac MainDemo的时候当然可编译。
同理:当你javac MainTest的时候也同样可编译。

只不过把两个类写在了同一个.java文件里,又不是同一个.java文件。不要搞迷糊了,希望我的分析对你有帮助呀。

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
苑占丽 发表于 2012-7-19 20:13
首先我觉得这是同一个.java文件没错,写了两个类,且都有主函数Main,
但当你javac MainTest的时候,其实就 ...

  MainTest.main(arr);
解释下这句话,谢了。
回复 使用道具 举报
张_涛 发表于 2012-7-19 20:19
MainTest.main(arr);
解释下这句话,谢了。

MainTest是一个类,Main函数为静态的,可以用类名.main(arr)的方式直接调用静态主函数,同时传进来一个数组类型的参数。
回复 使用道具 举报
这是两个不同的类,每个类中都有main方法,都能够独立运行,编译哪个,只要该类中没有语法错误,就能编译通过。
回复 使用道具 举报
苑占丽 发表于 2012-7-19 20:13
首先我觉得这是同一个.java文件没错,写了两个类,且都有主函数Main,
但当你javac MainTest的时候,其实就 ...

下午看视频时确实迷糊了。谢谢!:)

首先我觉得这是同一个.java文件没错,写了两个类,且都有主函数Main,
但当你javac MainTest的时候,其实就是在告诉虚拟机,你现在要编译的是MainTest类,
如果通过编译,这时会产生一个.class文件
而主函数是随着类的加载而开始存在的,这时候会分给它存储空间。
意见一致

但当你javac MainDemo的时候,其实就是在告诉虚拟机,你现在要编译的是MainDemot类,
如果通过编译,这时也会产生另一个与之对应的.class文件
而主函数是随着类的加载而开始存在的,这时候会分给它存储空间。
意见一致

注意,他俩分别编译时产生了两个java源文件(当然,他俩也不可能同时被编译),你觉得,两个main函数会是在同一片存储区吗?
意见不一致javac MainDemo.java时同时生成了MainDemo.class与TestDemo.class,被编译了。(先编译MainDemo,再编译TestDemo,下来先_生成TestDemo.class,再生成MainDemo.class,有共同时间区间)估计这是楼上涛涛发问的原因。
2个main函数是不同的类的方法,存储区域在同一片无所谓。被同时编译,所以是在同一片存储区域,MainTest.main的存储区域更小一些,从属于MainDemo.main的存储区域。

不知道我想得对不?大家一起探讨,跟大家学习。
回复 使用道具 举报
杨康 发表于 2012-7-19 21:05
这是两个不同的类,每个类中都有main方法,都能够独立运行,编译哪个,只要该类中没有语法错误,就能编译通 ...

类中没有语法错误就能编译通过(我去验证了)

类中有main方法就能独立运行(我去验证了)


感谢!今天终于对编译、运行不那么迷糊了。
回复 使用道具 举报
丁二跃 发表于 2012-7-19 20:12
这虽然是放在一个文件里 但是 是两个类 啊 , 两个含有main 的类 都可以独立运行的 ...

嗯。当时我就觉得咋一个.java文件里有2个main方法啊,这运行时调用哪一个啊?????

感谢你!

原来Java就是把所有方法封装到类中(2个main属于2个不同的类),编译时生成对应类名的class文件,运行class时调用main函数(一个类中最多一个,这就好办了)

我这么理解对吧?
回复 使用道具 举报
张_涛 黑马帝 2012-7-20 06:15:26
10#
本帖最后由 张_涛 于 2012-7-20 06:33 编辑
寇龙飞 发表于 2012-7-20 02:06
下午看视频时确实迷糊了。谢谢!

首先我觉得这是同一个.java文件没错,写了两个类,且都有主函数Main ...

你编译的是一个文件,因此javac会对每个类生成字节码。如果你删掉编译好的第二个class文件,再运行第一个,能通过么?
第一个明显的调用的第二个,所以有关系的。
你再将第二个class文件导入到当前目录,再运行,又通过了。
或者将的个class文件放入到class放到rt.jar文件当中,也可以运行通过。
而对于苑占丽的部分解答是不同意滴,所以再反问她。
你编译了一个文件,生成了两个class文件,而在运行第一个的时候会使用到第二个
因此,虚拟机会先在当前目录寻找对应的class文件,找不到,再去classpath路径下去寻找,如果还找不到,报错。
总之,编译跟运行是分开来的。编译是针对类的,每个类都没有错,就成功编译。并且有几个类生成几个字节码文件,即class文件
嘿嘿

LL[}RZV9AWF0T}5LPJ[Q9GK.jpg (59.85 KB, 下载次数: 12)

LL[}RZV9AWF0T}5LPJ[Q9GK.jpg

评分

参与人数 1技术分 +1 收起 理由
黑马张扬 + 1

查看全部评分

回复 使用道具 举报
张_涛 发表于 2012-7-20 06:15
你编译的是一个文件,因此javac会对每个类生成字节码。如果你删掉编译好的第二个class文件,再运行第一个 ...

嗯,  MainTest.main(arr);这一行代码,你反问我的时候,我没意识到是楼主代码里的MainDemo类里的一行,就是这个调用,让两个类产生了联系。我一开始忽略了这句话,所以会认为是两个没有关系的类。我的疏忽,不过,又学到点东西,看来以后还要再认真点呀。谢谢张同学。
回复 使用道具 举报
寇龙飞 发表于 2012-7-20 02:06
下午看视频时确实迷糊了。谢谢!

首先我觉得这是同一个.java文件没错,写了两个类,且都有主函数Main ...

嗯,他指证的对。。。。。
回复 使用道具 举报
张_涛 发表于 2012-7-20 06:15
你编译的是一个文件,因此javac会对每个类生成字节码。如果你删掉编译好的第二个class文件,再运行第一个 ...

嗯。你说得对。jar.rar都出来了,我有不懂,你欺负我!:L

涛涛,你跟我的看法分歧在哪?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马