首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 一道简单的java基础面试题,做做看? [已结贴,结贴人:redbridge]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 09:42:42 楼主
    请在不用工具运行的情况下写出下面main方法执行的结果?

    public class Test {
    private int ix = 50;
    private Test( int ix){
    System.out.println(ix);
    }

    static {
    System.out.println("test2");
    }

    {
    System.out.println("test3");
    }

    public static void main(String[] args) {
    Test t;
    t = new Test(1);
    Test t2;
    t2 = new Test(2);
    }
    }
    10  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 09:50:501楼 得分:1
    test2
    test3
    1
    test3
    2
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • FL1429
    • 等级:
    发表于:2008-05-10 09:53:292楼 得分:0
    test2
    test3
    1
    2
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 09:56:013楼 得分:1
    test2
    test3
    1
    test3
    2
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yuppy
    • 等级:
    发表于:2008-05-10 10:00:574楼 得分:1
    test2
    test3
    1
    test3
    2
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 10:01:175楼 得分:0
    Java code
    static { System.out.println("test2"); } { System.out.println("test3"); }


    這種寫法有什么意義?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 10:02:226楼 得分:0
    对于里面的
    {
    System.out.println("test3");
    }
    这句很难理解(类里加这种代码有意义吗?),既不为静态方法又不为构造方法。java是如何处理其加载的?请解释一下,谢谢。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yuppy
    • 等级:
    发表于:2008-05-10 10:03:527楼 得分:1
    static代码块在类被条用的时候被执行;
    显式初始化代码在构造函数被调用之前被执行;
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 10:04:598楼 得分:0
    那叫初始化块!
    还静态初始化块!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yuppy
    • 等级:
    发表于:2008-05-10 10:05:349楼 得分:0

    System.out.println("test3"); 

    属于非静态代码块把!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yuppy
    • 等级:
    发表于:2008-05-10 10:07:1710楼 得分:0
    那些内容属于初始化块呢?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 10:18:1311楼 得分:0
    static修饰的代码块,要比构造方法先执行,且只执行一次。{}修饰的就当是一个平常的类语句块。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 10:19:3312楼 得分:0
    7楼的答案解释应该是正确的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 10:21:3413楼 得分:0
    引用 11 楼 zuoguodang 的回复:
    static修饰的代码块,要比构造方法先执行,且只执行一次。{}修饰的就当是一个平常的类语句块。
    {}是平常的類,那比構造方法的優先高?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 10:38:2514楼 得分:0
    先执行
    static {
    System.out.println("test2");
    }

    {
    System.out.println("test3");
    }

    输出 test2 ,test3;

    再执行
    Test t;
    t = new Test(1);
    System.out.println(ix);

    输出 1;

    再执行

    {
    System.out.println("test3");
    }

    输出 test3;

    最后
    Test t2;
    t2 = new Test(2);

    输出 2;

    test2
    test3
    1
    test3
    2
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yuppy
    • 等级:
    发表于:2008-05-10 10:58:5315楼 得分:0
    楼上似乎认为两个代码块是一开始先被执行;那第二次执行的时候为什么只执行了“test3"呢!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • norwolfli
    • 等级:
    发表于:2008-05-10 11:21:2416楼 得分:0
    test2,test3,1,2
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 11:37:4217楼 得分:0
    test2
    test3
    1
    test3
    2
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 12:13:0518楼 得分:0

    期待一个统一的正解!

    小弟也很困惑!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 12:19:5219楼 得分:0
    静态代码块在类被加载时候执行一次,而非静态代码块在属于对象的,类似于实例变量,在每次新生成一个对象的时候进行初始化。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 12:29:3920楼 得分:1
    java中加载一个类的执行过程
    1.一般是先执行类中的静态块.再执行类中的普通语句块 也就是上述的{}(非静态块)标识的语句块.
    最后加执行构造块.
    2.类的静态块只执行一次,而对于{}(非静态块)块,每个对像生成后都会进行初始化.
    所以LZ的例子,执行的过是
    Java code
    test2 test3 1 test3 2
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 12:42:3621楼 得分:0
    這個我已經測試了!static塊只執行一次,但是{}每次創建對象時都會初始化
    最后才是構造方法,大家把代碼適當刪除測試就知道了!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 13:51:1422楼 得分:0
    7楼和20楼回答的都很正确。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 14:13:1923楼 得分:0
    学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 14:24:3724楼 得分:0
    又学到了新知识
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 14:41:3625楼 得分:0
    大家再去看看这道题?
    http://topic.csdn.net/u/20080510/13/625dc9d3-7cfa-4aca-ac81-4a64446e378d.html
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 19:38:0126楼 得分:0
    test2
    test3
    1
    2
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 19:44:2427楼 得分:0
    cuole wo
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • anqini
    • 等级:
    发表于:2008-05-10 19:47:5728楼 得分:0
    凑热闹
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yuppy
    • 等级:
    发表于:2008-05-10 19:58:4329楼 得分:0
    类中非静态块内容的初始化和类中显式代码的初始化有区别吗?有大哥能解释下不?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 20:04:4830楼 得分:0
    知道了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 20:51:3731楼 得分:1
    test2
    test3
    1
    test3
    2
    很细致的问题
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 20:59:4532楼 得分:0
    19楼说的好
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 21:02:3133楼 得分:0
    引用 31 楼 zhenzhen19861009 的回复:
    test2
    test3
    1
    test3
    2
    很细致的问题
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 21:28:3434楼 得分:0
    学习中~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 21:31:1035楼 得分:2
    [color=#00CCFF]static{} 表示静态初始化块,
    static main(){} 表示静态方法,
    在类加载时 static 优先级高。
    所以不管怎样,类加载时:先静态块,再静态(属性/方法);

    大括号 {} 标示:创建对象时的初始化快,优先级比构造方法高,
    所以,创建对象时:先初始化块,后构造方法;

    程序执行过程分为3步:
    1.
      加载所有 static 初始化块,这里只有一个;
      static
      {
      System.out.println("test2");
      }[/color]
      输出:test2
    2.
      先加载所有 [color=#00CCFF]static
    (方法/属性),后加载所有非 static (方法/属性),
      找到 main() 方法;
    3.
      main() 方法中只创建两个对象,而创建对象时,先初始化块,后构造方法;
      Test t = new Test(1); 和 Test t2 = new Test(2);
      执行形同的代码块:
      {
        System.out.println("test3");
      }
      private Test( int ix){
        System.out.println(ix);
      }
      输出:[/color]
            test3
          1
          test3
          2

    请各位指教,谢谢!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-10 21:41:2036楼 得分:0
    test2 1 test2  2
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天