最近在java核心技术 基础知识 上看到一个程序说是不用main方法就可以打印出Hello,World!
public class Hello

   staitc
    {
      System.out.println("Hello,World!");
      System.exit(0);
    } }可是自己运行的时候硬是不出来 后来网上查了一下也说可以,说是程序运行时先执行静态块的内容,main方法不是入口么,各种凌乱。。还请个位大牛解释一二,谢谢那

解决方案 »

  1.   

    没入口是进不去的。。
    还有标准的hello,world是这样的,全小写中间用逗号隔开不加感叹号
      

  2.   

    staitc写错了。 static
    static {
    System.out.println("Hello,World!");
    System.exit(0);
    } public static void main(String[] args) throws IOException {
    }
      

  3.   

    写了static 还是要写main方法的
      

  4.   

    可以不需要main方法。本身其实是借助 JVM 在装载类定义时,就会先执行static块这个特性,来得到输出的。但是JVM在完成类定义装载后,就会用反射来查找main函数,此时如果找不到就会报错,但此时static块已经执行完毕了。但这个程序又利用System.exit(0);来强制结束程序,所以JVM也就不会再去查找main函数并执行了。
    各位可以这样试试:
    public class Hello{
      static {
        System.out.println("Hello,World!");
      }
    }
    能看到很有意思的结果。
      

  5.   

    静态标识符: static
    拼写错误。
      

  6.   

    public class Hello{
      static {
        System.out.println("Hello,World!");
      }
    }
    C:\>java Hello
    HelloWorld
    Exception in thread "main" java.lang.NoSuchMethodError: main
      

  7.   

     除非你这个类被别的类调用,否则如果不写自己的main方法是不会打印的
      

  8.   

    1、你要确定这个类有一下几种情况才会被jvm的ClassLoader加载:
       a、new这个类的一个实例;
       b、访问类的静态变量或者静态方法
       c、反射
       d、访问该类的子类,即创建子类对象
       e、标示该类为启动类应该有6种的 ,好像b包含了两种 ,以上就是类的主动使用,jvm会加载类,加载类才会初始化 ,才会运行static模块
      

  9.   


    public class HelloWorld {
    static {
    System.out.println("Hello,World!");
    }
    }可以输出:
    F:\fzjwork\java>java HelloWorld
    Hello,World!
    Exception in thread "main" java.lang.NoSuchMethodError: main
      

  10.   

    因为在类加载的时候会执行类中的 static 块、方法和初始化 static 的成员变量和内部类,因此 static 块中的代码会执行。但是由于缺少 main 函数,所以在执行完 static 块后会抛个异常出来。
      

  11.   


    public class HelloWorld {
    static {
    System.out.println("Hello,World!");
    System.exit(0);
    }
    }结果:
    F:\fzjwork\java>java HelloWorld
    Hello,World!
    学会了
      

  12.   

    System.out.println(打印方法是异步方法。也就是说执行该方法仅仅发出打印请求,但是并不是立即打印,而是由另外一个线程打印。而你后面立即执行System.exit方法在打印出来之前就退出了。打印线程非常耗费时间,所以等不了那么长时间系统就退出了
      

  13.   

    试过 还是不行 
     根本不能java java的时候报错如下
    在HelloWorld类中找不到主方法,请讲主方法定义为public static void main(String[] args)
      

  14.   


    你真的运行过么?
    public class HelloWorld {
        static {
            System.out.println("Hello,World!");
            System.exit(0);
        }
    }
      

  15.   

    public class HelloWorld {
        static {
            System.out.println("Hello,World!");
            System.exit(0);
        }
    }
    受教了 没有System.exit(0)的话会抛出异常
      

  16.   


    在Eclipse下是不行滴
    自己敲CMD才行
      

  17.   

    这个要涉及到底层的JVM的内存管理了 我也不是很懂,
      

  18.   

    完全是因为static拼写错误   虽然会报错 但是static所包含的静态代码块完全会输出
      

  19.   

    我也试过了,eclipse里不行,必须要自己在cmd里才可以。
      

  20.   

    这是静态代码块的知识,你只要记住,静态代码块用来给类进行初始化,随着类的加载执行,并且只执行一次,也优于主函数执行class StaticCode
    {
    static
    {
    System.out.println("Hello,World");
    System.exit(1);
    }
    }
      

  21.   

    我也试过了, 在cmd下编译能通过,且运行。结果显示了hello world. 在eclipse跑不起来。静态块是加载类时最先初始化的。
    根据java编程思想
    1. 即使没有使用static, 构造器也是静态方法,先被访问,java解释器定位class文件
    2. 载入class文件,执行所有静态初始化(也就是上面的static)
      

  22.   

    你的代码没有问题,你可以用jdk运行,静态代码块优先于主方法执行,这是正确的。
      

  23.   

    eclipse中没有main函数是不能运行的  你这段程序可以在命令提示符下运行 
      

  24.   

    我试了public class Hello{
    static {
    System.out.println("123");
    System.exit(0);
    }
    }
    完全可以输出。没问题、编译和运行都不会报错我不知道你怎么搞的、
      

  25.   

    是不是写main但是main函数里是空的? 为什么我不写main函数怎么都弄不出来呢  求教育啊
      

  26.   

    我在cmd中运行,但是它的提示是:
    错误: 在类 Hello 中找不到主方法, 请将主方法定义为:
       public static void main(String[] args)
    为什么会这样,请指点指点。
      

  27.   

    静态代码块可以执行!!执行一次!!下面这种没有main方法也可以执行hello worldimport org.junit.Test;public class NoMain {
       
         @Test
         public void noMain()
         {
          System.out.println("hello,world");
         }
    }
      

  28.   

    不懂Java.但凡是过程,必定有入口--当然,我这里说的不是main.
      

  29.   

    只有这个类被主动使用了,才可以执行静态的代码块public class HelloWorld {
    static {
    System.out.println("hello world");
    }

    public static void main(String[] args) {
    new HelloWorld();
    }
    }这只是其中的最简单的一种情况为类被创建了一个对象,还有反射之类的,你可以去以下的网站看看,可以做一下实验,都可以达到楼主的效果
    http://gaolixu.iteye.com/blog/560436
      

  30.   

    严格的说main是主线程入口 而当你打开某个程度的时候最先启动的是这个进程
      

  31.   

    staitc
      是优先于main执行的  但是你这样 执行玩包报错因为他找不到 main入口的方法
      

  32.   

    当你java Hello时,会先把这个类加载到内存中,因为你写了static块,所以会执行它,又因为在static块中退出了,所以程序不会抛出异常
    当没有System.exit(0);这句时,JVM会找main方法,因为没写main方法,所以抛出异常
      

  33.   

    public class Hello{
      static {
      System.out.println("Hello,World!");
      System.exit(0);
      }
    }
    运行之后,说在类中找不到主方法main.郁闷》》》》》》》》》》》》》》》
      

  34.   

    甚至不用写static段,也能打出hello world,
    public class HelloWorld {
    }
    命令行运行:
    java HelloWorld | echo Hello World
      

  35.   

    但是JVM在完成类定义装载后,就会用反射来查找main函数
    可以帮我解释解释怎么反射的吗?我在学反射...谢谢大侠。
      

  36.   

    我擦,环境变量搞来搞去,现在eclipse也不能运行了,悲剧...
      

  37.   


    D:\Temp\TSLOG>javac Hello.javaD:\Temp\TSLOG>java Hello
    错误: 在类 Hello 中找不到主方法, 请将主方法定义为:
       public static void main(String[] args)D:\Temp\TSLOG>
    测试了,不可以的
      

  38.   

    D:\Temp\TSLOG>javac Hello.javaD:\Temp\TSLOG>java Hello
    错误: 在类 Hello 中找不到主方法, 请将主方法定义为:
       public static void main(String[] args)D:\Temp\TSLOG>
    和楼主的例子一样,找不到main()
      

  39.   


    E:\JavaProject\Project>javac Hello.javaE:\JavaProject\Project>java Hello
    错误: 在类 Hello 中找不到主方法, 请将主方法定义为:
       public static void main(String[] args)E:\JavaProject\Project>
    这是我的结果 为什么也不能啊 顺便求指导了 。。
      

  40.   

    还是不可以啊 用不用设置什么东西啊 ??我就是自己敲的cmd啊 ....高手快指导一下吧 
      

  41.   

    看看Thinking in JAva这个内容属于很基本的概念
      

  42.   

    这个静态方法的含义是,比构造方法更快被调用,我们一般不都是创建一个类的对象,会自动调用这个类里面的构造方法么?这个静态方法就是比构造方法更早被调用,但是要输出的话,必须从另一个类里面的main方法里面去NEW除这个类,不然一样是不会调用的
      

  43.   

    没有main方法程序找不到入口,另外static写错了。
      

  44.   

    别放在eclipse的工程下试试
    这个东西叫静态块 它里边的东西只在类被加载的时候执行一次 然后再也看不到了
    这里例子其实程序并没有运行起来 只是在加载类的时候把静态块加进去了
    拿static{}括起来是因为类里面只能有方法和成员变量 想在加载类的时候执行的东西只能靠放在静态块里实现
      

  45.   

    public class  Test
    {
    static {
    System.out.println("I will not use the 'Hello World'!");
    System.exit(0);
    }
    }
    我的也不行不会跟jdk有关吧。。
      

  46.   

    public class  Test
    {
        static {
            System.out.println("I will not use the 'Hello World'!");
            System.exit(0);
        }
    }
      

  47.   

    这是静态初始化语句块,类加载是可以执行的,它是在main之前执行的
      

  48.   


    System.exit(0);这句话是强制终止找寻main方法的命令吗?应该是System类中的一个特性吧!
      

  49.   

    试了一下,JDK1.6可以,JDK1.7就不行。
      

  50.   

    在Eclipse和通过CMD都可以运行。
      

  51.   

    JDK,我这1.6正常,static可以输出!
      

  52.   

    我也试了,不行,和JDK版本有关?
      

  53.   

    我测试过了 用的1.7不可以,但是1.6可以  正确的理解确实是 在程序运行时 先加载static 块 
      

  54.   

    虽然说类在加载时会先执行全局代码区和静态代码区,但这个类不会被JVM主动加载的。除非你在别的类中实例化这个类.
      

  55.   

    Applet是不是也可以的
    import java.applet.Applet;
    import java.awt.Color;
    import java.awt.Graphics;public class HelloApplet extends Applet {
    public void init() {
          setBackground( Color.black );
       }    public void paint( Graphics g ) {
          g.setColor( Color.green );
          g.drawString("Hello World", 40, 80);
       }
    }
      

  56.   

    难道没用过JDBC么?JDBC的class.forname用的和这个差不多,这个是静态代码块,JDBC用的是构造代码块,反射一下就行了,还不会报错。