public class Test
{ public static void main(String args[])
{ Test t=new Test();
System.out.println(t instanceof Test);
System.out.println("测试一下");
}}
class Temp extends Test
{}
//请问一下我把这个Test.java文件编译好了之后.生成了Test.class,Temp.class
//两个文件我用javac Test,输出"true,测试一下"属于正常.但是我又用javac Temp
//也输出了同样的结果.为什么呢.难道public static void main(String args[])
//被Temp继承了吗?

解决方案 »

  1.   

    为什么不呢?Java虚拟机把字节码载入后,main方法只不过是特殊的默认执行的入口而已,也就是说你能够通过java Test这样的命令行直接调用main方法而不需要特别指出。main仅仅需要public static void这三个修饰词,当然不排除final,这样虚拟机就能自动找到合法的main。你的Temp继承了Test,自然也有合法的main,当然可以执行了。总之,main方法和类的其他方法没有什么区别,只不过虚拟机默认main为代码执行入口而已。
      

  2.   

    楼上说法有误,您说:"总之,main方法和类的其他方法没有什么区别,只不过虚拟机默认main为代码执行入口而已。"
    但是如果在Test类中有一个qq()函数和一个入口main函数的话
    那么在qq()中可以执行this.变量名,而在main()中却不可以执行this.变量名,
      

  3.   

    如:
    public class Test()
    {
       int num=100;
       qq()
       {
         this.num=300;//可以用this访问变量;
       }
       public static void main(String args[])
      { 
         this.num=400;//不可以用this访问变量;
      }
    }
      

  4.   

    当然可以 main方法 也是 方法呀
    遇到这种继承的问题 楼主只有记住:子类继承父类的所有方法 除了构造方法
      

  5.   

    main方法 也是 方法啊~
      

  6.   

    tianjuan() ( )
    楼上说法有误,您说:"总之,main方法和类的其他方法没有什么区别,只不过虚拟机默认main为代码执行入口而已。"
    但是如果在Test类中有一个qq()函数和一个入口main函数的话
    那么在qq()中可以执行this.变量名,而在main()中却不可以执行this.变量名,
    如:
    public class Test()
    {
       int num=100;
       qq()
       {
         this.num=300;//可以用this访问变量;
       }
       public static void main(String args[])
      { 
         this.num=400;//不可以用this访问变量;
      }
    }
    -----------------------------------------------------因为main 是static的阿~静态方法只能调用静态的方法和变量。
    与本案无关~
      

  7.   

    tianjuan,lower0661回答了你的问题,你的例子中忽略了main()是static的事实,main()是类函数而不是实例函数,所以不能访问num了。如果你把qq()也加上static修饰词,同样无法访问num。如果你改写classloader,你还可以自定义类的新的入口,比如以qq()为入口也是可以的。还是那句话,main()并没有特别的地方。
      

  8.   

    说说我的看法,main方法和别的方法除了在入口的特性上没有别的区别
    而且,由它的修饰符可以知道,它是个类的静态方法
    调用可以按照正常的调用方式调用
      

  9.   

    主要是public方法都能被子类继承
      

  10.   

    更正一下楼主的思路Temp类继承了 Test类,main方法是test类里的方法,子类可以调用父类里的方法
    其他的和楼上的差不多了,main方法只是一个特殊的入口而已,和别的方法没有什么区别
      

  11.   

    我个人认为。这就是JAVA多态的表现。
      

  12.   

    lower0661(我的黑夜风吹不走) 正解。
      

  13.   

    skywoodsky() ( )  
       
    lz确定你的程序能跑?
    没有说找不到入口?
    -------------------------------------------------------
    我同意这位的观点。
    我无法运行楼主的那个程序~~~  
     
      

  14.   

    楼主是在命令行下运行的吧。
    如果在elipse中,在同一个文件下写两个类,点击运行,就会出现一个对话框,不能顺利运行
      

  15.   

    楼主
    首先肯定 含有main()的类可以被继承但是 你的程序虽然在DOs下运行成功
    但那并不是继承因为java虚拟机会根据你的程序寻找到main()
    所以运行成功了具体的我讲不太明白
    但是我在一本书中看到过你个问题
    虽然可以被继承 但是这个例子并不是继承的体现
      

  16.   

    public static void main(String []args)
      

  17.   

    public class TestClassA { /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    System.out.println("hello");
    }}
    import java.lang.reflect.Method;
    public class TestClassB extends TestClassA{ /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub

    Method[] methods=TestClassB.class.getMethods();
    for(int i=0;i<methods.length;i++)
    {
    System.out.println(methods[i]);
    }
    }}
    看结果好像TestClassB里面没有TestClassA的main方法.关注
      

  18.   

    那是当然.main方法如果太多,可以作为一般的静态方法.
      

  19.   

    从某种意义上说,凡是涉及到静态的东西,都与继承无关。之所以可以从通过子类访问到父类的静态成员,是由于JAVA的名称机制造成的:即当前上下文中引用的名字如果在当前作用域找不到,则会去上级作用域寻找,子类找不到则去父类寻找。这种现象严格来说不能算是继承,而应该是一种名称搜索机制。
      

  20.   

    又不是private的凭什么不能继承?
      

  21.   

    首先,楼主的程序可以正常运行,上面没有运行成功的欧也不晓得是什么原因
    其次,static方法是可以继承的,换句话说,一个方法能否被子类继承根本与static无关。static方法只是不能被覆盖。至于jobs002(Oh! Office) 发的代码说明的问题,我目前没有搞清楚,因为Class类的getMethods()方法的源代码写得很简单,源代码后来调用 s.checkMemberAccess(this, Member.PUBLIC)我就不懂了~不知道是否与此有关。但值得一提的是,你在TestClassB中已经重新定义了mainI()方法,如果两个main可以存在于同一个类中,那jvm怎么知道该从哪个main进入呢?所以我才jvm可能有某种机制保证main方法的唯一性。或者干脆像变量一样,类似于被“屏蔽”了(因为static方法不能被覆盖阿~)。这部分有待学习~~~
      

  22.   

    同意Dan1980() 的这种说法,个人也觉得,其实被修饰了static就已经脱离了继承的范畴了。但说成“继承”又无可厚非!毕竟如果没有extends那肯定直接寻找是找不到的继续学习~
      

  23.   

    我执行了jobs002的代码,最后结果如下:public static void TestClassB.main(java.lang.String[])
    public native int java.lang.Object.hashCode()
    public final native java.lang.Class java.lang.Object.getClass()
    public final void java.lang.Object.wait() throws java.lang.InterruptedException
    public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
    public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
    public boolean java.lang.Object.equals(java.lang.Object)
    public final native void java.lang.Object.notify()
    public final native void java.lang.Object.notifyAll()
    public java.lang.String java.lang.Object.toString()第一个就是main()方法,怎么会没有呢?我还是认为main()没有任何特殊的地方。
      

  24.   

    抱歉,我上面的答复有错误,第一行是TestClassB.main,而不是TestClassA.main,jobs002的怀疑是有道理的。
      

  25.   

    google了一下,得到这个结论:static方法是可以被继承的,但是不可被用于多态。static可以被继承的理由是通过试验得到的,比如楼主tianjuan的程序,只要在命令行跑一下就可以得知Temp的确有main()函数,而且是被Java虚拟机自动找到的。jobs002的程序也证明了这点,TestClassB的方法列表中仅仅有自己的main()方法,这跟重载一个普通函数(比如TestClassA和TestClassB都有public a()方法)或者重载一个static函数(比如TestClassA和TestClassB都有static public b()方法)的结论是一样的,子类的确继承了父类的方法或者“重载”了父类的方法。上面“重载”用了引号,因为这样的“重载”是毫无意义的,也就是说被继承的static方法不能用于多态。这是因为static方法是通过类调用而不是实例调用的,一般都是通过TestClassA.main(null)来调用static方法。当然,如果通过实例调用,结果也是一样的。假如有A和B两个类,其中B继承A并且都定义了static方法x(),则下面的代码:A a = new B();
    a.x();实际上调用的是A.x(),因为static是类的方法,所以只考虑编译时类型信息而不是运行时类型信息。换言之,这种写法其实不太好,最好直接用A.x()调用,这样更容易阅读而不容易被误解。综上所述,static方法是跟类相关而不是实例,可以被继承,子类可以“重载”static方法,但是由于只考虑编译时信息而不是运行时信息,所以不能够被用于多态。
      

  26.   

    不好意思
    import java.lang.reflect.Method;
    public class TestClassB extends TestClassA{/**
     * @param args
     */}
    其他的代码不变,大家可以看看有什么结果,大家可以讨论一下原因,继续关注.
    注:只运行TestClassB.
      

  27.   

    class Test
    {public static void main(String args[])
    {Test t=new Test();
    System.out.println(t instanceof Test);
    System.out.println("测试一下");
    }}
    public class Temp extends Test
    {}
    修改成这样就可以正确运行