我原来对JAVA中main函数的理解仅限于"程序执行的入口",但是拜读了<<JAVA编程思想>>后对main函数的理解发生了疑惑1.程序中的每个类都可以有一个main函数,但是程序执行的时候只执行最先出现的main类.
例如:
class Father {

public void showFather() {

System.out.println( "I'm father." ) ;
}

public static void main( String args[] ) {

Father F = new Father() ;
F.showFather() ;

}
}class Son {

public void showSon() {

System.out.println( "I'm son." ) ;
}

public static void main( String args[] ) {

Son S = new Son() ;
S.showSon() ;
}
}
程序执行的结果是:"I'm father.",显然没有执行Son类的主函数,难道编译器认为第一次出现的main函数为程序的入口......
但像Java这样模块化的语言不应该使用如此的落后的形势吧.2.既然每个类都可以有一个main函数,那为什么我又不可以通过"类名.函数名"的方式在类的其他方法中显示的调用main函数呢?
例如:
class Father{

public void showFather() {

Father.main(args) ;

System.out.println( "I'm father." ) ;
}

public static void main( String args[] ) {

Father F = new Father() ;
F.showFather() ;

}
}class Son {

public void showSon() { Son.main(args) ;

System.out.println( "I'm son." ) ;
}

public static void main( String args[] ) {

Son S = new Son() ;
S.showSon() ;  
}
}
编译器报错:"找不到符号",问题似乎就出在Father.main(args)和Son.main(args)这两句上.
但是如果我把这Son.main(args)这句语言放到Son类的main函数中就可以了..
class Father{

public void showFather() {

System.out.println( "I'm father." ) ;
}

public static void main( String args[] ) {

Father F = new Father() ;
F.showFather() ;
}
}class Son {

public void showSon() {


System.out.println( "I'm son." ) ;
}

public static void main( String args[] ) {

Son S = new Son() ;
S.showSon() ;
Son.main(args) ;  
}
}
程序执行结果:"I'm father.",虽然我在Son类的main函数中以"类名.函数名"的方式调用了Son类的main函数,但是似乎还以哪main出现顺序执行的,并没有输出"I'm son.".3.如果一个类中包含main函数,那个当这个类被实例化之后为什么不执行main函数中的指令.(这是我朋友的问题,我个人认为实例化类并不执行他的main函数,而只执行他的构造函数,程序只有在开始的时候才开始寻找第一次出现的main函数,并执行之,不知道我的想法对不对.)4.为什么每一个编译文件只能有一个public类,而该类的main函数又不一定是程序执行的入口(当其他类也包含main函数的时候),那么这个唯一的public类又有什么实际的意义呢?5.<<Java编程思想>>中说最好给每个类都创建一个main函数,因为这样有利于程序的调试,请问这是为什么?由于本人初学Java所以所提问题难免肤浅,望指教.

解决方案 »

  1.   

    好幼稚的问题main本来就是程序的入口函数,但是和其他函数没有什么区别,不过是他可以作为入口,别的函数不可以.
      

  2.   

    5 的意思是说在给类做单独测试的时候可以通过main方法直接执行一些东西来测试
    有空可以了解一下junit
      

  3.   

    来慢慢回答1、因为你的两个class都没有定义修饰符,个人认为javac在编译的时候顺序编译并且默认第一个class为public的,因此,在执行的时候,只执行public的main();
    2、你的程序中是可以调用main函数的,只是你看看你的代码写对了吗?
    public void showFather() {Father.main(args) ;System.out.println( "I'm father." ) ;
    }
    这个showFather方法中调用main没错,但你的args哪里来的?方法中并没有声明这个变量啊
    Son中调用同理3、你的理解是对的,实例化是调用构造函数,并不执行main函数4、应该和1差不多5、每个类中都有很多独立的方法,写上一个main函数就可以调试你写的这些方法了
      

  4.   

    写类连修饰符都不写??你自己可以做试验啊!你把第一个类加上public,第二个类也加上public就报错,第一个不加public,第二个加public就执行第二个,两个都不加就执行第一个了!args变量都没声明,就用了??