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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 严露华 中级黑马   /  2013-4-17 00:12  /  2331 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在学习中,我们只知道一个类最多只能有一个类,那么看下面的代码,可得,两个类中都有两个函数,且都有main()方法,那么StaticTest类调用Employee时,为什么不会抛出异常?那又为什么不会加载Empolyee类中的main()方法呢?
  1. public class StaticTest {

  2.         public static void main(String[] args) {
  3.                 Employee[] staff = new Employee[3];
  4.                
  5.                 staff[0] = new Employee("zhangsan",4000);
  6.                 staff[1] = new Employee("lishi",6500);
  7.                 staff[2] = new Employee("wangwu",6000);
  8.        
  9.         for(Employee e:staff)
  10.         {
  11.                 e.setId();
  12.                 System.out.println("name="+e.getName()+",id="+e.getId()+",salary="+e.getSalary());
  13.                 int n = Employee.getNextId();
  14.                 System.out.println("Next available id="+n);
  15.                
  16.         }

  17. }
  18. }
  19. class Employee{
  20.         private String name;
  21.         private double salary;
  22.         private int id;
  23.         private static int nextId = 1;
  24.         public Employee(String n,double s){
  25.                 name = n ;
  26.                 salary = s;
  27.                 id = 0;
  28.         }
  29.         public String getName()
  30.         {
  31.                 return name;
  32.         }
  33.         public double getSalary(){
  34.                 return salary;
  35.         }
  36.         public int getId(){
  37.                 return id;
  38.         }
  39.         public void setId(){
  40.                 id = nextId;
  41.                 nextId++;
  42.         }
  43.         public static int getNextId()
  44.         {
  45.                 return nextId;
  46.         }
  47.         public static void main(String[] args){
  48.                 Employee e = new Employee("zhaoqi",5000);
  49.                 System.out.println(e.getName()+" "+e.getSalary());
  50.         }
  51. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

4 个回复

倒序浏览
1.张老师说过,main方法其实并不是属于哪一个类的,而只是借用这个类存放而已。
2.每个类都可以存放main方法的,但只能有一个完全相同的main方法。
3.同一个java文件中每一个main方法都可以作为入口。
4.可以在IDE中设置执行的是哪个main方法。
5.其实这样一个java文件中存放多个类的情况,如果不是关系特别紧密的类,还是不推荐的。如果一定要这样做,只能有一个声明为public

自己的一点看法,希望大家也能指出错误~

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
楼主这个代码我拿eclipse测了下,可以运行,但是运行前要选择运行哪个类的main函数。

如果手动用javac去编译,则会抱找不到main方法的错误。

期待高手来解答这个问题了。
回复 使用道具 举报
本帖最后由 Neverbelazy 于 2013-4-18 13:26 编辑

我的一些看法,希望大家参考,指点:

1. 一个文件中只能有一个public类,但是可以有多个非public类 (尝试 把两个类都标记public 看看有编译错误没?)
2中有些问题,需要修改
错误:2.运行时JVM应该是只能看到public的那个类StaticTest,以StaticTest类内的main函数作为主线程运行 )
2.1 (修改)JVM识别的时候是识别和“文件名”一样的那个“类”,如果你的文件名是StaticTest 那么就运行StaticTest类内的main函数作为主线程(尝试去掉public, 并把StaticTest类改成StaticTest1,看看会出编译错误
2.2. (补充)如果一个.java文件中有public类,那么这个public类必须和文件名一样;(尝试去掉 StaticTest的public 在把Employee变成public类,看看会出编译错误吗?
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
3.另外的一个类Employee中的main函数没有被调用,
4.如果要调用Employee中的main函数,也可以,注意是静态的就可以了(尝试在StaticTest的主函数中调用Employee.main(自定义一个String[]), 看看可不可以实现);

毕老师的基础视频里面说过这些问题,好像是分散在几节里面的,具体哪几个我忘了。

评分

参与人数 1技术分 +2 收起 理由
陈丽莉 + 2 浅绿色不怎么容易看呢~

查看全部评分

回复 使用道具 举报
For Q2:IDE环境中会让你选择调用其中一个main方法,当你调用StaticTest的方法时,便不会调用Employee中的main方法了。因为main方法作为程序的入口,通常只有一个,如果希望调用多个,可以手动调用别一个,但另一个已经不是程序的入口了,所以不会产生冲突。
For Q1:当StaticTest中调用到Employee时,会自动加载该类并调用需要的资源,(Employee中的main 方法会被加载,但加载和调用是两码事),所以不会抛出异常。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马