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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 夜写意 于 2015-7-22 23:10 编辑

基于个人对静态代码块、构造代码块和构造函数的理解,我谈谈个人对这三者作用的看法
  • 构造函数
    这个基本上大家都知道的,作用就是用来创建对象以及在创建对象的时候给对象的属性进行初始化。当被private修饰的时候将不能在外部创建对象
    构造函数可以存在重载,系统默认给一个无参的构造函数,在手动定义了构造函数的时候,系统默认的无参构造函数将会被替代,所以在定义了带参的构造函数的情况下我们都应该手动定义一个无参的构造函数以便可以使用无参构造创建对象。
  • 构造代码块
    作用就是给所有的对象进行初始化。在创建对象的时候就会运行。
    那这个和构造函数有什么区别呢?
    构造函数存在重载,创建对象的时候使用不同的构造函数,给对象初始化的情况就不一样。而构造代码块中往往都是把所有的构造函数中共性的内容提取出来,然后封装在构造代码块中,这样创建的所有的对象都会被初始化,这样就不用在每一个构造函数中写入相同的内容。
    例如:
    1. //创建对象时都需要打印 aaa,不用构造代码块就需要在构造函数中写上输出语句
    2. class Test {
    3.         Test() {
    4.         System.out.println("aaa");
    5.         }

    6.         Test(String name) {
    7.         System.out.println("aaa");
    8.         }

    9.         Test(String name, int age) {
    10.         System.out.println("aaa");
    11.         }
    12. }
    13. //使用构造代码块提取共性内容,由此在构造函数中就不需要全部写上同一句输出语句
    14. class Test1 {
    15.         {
    16.         System.out.println("aaa");
    17.         }

    18.         Test1() {
    19.                
    20.         }

    21.         Test1(String name) {
    22.                
    23.         }

    24.         Test1(String name, int age) {
    25.                
    26.         }
    复制代码

  • 静态代码块
    作用是给类初始化,在类加载的时候就加载了,先于对象存在
    那这和构造代码块又有什么区别呢?
    比如有这么一种情况,类中方法是静态的,构造函数都是private修饰的,这样就不能将类实例化,这就意味着不能通过构造代码块以及构造函数增加一些属性:比如打印一句话,那怎么办?这时就需要用到静态代码块。例:
    1. public class Test {
    2.         public static void main(String[] args) {
    3.                 Test01.show();
    4.         }
    5. }
    6. class Test01{
    7.         static{
    8.                 System.out.println("aaaa");
    9.         }
    10.         private Test01(){}
    11.         public static void show(){};
    12. }
    复制代码

  • 静态代码块和静态方法的区别
    静态代码块在类加载的时候就加载的,属于主动加载
    静态方法在被调用的时候才会被加载,属于被动加载
    作用:静态代码块可用来初始化一些项目最常用的变量或对象;静态方法可用作不创建对象也可能需要执行的代码.
  • 三者的执行顺序
    静态代码块-->构造代码块-->构造函数










静态代码块的一个小问题
  1. /*
  2. * 可不可以这么初始化呢?
  3. * 答案是否定的,要注意变量的作用域,此代码块执行完了,变量就从内存消失了。
  4. */
  5. static{
  6.     int a = 0;
  7. }
复制代码




0 个回复

您需要登录后才可以回帖 登录 | 加入黑马