黑马程序员技术交流社区

标题: 局部代码块,静态代码块,构造代码块如何区分? [打印本页]

作者: 梁秋瑜    时间: 2013-5-25 21:43
标题: 局部代码块,静态代码块,构造代码块如何区分?
局部代码块,静态代码块,构造代码块怎么区分,都有什么作用,在什么情况下需要用到它们?
作者: 翟宝海    时间: 2013-5-25 21:54
本帖最后由 翟宝海 于 2013-5-25 21:56 编辑

局部代码块:
作用:控制变量的生命周期;
在程序中,当我们已经使用完 x 后,并且在接下来的代码中,不会再用到x,那么就没必要让x 在内存中占用空间了。这用情况下,可以使用局部代码块,将x及其所涉及到的区域封装为局部代码块,他们在程序执行中顺序不变,只是在执行完成后消失;
构造代码块:
作用:它可以给所有对象进行初始化;
存在于:类中;
当类中的构造方法以重载的形式存在时,并且有共同成员变量或共同的方法时,可以通过构造代码块对其进行初始化,这样可以减少代码的重复。
静态代码块:
1. 随着类的加载而执行,而且只一次;
2. 优先于主函数执行;
作用:给类进行初始化;
当类中的方法都被静态化了,并且构造方法被private修饰,这时我们不能再将这个类实例化,然而又想让类增加一些属性,就可以使用静态代码块;
作者: 神之梦    时间: 2013-5-25 21:57
来学习的
作者: 武志红    时间: 2013-5-25 22:28
本帖最后由 武志红 于 2013-5-25 22:29 编辑

一、普通代码块

  直接在一个方法中出现的{}就称为普通代码块,例子程序如下:

  public class CodeDemo01{

  public static void main(String[] args){

  //普通代码块

  {

  int x = 10;

  System.out.println("x=" + x);

  }

  int x = 100;

  System.out.println("x=" + x);

  }

  }

  二、构造代码块

  直接在类中定义的没有加static关键字的代码块{}称为构造代码块,例子程序如下:

  public class CodeDemo02{

  public CodeDemo02(){

  System.out.println("========这是构造方法=========");

  }

  //这是构造代码块,而且在new对象时,构造代码块优先构造方法执行

  {

  System.out.println("=========这是构造块!=========");

  }

  public static void main(String[] args){

  new CodeDemo02();

  new CodeDemo02();

  }

  }

  三、静态代码块

  使用static关键字声明的代码块称为静态代码块,静态块的主要目的是用来为静态属性初始化,例子程序如下:

  public class CodeDemo03

  {

  static{

  System.out.println("这是主类中的静态代码块!");

  }

  public static void main(String[] args){

  new Demo();

  new Demo();

  new Demo();

  }

  }

  class Demo

  {

  static{

  System.out.println("这是Demo类中的静态代码块!");

  }

  {

  System.out.println("这是Demo类中的构造块!");

  }

  public Demo(){

  System.out.println("这是构造方法!");

  }

  }

  静态块优先于主方法的执行,静态块优先于构造方法的执行,而且只执行一次!

  四、同步代码块

  同步代码块主要出现在多线程中。{:soso_e104:}
详细吧,简单吧 理解了吧?



作者: yanzhigang    时间: 2013-5-25 22:41
1 局部代码块:

作用:控制变量的生命周期;

在程序中,当我们已经使用完 x 后,并且在接下来的代码中,不会再用到x,那么就没必要让x 在内存中占用空间了,这用情况下,可以使用 局部代码块,将x及其所设计到的区域封装为局部代码块,他们在程序执行中顺序不变,只是在执行完成后消失。

表现形式,以代码体现如下:
class TestDemo
{      
        public static void main(String[] args)
        {   
                {  
                        int x = 9;
                        System.out.println(x);
                }  
        System.out.println("Hello World !");
        }   
}

构造代码块:

作用:它可以给所有对象进行初始化
存在于:类中。
当类中的构造方法以重载的形式存在时,并且有共同成员变量或共同的方法时,可以通过构造代码块对其进行初始化;这样可以减少代码的重复!
class Person
{       private String name;
         private int age;
         { System.out.println("cons code run !");
         
         }              Person() // 给对应的对象进行初始化      
       
        {           System.out.println("Person Now:RUN !");         
        System.out.println("eat————");       }            
        Person (String name , int age)
        {  this.name = name ;
        this.age= age;  
        System.out.println(this.name + "————" + this.age);
        System.out.println("eat————");       }
        }  
class ConsCodeDemo
{
        public static void main(String[] args)
        {         
                Person p = new Person();         
                Person p1 = new Person("LiSi" , 23);      
        }  
}

我们可以看到类Person中 重载的构造方法中有共同的代码System.out.println("eat————");我们可以将他封装进构造代码块,用来给各种进行初始化。

