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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 程有愿 中级黑马   /  2012-8-27 13:35  /  2295 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

再毕老师的视频里讲到,构造代码块是用来给类中对象初始化的,并由先与构造方法执行,后来又了解到权限修饰符static可以用来修饰类中成员,可以用来修饰类所对应对象的共有数据,那么我想问下用static所修饰的成员变量与构造代码块中封装的成员变量是不是在给对象初始化时的作用一样呢?这2个的作用有什么相似之处和不同之处呢?

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

8 个回复

倒序浏览
本帖最后由 杨鹏鹏 于 2012-8-27 13:57 编辑

public class Person{
        static int a;
        {
                a=10;
                System.out.println("a==="+a);
               
        }
        static{
                a=100;
                System.out.println("a==="+a);
        }
        Person(int a){
                this.a=a;
        }
public static void main(String[] args) {
        Person p=new Person(90);
        System.out.println(p.a);
        /*
         * ,因为new用到了Person.class.所以会先找到Person.class文件并加载到内存中。
2,执行该类中的static代码块,如果有的话,给Person.class类进行初始化。
3,在堆内存中开辟空间,分配内存地址。
4,在堆内存中建立对象的特有属性。并进行默认初始化。
5,对属性进行显示初始化。
6,对对象进行构造代码块初始化。
7,对对象进行对应的构造函数初始化。
8,将内存地址付给栈内存中的p变量。

         * a===100          * a===10
          * 90
         *
         * */
}
}
回复 使用道具 举报
吴通 来自手机 中级黑马 2012-8-27 14:11:12
藤椅
2、构造块
直接在类中定义的代码块称为构造块。
class Demo
{
       //定义构造快
       {
       System.out.println("**************构造块*************") ;
       }
       //定义构造方法
       public Demo()
       {
       System.out.println("**************构造方法*************") ;
       }
}
public class CodeDemo02
{
       public static void main(String args[])
       {
       //实例化三个对象
       new Demo() ;
       new Demo() ;
       new Demo() ;
       }
}
       可以看出构造块会重复调用多次,构造块会优先于构造方法执行。
3、静态块
使用static关键字声明的代码块,称为静态块,静态块的主要目的是用来为静态属性初始化。
class Demo
{
       //定义构造快
       {
       System.out.println("**************构造块*************") ;
       }
       //定义静态代码块
       static
       {
       System.out.println("**************类中静态块*************") ;
       }
       //定义构造方法
       public Demo()
       {
       System.out.println("**************构造方法*************") ;
       }
}
public class CodeDemo03
{
       //在主类中定义的静态代码块
       static
       {
       System.out.println("**************主类中的静态块*************") ;
       }
       public static void main(String args[])
       {
       //实例化三个对象
       new Demo() ;
       new Demo() ;
       new Demo() ;
       }
}
       静态块优先于主方法执行,静态块优先于构造块执行,而且执行一次。
回复 使用道具 举报
再毕老师的视频里讲到,构造代码块是用来给类中对象初始化的,并由先与构造方法执行,后来又了解到权限修饰符static可以用来修饰类中成员,可以用来修饰类所对应对象的共有数据,那么我想问下用static所修饰的成员变量与构造代码块中封装的成员变量是不是在给对象初始化时的作用一样呢?这2个的作用有什么相似之处和不同之处呢?

static与对象无关,在类加载时,static所修饰的成员变量已经随着类的加载而加载了,而对象可能还没出现。你所讲的构造代码块应该是非静态的吧,这个是随着对象的产生而初始化的,并且先与构造方法执行。至于构造代码块中封装成员变量我觉得好意义不大,因为构造代码块执行完,这些变量的生命周期就结束了,我觉的构造代码块的作用应该是在对象产生时对对象的成员变量进行操作的吧。

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

回复 使用道具 举报
构造代码块的优先级比构造函数高。
先是默认初始化,然后是显示初始化,紧跟是构造代码块初始化,接下来是构造函数初始化。
person p=new person("zhangsan",20);
该句话都做了什么事?
1,因为new用到了person.class.所以会先找到person.class文件并加载到内容中。
2,执行该类中的static代码块,如果有的话,给person.class类进行初始化。
3,在堆内存中开辟空间,分配内存地址。
4,在堆内存中建立对象的特有属性。并进行默认初始化。
5,对特有属性进行显示初始化。
6,对对象进行构造代码块初始化。7,对对象进行对应的构造函数初始化。
8,将内存地址付给栈内存中的P不变量。
回复 使用道具 举报
构造代码块是给对象初始化的,创建一个对象时,就会初始化一次

而静态的构造代码块是给类初始化的,只初始化一次

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

回复 使用道具 举报
4,在堆内存中建立对象的特有属性。并进行默认初始化。
5,对特有属性进行显示初始化。

我想问下这个是什么意思 ,我理解的很模糊
回复 使用道具 举报
夏天 初级黑马 2012-8-27 19:38:02
8#
程有愿 发表于 2012-8-27 18:12
我想问下这个是什么意思 ,我理解的很模糊

对象的特有属性,也就是非静态的属性。
静态属性: 比如在一个Person类中,你所有的Person都是中国人的话,你就可以定义成一个静态的属性,private static String country="China";
对象的特有属性,别如name属性。各个人名字不一样,所以是各个对象特有的。

对特有属性进行显式初始化,就相当于给特有属性进行赋值。比如你例题中1楼回答传的参数90
回复 使用道具 举报
构造方法中的代码快是构造块,构造块优先于构造方法执行,每实例化一个新的对象构造块就执行一次,一般用直接用构造方法;
静态块是在构造方法基础上扩充的,static定义的构造块,静态块可以在普通类中定义,也可以在主类中定义。
静态块优先于构造块和构造方法执行,如果在主类中,则优先于主方法先执行。如:
public class Hello{
    System.out.println("Hello World!!!");\
    System.exit(1);

静态块主要功能是为static属性初始化,但很少这样做,基本定义static属性时直接就给出默认值了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马