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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 田向向 高级黑马   /  2012-7-5 16:45  /  2305 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 田向向 于 2012-7-5 17:59 编辑

刚才看比老师的视频,越想越不明白

class StaticCodeDemo {
      public static void main(String[] args)
     {
  
            StaticCode s=new StaticCode();
     }
}
class StaticCode{
     static
    {
          System.out.println("a");
    }
    public static void show()
   {
  
         System.out.println("show run");
  
    }
}
主函数调用StaticCode时,必然先加载StaticCode这个类,那为什么打印的时候只打印a呢,而show run非得在主函数中通过调用StaticCode.show();才能运行呢?越想越不明白,谁能帮我解释解释。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 静态代码块,常考的问题,赞一个!.

查看全部评分

6 个回复

倒序浏览
呃,new StaticCode()的时候加载了StaticCode类,然后执行一次静态代码块,也就是打印a,而要打印show run就得要用StaticCode的对象来调用,也就是引用s来调用,如果你想在new StaticCode()的时候即打印a又打印show run,那就只能使用构造函数了,比如这样写吧
class StaticCodeDemo {
      public static void main(String[] args)
     {  
            StaticCode s=new StaticCode();
     }
}
class StaticCode{
    static
    {
          System.out.println("a");
    }
    StaticCode()
    {  
         System.out.println("show run");  
    }
}

点评

谢谢哈  发表于 2012-7-5 17:58

评分

参与人数 1黑马币 +1 收起 理由
田向向 + 1

查看全部评分

回复 使用道具 举报
现在我是电脑 ,我帮你运行一下这个程序,希望对你有帮助。
class StaticCodeDemo {
       public static void main(String[] args)   //第一步:先找到main函数,开始执行
      {
   
             StaticCode s=new StaticCode();//第二步:到了这里,new一个新对象  s,是StaticCode 类型的。要new对象,先要找到StaticCode方法。
      }
}
class StaticCode{ //第三步:程序到了这里,要加载这个类
      static                   //第四步:看到了静态代码块。因为静态代码块只要一经类加载就加载了,并且只加载一次,它是专门给类进行初始化用的;
     {
           System.out.println("a");//第五步:打印a。这个时候这个程序就执行完了。main函数中也没有其他语句了,所以程序就倒这里结束了。
     }         

至于你问的为什么要打印 show run 需要再调用show方法的问题呢? 因为静态代码块 只有static {。。。。} 这个。只有一层大括号。
要想运行下面的方法,就必须再有其他语句来调用它,否则它是不会自己执行的。
     public static void show()
    {
   
          System.out.println("show run");
   
     }
}

点评

谢谢帮助,  发表于 2012-7-5 17:57

评分

参与人数 2技术分 +1 黑马币 +1 收起 理由
田向向 + 1
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
这个是静态代码块和成员函数的区别
静态代码块用来给类进行初始化,随着类的加载而执行。它跟建立对象与否是无关的。
而成员函数只有在对象调用它之后才会执行。
lass StaticCodeDemo {
      public static void main(String[] args)
     {
            /*
             new StaticCode();这个第一步不是在堆内存中建立实体,而是先加载类。随着类的加载,静态代码块就执行,输出a。
             StaticCode s在栈内存中开辟内存空间,这个空间是类类型的变量s。它存储堆内存中的实体的地址值。
           */
            StaticCode s=new StaticCode();
            s.show();//s对象调用位于方法区中的成员函数,此时show运行,输出show run
     }
}
class StaticCode
{
/*
静态代码块,随着类的加载而执行
*/
     static
    {
          System.out.println("a");
    }
/*
成员函数,当对象调用时才执行
*/
    public static void show()
   {
  
         System.out.println("show run");
  
    }
}

点评

谢谢  发表于 2012-7-5 17:58
回复 使用道具 举报
本帖最后由 余清兰 于 2012-7-5 17:23 编辑

这就设计到静态代码块和静态函数的区别了:静态代码块优先于主函数,类一加载进内存就执行了,且只执行一次。
虽然静态方法也是随着类的加载而加载,随着类的消失页消失,但是需要被调用后才能执行,就像普通方法一样,要被对象调用才能执行。
你这里不需要创建对象StaticCode s=new StaticCode();
可以直接用类名.静态方法名();调用,因为静态方法是跟着类走的,所以也称为类方法
静态代码块:
格式:
Static
{
        静态代码块中的执行语句
}
特点:随着类的加载而执行,且只执行一次。
用于给类进行初始化的。并优先于主函数,只有用到类中的内容时,类才会被加载

点评

谢谢  发表于 2012-7-5 17:58

评分

参与人数 1黑马币 +1 收起 理由
田向向 + 1

查看全部评分

回复 使用道具 举报
这里涉及到两个问题:1、静态修饰符static ;   2、构造代码块;
1、在类中 static所修饰的成员变量或者方法是存储在数据内存在,为类中所有对象所共享,他是随着类的存在而存在,只要StaticCode这各类在内存中一加载    语句             System.out.println("a");也就随之加载;
2、构造代码块中的过程为该类所有的对象都具有的共同行为,它负责给所有的对象统一初始化,对象一旦建立,构造代码块就会执行,而且是优先于构造函数执行

举个现实生活中的例子给你 话说我用汉语定义一个类如下:

类 英语专业学生
{
           姓名;
       学好;
        .
            .
            .
  static
     {
       上英语课();
     }
   void   回答老师问题();
      {
         回答过程;   
      }
         .
         .
         .
}
    可以看到 在静态构造代码块中  我们有一个上英语课的方法  只要你有一个英语专业的学生(对象)  他就会去上英语课这就执行了静态代码块中的内容;  而此类中的回答老师的问题  就必须老师允许你才能回答(调用)  


这个和你那个道理是一样的
回复 使用道具 举报
小学没上好 打错字了

学好  ---------    学号    囧{:soso_e126:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马