关于没有main的Hello,World!
最近在java核心技术 基础知识 上看到一个程序说是不用main方法就可以打印出Hello,World!public class Hello
{
staitc
{
System.out.println("Hello,World!");
System.exit(0);
}
}可是自己运行的时候硬是不出来 后来网上查了一下也说可以,说是程序运行时先执行静态块的内容,main方法不是入口么,各种凌乱。。。。。还请个位大牛解释一二,谢谢那 --------------------编程问答-------------------- 没入口是进不去的。。
还有标准的hello,world是这样的,全小写中间用逗号隔开不加感叹号 --------------------编程问答-------------------- staitc写错了。 static
static {
System.out.println("Hello,World!");
System.exit(0);
}
public static void main(String[] args) throws IOException {
}
--------------------编程问答-------------------- 写了static 还是要写main方法的 --------------------编程问答-------------------- 可以不需要main方法。
本身其实是借助 JVM 在装载类定义时,就会先执行static块这个特性,来得到输出的。
但是JVM在完成类定义装载后,就会用反射来查找main函数,此时如果找不到就会报错,但此时static块已经执行完毕了。
但这个程序又利用System.exit(0);来强制结束程序,所以JVM也就不会再去查找main函数并执行了。
各位可以这样试试:
public class Hello{
static {
System.out.println("Hello,World!");
}
}
能看到很有意思的结果。 --------------------编程问答-------------------- 静态标识符: static
拼写错误。 --------------------编程问答-------------------- 试了一下,可是虽然没有报错。但得不到输出啊 --------------------编程问答--------------------
public class Hello{
static {
System.out.println("Hello,World!");
}
}
C:\>java Hello
HelloWorld
Exception in thread "main" java.lang.NoSuchMethodError: main --------------------编程问答-------------------- 除非你这个类被别的类调用,否则如果不写自己的main方法是不会打印的 --------------------编程问答-------------------- 1、你要确定这个类有一下几种情况才会被jvm的ClassLoader加载:
a、new这个类的一个实例;
b、访问类的静态变量或者静态方法
c、反射
d、访问该类的子类,即创建子类对象
e、标示该类为启动类
应该有6种的 ,好像b包含了两种 ,以上就是类的主动使用,jvm会加载类,加载类才会初始化 ,才会运行static模块 --------------------编程问答-------------------- 受教了 --------------------编程问答-------------------- --------------------编程问答--------------------
public class HelloWorld {
static {
System.out.println("Hello,World!");
}
}
可以输出:
F:\fzjwork\java>java HelloWorld
Hello,World!
Exception in thread "main" java.lang.NoSuchMethodError: main --------------------编程问答-------------------- 因为在类加载的时候会执行类中的 static 块、方法和初始化 static 的成员变量和内部类,因此 static 块中的代码会执行。但是由于缺少 main 函数,所以在执行完 static 块后会抛个异常出来。 --------------------编程问答--------------------
public class HelloWorld {
static {
System.out.println("Hello,World!");
System.exit(0);
}
}
结果:
F:\fzjwork\java>java HelloWorld
Hello,World!
学会了。。。 --------------------编程问答-------------------- System.out.println(打印方法是异步方法。也就是说执行该方法仅仅发出打印请求,但是并不是立即打印,而是由另外一个线程打印。而你后面立即执行System.exit方法在打印出来之前就退出了。打印线程非常耗费时间,所以等不了那么长时间系统就退出了 --------------------编程问答-------------------- 原来如此 --------------------编程问答-------------------- 试过 还是不行
根本不能java java的时候报错如下
在HelloWorld类中找不到主方法,请讲主方法定义为public static void main(String[] args)
--------------------编程问答--------------------
你真的运行过么?
public class HelloWorld {--------------------编程问答--------------------
static {
System.out.println("Hello,World!");
System.exit(0);
}
}
谁说print是异步方法的 --------------------编程问答--------------------
public class HelloWorld {
static {
System.out.println("Hello,World!");
System.exit(0);
}
}
受教了
没有System.exit(0)的话会抛出异常 --------------------编程问答--------------------
在Eclipse下是不行滴
自己敲CMD才行
--------------------编程问答-------------------- 这个要涉及到底层的JVM的内存管理了 我也不是很懂, --------------------编程问答-------------------- 学习了,喜欢static --------------------编程问答-------------------- 完全是因为static拼写错误 虽然会报错 但是static所包含的静态代码块完全会输出 --------------------编程问答-------------------- 我也试过了,eclipse里不行,必须要自己在cmd里才可以。 --------------------编程问答-------------------- 这是静态代码块的知识,你只要记住,静态代码块用来给类进行初始化,随着类的加载执行,并且只执行一次,也优于主函数执行class StaticCode
{
static
{
System.out.println("Hello,World");
System.exit(1);
}
}
--------------------编程问答-------------------- 我也试过了, 在cmd下编译能通过,且运行。结果显示了hello world. 在eclipse跑不起来。静态块是加载类时最先初始化的。
根据java编程思想
1. 即使没有使用static, 构造器也是静态方法,先被访问,java解释器定位class文件
2. 载入class文件,执行所有静态初始化(也就是上面的static)
--------------------编程问答-------------------- 你的代码没有问题,你可以用jdk运行,静态代码块优先于主方法执行,这是正确的。 --------------------编程问答-------------------- 好牛叉呀。。。受教了。 --------------------编程问答-------------------- 好牛叉呀。。。受教了。 --------------------编程问答-------------------- 好牛叉啊。。。学到了。。 --------------------编程问答-------------------- eclipse中没有main函数是不能运行的 你这段程序可以在命令提示符下运行 --------------------编程问答-------------------- 还真学习到了哇。。 --------------------编程问答-------------------- 我的可以编译成功,但是运行时会出现异常! --------------------编程问答-------------------- 我试了
public class Hello{
static {
System.out.println("123");
System.exit(0);
}
}
完全可以输出。没问题、编译和运行都不会报错。。。我不知道你怎么搞的、 --------------------编程问答-------------------- 这个真可以 --------------------编程问答-------------------- 是不是写main但是main函数里是空的? 为什么我不写main函数怎么都弄不出来呢 求教育啊 --------------------编程问答-------------------- --------------------编程问答-------------------- 我在cmd中运行,但是它的提示是:
错误: 在类 Hello 中找不到主方法, 请将主方法定义为:
public static void main(String[] args)
为什么会这样,请指点指点。
--------------------编程问答-------------------- 静态代码块可以执行!!执行一次!!
下面这种没有main方法也可以执行hello world
import org.junit.Test;
public class NoMain {
@Test
public void noMain()
{
System.out.println("hello,world");
}
} --------------------编程问答-------------------- --------------------编程问答-------------------- 受教了 --------------------编程问答-------------------- 不懂Java.但凡是过程,必定有入口--当然,我这里说的不是main. --------------------编程问答-------------------- 只有这个类被主动使用了,才可以执行静态的代码块
public class HelloWorld {
static {
System.out.println("hello world");
}
public static void main(String[] args) {
new HelloWorld();
}
}
这只是其中的最简单的一种情况为类被创建了一个对象,还有反射之类的,你可以去以下的网站看看,可以做一下实验,都可以达到楼主的效果
http://gaolixu.iteye.com/blog/560436
--------------------编程问答-------------------- 严格的说main是主线程入口 而当你打开某个程度的时候最先启动的是这个进程 --------------------编程问答-------------------- staitc
是优先于main执行的 但是你这样 执行玩包报错因为他找不到 main入口的方法 --------------------编程问答-------------------- 当你java Hello时,会先把这个类加载到内存中,因为你写了static块,所以会执行它,又因为在static块中退出了,所以程序不会抛出异常
当没有System.exit(0);这句时,JVM会找main方法,因为没写main方法,所以抛出异常 --------------------编程问答-------------------- public class Hello{
static {
System.out.println("Hello,World!");
System.exit(0);
}
}
运行之后,说在类中找不到主方法main.郁闷》》》》》》》》》》》》》》》 --------------------编程问答-------------------- 甚至不用写static段,也能打出hello world,
public class HelloWorld {
}
命令行运行:
java HelloWorld | echo Hello World --------------------编程问答--------------------
牛逼 --------------------编程问答--------------------
但是JVM在完成类定义装载后,就会用反射来查找main函数
可以帮我解释解释怎么反射的吗?我在学反射...谢谢大侠。 --------------------编程问答--------------------
命令行运行就ok --------------------编程问答-------------------- 我擦,环境变量搞来搞去,现在eclipse也不能运行了,悲剧...
--------------------编程问答-------------------- 我的也是显示找不到主方法。。。。。肿么办啊 --------------------编程问答-------------------- --------------------编程问答-------------------- 用cmd命令行可以 --------------------编程问答--------------------
正解~ --------------------编程问答--------------------
D:\Temp\TSLOG>javac Hello.java
D:\Temp\TSLOG>java Hello
错误: 在类 Hello 中找不到主方法, 请将主方法定义为:
public static void main(String[] args)
D:\Temp\TSLOG>
测试了,不可以的 --------------------编程问答--------------------
D:\Temp\TSLOG>javac Hello.java
D:\Temp\TSLOG>java Hello
错误: 在类 Hello 中找不到主方法, 请将主方法定义为:
public static void main(String[] args)
D:\Temp\TSLOG>
和楼主的例子一样,找不到main() --------------------编程问答--------------------
我也测试了,就是不行,那两种方法都不行 --------------------编程问答--------------------
E:\JavaProject\Project>javac Hello.java
E:\JavaProject\Project>java Hello
错误: 在类 Hello 中找不到主方法, 请将主方法定义为:
public static void main(String[] args)
E:\JavaProject\Project>
这是我的结果 为什么也不能啊 顺便求指导了 。。。。。 --------------------编程问答--------------------
你确定可以吗 ?我写的都和你一模一样 为啥不行呢 ?? --------------------编程问答-------------------- 还是不可以啊 用不用设置什么东西啊 ??我就是自己敲的cmd啊 ....高手快指导一下吧
--------------------编程问答-------------------- 看看Thinking in JAva
这个内容属于很基本的概念 --------------------编程问答-------------------- 我也测试了是可以的,是不是你重写了类加载器呢 --------------------编程问答-------------------- 这个静态方法的含义是,比构造方法更快被调用,我们一般不都是创建一个类的对象,会自动调用这个类里面的构造方法么?这个静态方法就是比构造方法更早被调用,但是要输出的话,必须从另一个类里面的main方法里面去NEW除这个类,不然一样是不会调用的 --------------------编程问答-------------------- 没有main方法程序找不到入口,另外static写错了。。。。 --------------------编程问答--------------------
受教! --------------------编程问答-------------------- 新手来逛逛,受教了,static --------------------编程问答--------------------
别放在eclipse的工程下试试
这个东西叫静态块 它里边的东西只在类被加载的时候执行一次 然后再也看不到了
这里例子其实程序并没有运行起来 只是在加载类的时候把静态块加进去了
拿static{}括起来是因为类里面只能有方法和成员变量 想在加载类的时候执行的东西只能靠放在静态块里实现 --------------------编程问答--------------------
在哪里 运行的??? --------------------编程问答--------------------
public class Test
{
static {
System.out.println("I will not use the 'Hello World'!");
System.exit(0);
}
}
[img=http://my.csdn.net/my/album/detail/1120441][/img]
我的也不行。。。不会跟jdk有关吧。。 --------------------编程问答--------------------
public class Test--------------------编程问答-------------------- 这是静态初始化语句块,类加载是可以执行的,它是在main之前执行的 --------------------编程问答--------------------
{
static {
System.out.println("I will not use the 'Hello World'!");
System.exit(0);
}
}
+10086 --------------------编程问答--------------------
System.exit(0);这句话是强制终止找寻main方法的命令吗?应该是System类中的一个特性吧! --------------------编程问答-------------------- 还可以这样啊 受教了! --------------------编程问答--------------------
试了一下,JDK1.6可以,JDK1.7就不行。 --------------------编程问答-------------------- 在Eclipse和通过CMD都可以运行。 --------------------编程问答-------------------- 除 --------------------编程问答--------------------
顶一个
--------------------编程问答-------------------- JDK,我这1.6正常,static可以输出! --------------------编程问答--------------------
我也试了,不行,和JDK版本有关? --------------------编程问答-------------------- 我测试过了 用的1.7不可以,但是1.6可以
正确的理解确实是 在程序运行时 先加载static 块 --------------------编程问答-------------------- 呵呵 各种切糕!
--------------------编程问答-------------------- 虽然说类在加载时会先执行全局代码区和静态代码区,但这个类不会被JVM主动加载的。除非你在别的类中实例化这个类. --------------------编程问答-------------------- Applet是不是也可以的
import java.applet.Applet;--------------------编程问答-------------------- 楼主该结贴了 --------------------编程问答-------------------- 难道没用过JDBC么?JDBC的class.forname用的和这个差不多,这个是静态代码块,JDBC用的是构造代码块,反射一下就行了,还不会报错。
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);
}
}
补充:Java , Java SE