代码块详解

本文阅读 3 分钟
首页 代码,Java 正文

img 基本语法 img 代码块的好处 1.相当于另外一种形式的构造器((对构造器的补充机制),可以用来做初始化的操作 2.场景:如果多个构造器中都有重复的语句,可以抽取到初始化块中,提高代码的复用性

package codeblock;


public class code1 { 
    public static void main(String[] args) { 
        new Movie();
        System.out.println("----------------------");
        new Movie("tom");
        System.out.println("----------------------");
        new Movie("jack","jim");
        System.out.println("----------------------");
        new Movie("jacky","tim",20);
    }
}

class Movie{ 
    private String name;
    private String director;
    private double price;

    { 
        System.out.println("电影开始");
        System.out.println("准备观看");
    }
    public Movie() { 
        System.out.println("无参构造器被调用");
    }

    public Movie(String name) { 
        System.out.println("Movie(String name)被调用");
        this.name = name;
    }

    public Movie(String name, String director) { 
        System.out.println("Movie(String name,String director)被调用");
        this.name = name;
        this.director = director;
    }

    public Movie(String name, String director, double price) { 
        System.out.println("Movie(String name,String director,double price)被调用");
        this.name = name;
        this.director = director;
        this.price = price;
    }
}

执行结果 img

如果构造器当中有相同的语句,我们可以把这些语句放在代码块中,不然会显得代码冗余
这样子不管我们调用哪一个构造器,创建对象,都会先调用代码块的内容
代码块调用顺序优先于构造器

代码块先执行,构造器再执行 img

package  codeblock;

 
public class code2 { 
    public static void main(String[] args) { 
        new A();
    }
}
class A{ 
    static { 
        System.out.println("静态代码块A执行");
    }
    { 
        System.out.println("代码块A执行");
    }
    public A(){ 
        System.out.println("构造器A执行");
    }

}

执行结果:

静态代码块A执行
代码块A执行
构造器A执行
package com.zyh.codeblock;

/** * @author zengyihong * @create 2022--02--20 9:22 */
public class code2 { 
    public static void main(String[] args) { 
        //new A();
        new B();
    }
}
class A{ 
    static { 
        System.out.println("静态代码块A执行");
    }
    { 
        System.out.println("代码块A执行");
    }
    public A(){ 
        System.out.println("构造器A执行");
    }

}

class B extends A{ 

    static { 
        System.out.println("静态代码块B执行");
    }
    { 
        System.out.println("代码块B执行");
    }


}

执行结果: img 静态代码块随着类的加载而加载,并且只会加载一次,代码块随着对象的创建,每创建一次,都会调用一次

package  codeblock;

 
public class code2 { 
    public static void main(String[] args) { 
        //new A();
        new B();
        System.out.println("-------------------");
        new B();
    }
}
class A{ 
    static { 
        System.out.println("静态代码块A执行");
    }
    { 
        System.out.println("代码块A执行");
    }
    public A(){ 
        System.out.println("构造器A执行");
    }

}

class B extends A{ 

    static { 
        System.out.println("静态代码块B执行");
    }
    { 
        System.out.println("代码块B执行");
    }


}

img img

package codeblock;

public class code3 { 
  public static void main(String[] args) { 

    D d = new D();// (1) A 静态代码块 01 (2) getN1 被调用...(3)A 普通代码块 01(4)getN2 被调用...(5)A() 构造器被调

  }
}

class D { 
   //普通代码块

 { 
  System.out.println("A 普通代码块 01");
 }

 private int n2 = getN2();//普通属性的初始化


 private static    int n1 = getN1();
 static {  //静态代码块
  System.out.println("D 静态代码块 01");
 }

 //静态属性的初始化

 public static int getN1() { 
  System.out.println("getN1 被调用...");
  return 100;
 }

 public int getN2() {  //普通方法/非静态方法
  System.out.println("getN2 被调用...");
  return 200;
 }
 //无参构造器
 public D() { 
  System.out.println("A() 构造器被调用");
 }
}

img img

package codeblock;

public class CodeBlockDetail03 { 
    public static void main(String[] args) { 
        //(1)AAA 的普通代码块(2)AAA() 构造器被调用(3)BBB 的普通代码块(4)BBB() 构造器被调用 }
        new BBB();
    }
}
    class AAA {  //父类 Object
        { 
            System.out.println("AAA 的普通代码块");
        }

        public AAA() { 
//(1)super()
//(2)调用本类的普通代码块
            System.out.println("AAA() 构造器被调用....");
        }


    }

   class BBB extends AAA { 
        { 
            System.out.println("BBB 的普通代码块...");
        }

        public BBB() { 
//(1)super()
//(2)调用本类的普通代码块
            System.out.println("BBB() 构造器被调用....");
        }
    }

img img

静态代码块只能调用静态属性,静态方法,而普通代码块可以调用任何成员

注:本文是学习韩顺平老师的课程所写

本文为互联网自动采集或经作者授权后发布,本文观点不代表立场,若侵权下架请联系我们删帖处理!文章出自:https://zengyihong.blog.csdn.net/article/details/123027164
-- 展开阅读全文 --
安全面试之XSS(跨站脚本攻击)
« 上一篇 07-24

发表评论

成为第一个评论的人

热门文章

标签TAG

最近回复