栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java学习笔记——代码块

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java学习笔记——代码块

格式

[修饰符]{

};

代码块

相当于另一种形式的构造器,可以用作初始化的操作,不管调用哪个构造器,创建对象,都会优先调用代码块的内容,代码块调用的顺序要优先于构造器

package block_demo;

import java.io.File;

public class Film {

   private String name;
   private String desc;

   static {
       System.out.println("===========我是静态代码块,我是1号============");
   }

   static {
       System.out.println("===========我是静态代码块,我是2号=============");
   }

   {
       System.out.println("电影屏幕打开了...");
       System.out.println("广告时间...");
       System.out.println("电影开始了...");
   };

   {
       System.out.println("-----------我是一个普通的代码块...----------");
   }
   public Film(String name) {
       System.out.println("调用了 public Film(String name)");
       this.name = name;
   }

   public Film(String name, String desc) {
       System.out.println("调用了public Film(String name, String desc)");
       this.name = name;
       this.desc = desc;
   }

   public static void main(String[] args) {
       Film film = new Film("你好,李焕英");
       System.out.println("======================");
       Film film1 = new Film("西游记", "中国四大名著之一改编电影");
   }
}
结果

电影屏幕打开了…
广告时间…
电影开始了…
调用了 public Film(String name)
======================
电影屏幕打开了…
广告时间…
电影开始了…
调用了public Film(String name, String desc)

细节
  • static代码块也叫静态代码块,作用是对类进行初始化,而且它随着类的加载而执行,只会执行一次
  • 普通代码块,每创建一个对象,就执行,如果使用类的静态成员时,普通代码块不会被执行
  • 创建一个对象时,在一个类调用顺序:
  1. 调用静态代码块和静态属性初始化(静态代码块和静态属性初始化调用的优先级一样,如果有多个静态代码块和多个静态变量初始化,按照定义的顺序调用)
  2. 调用普通代码块和普通属性的初始化(注释同上)
  3. 调用构造方法
package block_demo;

import java.io.File;

public class Film {

    private String name;
    private String desc;

    static {
        System.out.println("我是静态代码块,我是1号");
    }

	{
        System.out.println("电影屏幕打开了...");
        System.out.println("广告时间...");
        System.out.println("电影开始了...");
    }

    static {
        System.out.println("我是静态代码块,我是2号");
    }

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

    public Film(String name, String desc) {
        System.out.println("调用了public Film(String name, String desc)");
        this.name = name;
        this.desc = desc;
    }

    public static void main(String[] args) {
        Film film = new Film("你好,李焕英");
        System.out.println("======================");
        Film film1 = new Film("西游记", "中国四大名著之一改编电影");
    }
}
结果

=我是静态代码块,我是1号==
=我是静态代码块,我是2号===
电影屏幕打开了…
广告时间…
电影开始了…
-----------我是一个普通的代码块…----------
调用了 public Film(String name)
======================
电影屏幕打开了…
广告时间…
电影开始了…
-----------我是一个普通的代码块…----------
调用了public Film(String name, String desc)

首先执行的是静态代码块,然后是普通代码块

  • 构造器的最前面隐藏了super()和调用普通代码块
package block_demo;

public class Demo1 {
    public static void main(String[] args) {
        // 加载类,调用父类和本类的静态代码块
        new B();
    }
}

class A{

    // 普通代码块
    {
        System.out.println("我是A类的普通代码块");
    }

    // 静态代码块
    static {
        System.out.println("我是A类的静态代码块");
    }

    public A() {
        System.out.println("我是A类的构造器");
    }
}

class B extends A {

    // 普通代码块
    {
        System.out.println("我是B类的普通代码块");
    }

    // 静态代码块
    static {
        System.out.println("我是B类的静态代码块");
    }

    public B() {
        // super()
        // 本类的普通代码块
        System.out.println("我是B类的构造器");
    }
}
结果

我是A类的静态代码块
我是B类的静态代码块
我是A类的普通代码块
我是A类的构造器
我是B类的普通代码块
我是B类的构造器

package com.hspedu.codeblock_;

public class CodeBlockDetail04 {
    public static void main(String[] args) {
        //老师说明
        //(1) 进行类的加载
        //1.1 先加载 父类 A02 1.2 再加载 B02
        //(2) 创建对象
        //2.1 从子类的构造器开始
        //new B02();//对象

        new C02();
    }
}

class A02 { //父类
    private static int n1 = getVal01();
    static {
        System.out.println("A02的一个静态代码块..");//(2)
    }
    {
        System.out.println("A02的第一个普通代码块..");//(5)
    }
    public int n3 = getVal02();//普通属性的初始化
    public static int getVal01() {
        System.out.println("getVal01");//(1)
        return 10;
    }

    public int getVal02() {
        System.out.println("getVal02");//(6)
        return 10;
    }

    public A02() {//构造器
        //隐藏
        //super()
        //普通代码和普通属性的初始化......
        System.out.println("A02的构造器");//(7)
    }

}

class C02 {
    private int n1 = 100;
    private static  int n2 = 200;

    private void m1() {

    }
    private static void m2() {

    }

    static {
        //静态代码块,只能调用静态成员
        //System.out.println(n1);错误
        System.out.println(n2);//ok
        //m1();//错误
        m2();
    }
    {
        //普通代码块,可以使用任意成员
        System.out.println(n1);
        System.out.println(n2);//ok
        m1();
        m2();
    }
}

class B02 extends A02 { //

    private static int n3 = getVal03();

    static {
        System.out.println("B02的一个静态代码块..");//(4)
    }
    public int n5 = getVal04();
    {
        System.out.println("B02的第一个普通代码块..");//(9)
    }

    public static int getVal03() {
        System.out.println("getVal03");//(3)
        return 10;
    }

    public int getVal04() {
        System.out.println("getVal04");//(8)
        return 10;
    }
    //一定要慢慢的去品..
    public B02() {//构造器
        //隐藏了
        //super()
        //普通代码块和普通属性的初始化...
        System.out.println("B02的构造器");//(10)
        // TODO Auto-generated constructor stub
    }
}
类什么时候被加载
  1. new
  2. 创建子类对象实例,父类也会被加载
  3. 使用类的静态成员时
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/331748.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号