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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 封明川 中级黑马   /  2012-7-11 22:30  /  2351 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 封明川 于 2012-7-12 13:38 编辑

public class StaticTest {
    static
    {
        System.out.println("静态代码块!");
        System.exit(0);
    }
    public static void main(String[] args)
    {
        System.out.println("主函数!");
    }
}

在这段代码中,先执行静态代码块,用Eclipse做断点测试的时候,根本就不会用到main函数,为什么我把main函数注释掉了之后就不能运行了呢,在Java核心技术上有写到不用写main函数也能执行的啊,就是会报一个错误,我的为什么就不行呢?

8 个回复

倒序浏览
本帖最后由 黑马高明辉 于 2012-7-11 22:44 编辑

一个类的静态代码块是在这个类被实例话的时候首先执行的,是类相关的。你把StaticTest的main注释掉了,当人不能运行出结果了,但是你可以在另一个类的main函数里实例化一个StaticTest类对象,就能得到静态代码块的执行结果。
顺便说一句,你这个类的main函数也执行不了啊,因为这个System.exit(0);
在给你个补充:
package testSomething;
class Test {
    static
    {
        System.out.println("静态代码块!");
        
    }
    public Test(){
     System.out.println("来自构造函数的输出。");
    }
   
}
public class StaticTest{
  public static void main(String[] args) {
  
   Test t = new Test();
   System.out.println("new a test");
}
}
运行结果是:
静态代码块!
来自构造函数的输出。
new a test
这就说明了静态代码块的执行是先于构造函数的。

评分

参与人数 1技术分 +1 收起 理由
刘笑 + 1 赞一个!

查看全部评分

回复 使用道具 举报
静态代码块随着类的加载而执行,而且只执行一次。
这里你把main函数注释掉以后,就没有任何函数调用StaticTest类,
没有类的加载,静态代码块当然也就无法执行。
回复 使用道具 举报
不可能吧,没有主函数是不不肯能运行的,因为主函数是程序的入口点,就像人吃东西,都要找入口点,将东西塞入口中(生活中其他情况除外,我知道有的病人是从鼻子中入食的等等)
回复 使用道具 举报
静态代码块不用实例话也能执行的,我只是很疑惑我和书上的不一样,书上说没有main函数也能有结果出现。
比如这段代码会先出现“静态代码块”,然后报错。不知道你们测试一下是什么样的情况?
回复 使用道具 举报
静态代码块
特点:随着类的加载而执行,只执行一次,并优先于主函数执行
作用:用于给类进行初始化
所以结果会是:先是静态代码块,然后是主函数
而主函数:是一个特殊的函数,作为程序的入口,可以被jvm调用,所以必须存在



评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
main函数是一个程序的入口,就像是你想从外面进入一间屋子,你把门封死了,你还怎么进去,
回复 使用道具 举报

main函数是程序执行的入口; 第一种情况,加载类的时候就会执行static代码块;
那么它就会调用system.exit(0);退出虚拟机不再执行system.out.println("主函数!")方法;
当你去掉main函数的时候不,程序没有执行的入口则不能执行;
Java核心技术思想的意思可能是在别的main函数中加载StaticTest这个类进来;
那么他就会执行static{}中的静态代码块;
回复 使用道具 举报
静态代码块是类的初始化动作,类一加载他就执行了,而构造代码块是构造实例时的初始化,对象不创建是不执行的。

静态代码块的特点:随着类的加载而执行,只执行一次,并优先于主函数执行。用于给类进行初始化的。

区别:
1.静态代码(被static修饰,没有其他的名字)块给类初始化;
如:
static
{
         System.out.pringln(“hello”);
}
2.构造代码块给对象初始化,对象一建立就运行,而且优先于构造函数执行。
代码块定义的是一段对象所共有的特性的初始化java代码,而且不论这段代码定义在类中的什么地方
(作为一段独立块,不能嵌套在别的方法(函数)中),都首先执行这段代码。
比如人都有共同的相貌特征,那么在定义人的时候就可以将这些共同特性定义在代码块中。

说到哪个先运行的问题,在静态代码块的特点中,有“优先于主函数执行”这一句,而且构造代码块是给对象初始化的,
先new一个对象之后才有对对象的初始化,所以,综述,静态代码块先执行。
类里面的方法运行次序是:静态代码块,静态函数,代码块,构造函数。
其实你可以去试:
public class test
{
         public static void main(String[] args)
         {
                 ManthTest.test1();
                 ManthTest MT=new ManthTest();
                 
        }
}
class ManthTest{
         ManthTest(){
                 System.out.println("构造函数");
         }
         {
                 System.out.println("代码块");
         }
         static{
                 System.out.println("静态代码块");
         }
         public static void test1(){
                 System.out.println("静态函数");
         }
}

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

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