分享

Java基础之:OOP——代码块

 丹枫无迹 2021-06-18

代码块又称初始化块,是类中的成员(即类的一部分),类似于方法,将逻辑语句封装在方法体中,通过{}包围起来,也是通过调用执行。

但和方法不同,没有方法名,没有返回,没有参数,只有方法体,而且不用通过对象或类显式调用,而是加载类时,或创建对象时隐式调用

基本语法

[修饰符]{

代码(方法体)

};

说明:

  1. 修饰符可选是否添加,但只能添加static

  2. 代码块分为两种,加了static的静态代码块,没加static的普通代码块

  3. 逻辑语句可以是任何逻辑语句(输入、输出、方法调用、循环、判断等)

  4. 结尾的“;”号可以不写,[建议不写]

代码块优点

代码块相当于另外一种形式的构造器(对构造器的补充机制),可以作初始化的操作。

当构造器重载时,可以提取多个构造器重复执行的代码,放入代码块中。

简单案例

电影放映

public class CodeBlockTest02 {

    public static void main(String[] args) {

        new Movie();
        
        System.out.println("----------------");
        new Movie("唐人街探案3..");
        
        System.out.println("---------------");
        new Movie("我和我的祖国...", 80, "张艺谋");
    }

}

class Movie {
    
    private String name;
    private double price;
    private String director;
    
    //代码块
    {
        System.out.println("电影开始播放广告...");
        System.out.println("电影屏幕拉下来.");
        System.out.println("电影播放.");
    }
    
    public Movie() {
        
        
    }
    public Movie(String name) {
    
        this.name = name;
    }
    public Movie(String name, double price, String director) {
        
        
        this.name = name;
        this.price = price;
        this.director = director;
    }
}

结果输出

代码块使用说明

  1. static代码块又称静态代码块,静态代码块在类加载时就会执行且仅执行一次,和静态属性/静态方法相同。静态代码块的作用就是初始化类

  2. 普通的代码块,每声明一个对象执行一次普通代码块,所以我们又可以将普通代码块看成构造器的一部分。

  3. 如果只使用类的静态成员,则不会执行普通代码块。因为只要不声明对象,普通代码块就不会执行。

什么时候类被加载:

  1. 创建对象时: Person p = new Person();

  2. 创建子类对象时,父类也会被加载:Student s = new Student(); (Student extends Person,Student和Person都会被加载)

  3. 使用类的静态成员(静态属性,静态方法)时:Student.totalFee; (private static double totalFee)

创建对象时,类的调用顺序

  1. 调用静态代码块和静态属性初始化(注意:静态代码块和静态属性初始化调用的优先级一样,如果有多个静态代码块和多个静态变量初始化,则按他们定义的顺序调用)

  2. 调用普通代码块和普通属性的初始化(注意:普通代码块和普通属性初始化调用的优先级一样,如果有多个普通代码块和多个普通属性初始化,则按定义顺序调用)

  3. 调用构造方法。

构造方法(构造器) 的最前面其实隐含了 super()和 调用普通代码块。

class Person{
    public Person(){
        super();
        //调用普通代码块
        System.out.println("Person");
    }
}

静态相关的代码块,属性初始化,在类加载时,就执行完毕, 因此是优先于 构造器和普通代码块执行的。

静态代码块只能直接调用静态成员,普通代码块可以调用任意成员。(因为在静态代码块执行时,只有静态成员已经被加载了)

对象加载顺序案例

package codeBlock;

public class Extends_blockTest {

    public static void main(String[] args) {
        new C();
    }

}
class A{
    
    private String name = nameA();
    private static int age = ageA();
    
    static {
        System.out.println("A .... static Block");
    }
    
    {
        System.out.println("A .... ordinary Block");
    }
    
    public String nameA() {
        System.out.println("A .... ordinary Args");
        return "AAA";
    }
    
    public static int ageA() {
        System.out.println("A .... static Args");
        return 18;
    }

    public A() {
        System.out.println("A .... constructor");
    }
}

class B extends A{
    
    static {
        System.out.println("B .... static Block");
    }
    
    private String name = nameB();
    private static int age = ageB();
    

    {
        System.out.println("B .... ordinary Block");
    }
    
    public String nameB() {
        System.out.println("B .... ordinary Args");
        return "BBB";
    }
    
    public static int ageB() {
        System.out.println("B .... static Args");
        return 18;
    }

    public B() {
        System.out.println("B .... constructor");
    }
}

class C extends B{
    private String name = nameC();
    private static int age = ageC();
    
    static {
        System.out.println("C .... static Block");
    }
    
    {
        System.out.println("C .... ordinary Block");
    }
    
    public String nameC() {
        System.out.println("C .... ordinary Args");
        return "CCC";
    }
    
    public static int ageC() {
        System.out.println("C .... static Args");
        return 18;
    }

    public C() {
        System.out.println("C .... constructor");
    }

}

输出结果

A .... static Args

A .... static Block

B .... static Block

B .... static Args

C .... static Args

C .... static Block

A .... ordinary Args

A .... ordinary Block

A .... constructor

B .... ordinary Args

B .... ordinary Block

B .... constructor

C .... ordinary Args

C .... ordinary Block

C .... constructor

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多