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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Lex   /  2014-5-31 10:36  /  5417 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Lex 于 2014-5-31 16:56 编辑

顺便在说明一下,三者在内存之间的执行先后顺序

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

11 个回复

倒序浏览
本帖最后由 ↘ふ紫铯幽夢 于 2014-5-31 10:57 编辑
  1. 1 普通代码块



  2. //普通代码块:在方法或语句中出现的{}就称为普通代码块。普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出现先执行”
  3.   public class CodeBlock01{
  4.         public static void main(String[] args){
  5.             
  6.               {
  7.                 int x=3;
  8.                System.out.println("1,普通代码块内的变量x="+x);   
  9.              }
  10.             
  11.              int x=1;
  12.              System.out.println("主方法内的变量x="+x);
  13.             
  14.              {
  15.                 int y=7;
  16.                 System.out.println("2,普通代码块内的变量y="+y);   
  17.              }
  18.            }
  19.      }
  20.      
  21.     /*
  22.     运行结果:
  23.    1,普通代码块内的变量x=3
  24.          主方法内的变量x=1
  25.           2,普通代码块内的变量y=7
  26.     */
  27.    




  28. 2 构造代码块



  29. //构造块:直接在类中定义且没有加static关键字的代码块称为{}构造代码块。构造代码块在创建对象时被调用,每次创建对象都会被调用,并且构造代码块的执行次序优先于类构造函数。

  30. public class CodeBlock02{
  31.     {
  32.       System.out.println("第一代码块");   
  33.     }
  34.    
  35.     public CodeBlock02(){
  36.         System.out.println("构造方法");
  37.         }
  38.         
  39.         {
  40.           System.out.println("第二构造块");
  41.         }
  42.       public static void main(String[] args){
  43.           new CodeBlock02();
  44.           new CodeBlock02();
  45.           new CodeBlock02();
  46.            
  47.     }
  48. }   

  49. /*
  50. *
  51. 执行结果:
  52. 第一代码块
  53. 第二构造块
  54. 构造方法
  55. 第一代码块
  56. 第二构造块
  57. 构造方法
  58. 第一代码块
  59. 第二构造块
  60. 构造方法
  61. */




  62. 3 静态代码块



  63. //静态代码块:在java中使用static关键字声明的代码块。静态块用于初始化类,为类的属性初始化。每个静态代码块只会执行一次。由于JVM在加载类时会执行静态代码块,所以静态代码块先于主方法执行。
  64. //如果类中包含多个静态代码块,那么将按照"先定义的代码先执行,后定义的代码后执行"。
  65. //注意:1 静态代码块不能存在于任何方法体内。2 静态代码块不能直接访问静态实例变量和实例方法,需要通过类的实例对象来访问。


  66. class Code{
  67.     {
  68.       System.out.println("Code的构造块");
  69.     }
  70.    
  71.     static{
  72.         System.out.println("Code的静态代码块");
  73.         }
  74.         
  75.     public Code(){
  76.         System.out.println("Code的构造方法");
  77.         }
  78.     }
  79.    
  80.    
  81. public class CodeBlock03{
  82.      {
  83.       System.out.println("CodeBlock03的构造块");   
  84.      }
  85.      
  86.      static{
  87.         System.out.println("CodeBlock03的静态代码块");
  88.         }
  89.         
  90.         public CodeBlock03(){
  91.              System.out.println("CodeBlock03的构造方法");
  92.             }
  93.         
  94.       public static void main(String[] args){
  95.             System.out.println("CodeBlock03的主方法");
  96.             new Code();
  97.             new Code();
  98.             new CodeBlock03();
  99.             new CodeBlock03();
  100.           }
  101.     }
  102. /*
  103. CodeBlock03的静态代码块
  104. CodeBlock03的主方法
  105. Code的静态代码块
  106. Code的构造块
  107. Code的构造方法
  108. Code的构造块
  109. Code的构造方法
  110. CodeBlock03的构造块
  111. CodeBlock03的构造方法
  112. CodeBlock03的构造块
  113. CodeBlock03的构造方法
  114. */



复制代码

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报 2 0
我是来向楼上学习的
回复 使用道具 举报
楼主总结的太好了,膜拜
回复 使用道具 举报
过来学习 ,下
回复 使用道具 举报
构造代码块和构造方法都是给类进行初始化的,如果有多个代码块就按代码块的出现的先后顺序执行,让你后在执行构造方法
回复 使用道具 举报
静水流华 发表于 2014-9-11 16:02
构造代码块和构造方法都是给类进行初始化的,如果有多个代码块就按代码块的出现的先后顺序执行,让你后在执 ...

没创建一个对象就会执行一遍
回复 使用道具 举报
回复 使用道具 举报
Hosing 中级黑马 2015-4-16 00:05:50
9#
总结:
1、构造代码块用于类的初始化操作,静态构造代码块只执行一次,而构造代码块在每次创建对象时都执行;
2、构造方法用于对象的初始化操作,即创建对象是通过调用相应的构造方法来实现的;
3、 普通代码块的使用,一般来说是没有意义的,唯一的用途可能是用来限定变量的作用域/生命周期了吧
  对吧?!:lol
回复 使用道具 举报
静态代码块是内存在加载时执行的
回复 使用道具 举报

总结的很好,案例很有代表性。不过如果在有继承的类中子父类都有静态代码块,构造代码块等,子类的静态代码块的执行次序看起来就不那么直观了
回复 使用道具 举报
这个我很容易混淆,谢谢你的整理!!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马