代码块详解

举报
Java的学习之路 发表于 2022/03/24 11:07:00 2022/03/24
【摘要】 1.基本介绍基本语法代码块的好处1.相当于另外一种形式的构造器((对构造器的补充机制),可以用来做初始化的操作2.场景:如果多个构造器中都有重复的语句,可以抽取到初始化块中,提高代码的复用性package codeblock;public class code1 { public static void main(String[] args) { new Movie()...

1.基本介绍

在这里插入图片描述
基本语法
在这里插入图片描述
代码块的好处
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;
    }
}



执行结果
在这里插入图片描述

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

2.代码块使用的注意事项

代码块先执行,构造器再执行
在这里插入图片描述

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执行");
    }


}


执行结果:
在这里插入图片描述
静态代码块随着类的加载而加载,并且只会加载一次,代码块随着对象的创建,每创建一次,都会调用一次

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执行");
    }


}

在这里插入图片描述
在这里插入图片描述

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()  构造器被调用");
 }
}

在这里插入图片描述
在这里插入图片描述

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()  构造器被调用....");
        }
    }

在这里插入图片描述
在这里插入图片描述

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

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。