优化后,代码体现为:

class Person
{      
        private String name;     
        private int age;            
        {   
                System.out.println("cons code run !");
                eat();   
        }
        Person() // 给对应的对象进行初始化
        {
                System.out.println("Person Now:RUN !");
        }  
        Person (String name , int age)
        {   
                this.name = name ;
                this.age= age;
                System.out.println(this.name + "————" + this.age);
               
        }
        public void eat()
        {   
                System.out.println("eat————");
               
        }  
       
}   
class ConsCodeDemo
{      
        public static void main(String[] args)
        {
        Person p = new Person();
        Person p1 = new Person("LiSi" , 23);
        }
}

静态代码块:

特点:

1. 随着类的加载而执行,而且只一次。
2. 优先于主函数执行。


作用:给类进行初始化。


当类中的方法都被静态化,并且构造方法被private了,这是我们不能,在将这个类实例化,然而又想让类增加一些属性,就可以使用静态代码块:

表现形式,以代码体现如下:

class StaticCode   
{
static  { System.out.println("A");  

}      
        public void show()      
        {  
                System.out.println("Hello World !");      
        }  

}   
class StaticCodeDemo  
{       static
        {   System.out.println("B");
        }
        public static void main(String[] args)
        {           new StaticCode().show();  
        }  
        static     {  System.out.println("C");  
        }  
}

作者: 孙茜茜    时间: 2013-5-25 22:46
刚好我今天也在日志总结了
http://blog.163.com/xihayilv@126/blog/static/1305286572013425104444553/
作者: 王靖远    时间: 2013-5-25 23:49
6...类中各成分加载顺序和存放位置
一、什么时候会加载类?
                使用到类中的内容时加载:有三种情况
                                1.创建对象:new StaticCode();
                                2.使用类中的静态成员:StaticCode.num=9;  StaticCode.show();
                                3.在命令行中运行:java StaticCodeDemo
                                
二、类所有内容加载顺序和内存中的存放位置:
利用语句进行分析。
1.Person p=new Person("zhangsan",20);
该句话所做的事情:
1.在栈内存中,开辟main函数的空间,建立main函数的变量 p。
2.加载类文件:因为new要用到Person.class,所以要先从硬盘中找到Person.class类文件,并加载到内存中。
加载类文件时,除了非静态成员变量(对象的特有属性)不会被加载,其它的都会被加载。
记住:加载,是将类文件中的一行行内容存放到了内存当中,并不会执行任何语句。---->加载时期,即使有输出语句也不会执行。
静态成员变量(类变量)                ----->方法区的静态部分
静态方法                              ----->方法区的静态部分非静态方法(包括构造函数)        ----->方法区的非静态部分
静态代码块                                        ----->方法区的静态部分
构造代码块                                        ----->方法区的静态部分
                                       
注意:在Person.class文件加载时,静态方法和非静态方法都会加载到方法区中,只不过要调用到非静态方法时需要先实例化一个对象
,对象才能调用非静态方法。如果让类中所有的非静态方法都随着对象的实例化而建立一次,那么会大量消耗内存资源,
所以才会让所有对象共享这些非静态方法,然后用this关键字指向调用非静态方法的对象。
        
                        
3.执行类中的静态代码块:如果有的话,对Person.class类进行初始化。
4.开辟空间:在堆内存中开辟空间,分配内存地址。
5.默认初始化:在堆内存中建立 对象的特有属性,并进行默认初始化。
6.显示初始化:对属性进行显示初始化。
7.构造代码块:执行类中的构造代码块,对对象进行构造代码块初始化。
8.构造函数初始化:对对象进行对应的构造函数初始化。
9.将内存地址赋值给栈内存中的变量p。
        2.p.setName("lisi");
        1.在栈内存中开辟setName方法的空间,里面有:对象的引用this,临时变量name
        2.将p的值赋值给this,this就指向了堆中调用该方法的对象。
        3.将"lisi" 赋值给临时变量name。
        4.将临时变量的值赋值给this的name。
        3.Person.showCountry();        
        1.在栈内存中,开辟showCountry()方法的空间,里面有:类名的引用Person。
        2.Person指向方法区中Person类的静态方法区的地址。
        3.调用静态方法区中的country,并输出。
        注意:要想使用类中的成员,必须调用。通过什么调用?有:类名、this、super
     
这块是你需要的,上面也可以看看。      
三、静态代码块、构造代码块和构造函数的区别
                静态代码块:用于给类初始化,类加载时就会被加载执行,只加载一次。
                构造代码块:用于给对象初始化的。只要建立对象该部分就会被执行,且优先于构造函数。
                构造函数:  给对应对象初始化的,建立对象时,选择相应的构造函数初始化对象。               
                  创建对象时,三者被加载执行顺序:静态代码块--->构造代码块--->构造函数





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