黑马程序员技术交流社区

标题: 构造代码块与static的区别 [打印本页]

作者: 康师傅-蛋黄派    时间: 2014-10-15 08:17
标题: 构造代码块与static的区别
可以说构造代码块初始化的是共同属性,而static修饰的是共同属性的值吗?
作者: 康师傅-蛋黄派    时间: 2014-10-15 08:42
啊啊啊啊啊啊啊啊啊?怎么没人回答
作者: Eagle    时间: 2014-10-15 10:00
我说下我所了解的,不知道对不对:
构造代码块是随类的运行而运行,每个函数都会运行
static是静态,也可以说是共同的,是需要调用才会运行的
作者: Eagle    时间: 2014-10-15 10:02
Eagle 发表于 2014-10-15 10:00
我说下我所了解的,不知道对不对:
构造代码块是随类的运行而运行,每个函数都会运行
static是静态,也可以 ...

楼主也说的差不多吧,构造代码块是初始化,static是修饰。嘿嘿。纯属个人理解,菜鸟一只,不知道对不对。
作者: 康师傅-蛋黄派    时间: 2014-10-15 10:26
Eagle 发表于 2014-10-15 10:00 我说下我所了解的,不知道对不对: 构造代码块是随类的运行而运行,每个函数都会运行 static是静态,也可以 ...

static是随着类的加载而加载,构造代码块感觉应该比static后运行,类建立好之后,在堆内存中初始化属性,但都是对象的共同属性,除了存储位置不同,还有什么不同呢?想的我都晕了。
作者: (づ ̄_3 ̄)づ    时间: 2014-10-15 10:37
构造代码块是每次实例化对象都会执行,static是仅在该类被加载时执行一次,如果两个都存在,先执行static
作者: zhappy    时间: 2014-10-15 10:43
有学了一些
作者: 康师傅-蛋黄派    时间: 2014-10-15 10:47
(づ ̄_3 ̄)づ 发表于 2014-10-15 10:37
构造代码块是每次实例化对象都会执行,static是仅在该类被加载时执行一次,如果两个都存在,先执行static ...

可以认为构造代码块的共同属性的值是变化的,static是不变的吗?
作者: 刘树弘    时间: 2014-10-15 12:09
本帖最后由 刘树弘 于 2014-10-15 12:19 编辑
  1. public class Static_ extends BS{
  2.         static {
  3.                 new BS(0);
  4.         }        
  5.         static BS bs1= new BS(1);
  6.         {
  7.                 new BS(3);
  8.         }        
  9.         BS bs3 = new BS(4);

  10.         public Static_(Object o){
  11.                 System.out.println("构造 Static_ Object");
  12.         }
  13.         public Static_(String s){
  14.                 System.out.println("构造 Static_ String");
  15.         }
  16.         
  17.         {
  18.                 new BS(5);
  19.         }
  20.         static {
  21.                 new BS(2);
  22.         }
  23.         public static void main(String[] arge){
  24.                 new Static_(null);
  25.                 new Static_(new Object());
  26.         }
  27.         
  28. }
  29. class BS {
  30.         static{
  31.                 System.out.println("BS 静态代码块");
  32.         }
  33.         public BS(int i ){
  34.                 System.out.println("构造B"+i);
  35.         }
  36.         public BS(){
  37.                 this(-1);
  38.         }
  39. }
复制代码

输出:
BS 静态代码块
构造B0
构造B1
构造B2
构造B-1
构造B3
构造B4
构造B5
构造 Static_ String
构造B-1
构造B3
构造B4
构造B5
构造 Static_ Object

结论:
静态赋值语句和静态代码块总是先于构造相关的代码执行。
父类代码先与子类代码执行。
同样是静态的代码,写在前面的代码先于后面的执行。构造的代码相似。
构造赋值语句和构造代码块总是先于构造函数执行。
总是调用参数类型完全一致的构造函数。
静态代码只执行一次。
能用赋值语句解决的就用赋值语句解决。否则用代码块解决(比如初始化某值可能抛异常,或某方法应当调用却没有返回值);
初始化某个类型的对象时,每个对象都要调用的代码放构造赋值语句和构造代码块,否则构造函数。


作者: javaAndroid    时间: 2014-10-15 12:12
类中static代码块比构造代码块先一步执行
但static代码快只会在内存中新建一次
                Ø 生命周期最长。
                Ø 随着类的加载而加载。
                Ø 随着类的消失而消失。
                Ø 优先于对象存在。
                Ø 被所有对象共享。
                Ø 可以直接被类型所调用。

作者: 康师傅-蛋黄派    时间: 2014-10-15 13:07
刘树弘 发表于 2014-10-15 12:09 输出: BS 静态代码块 构造B0

大神,膜拜啊。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2