Day06+周日周一 (提炼记忆点:加载类、创建对象、静态成员初始化、成员变量赋值、构造方法)

周六上午没课,周日休,周一清明节

做了两件事:

一.用时间堆出来记忆方式,不想给自己增加记忆负担。

二.继续梳理单步调试加载类的跳转过程(插曲:理解了java传值,在此暂时不写)

下面是正文

 

一.压缩记忆点:

1.类加载改称:

加载类

改成动宾结构。类似的,创建对象、初始化静态变量、执行代码块。

2.关于加载类、创建对象过程中,静态成员变量、成员变量赋值、代码块的改称:

静态成员变量:不要用英文static,就说中文静态二字;不要说静态、非静态,非静态就两种(成员变量赋值语句、代码块)

成员变量:不要说普通成员变量,就简称成员变量。代码是英文写的,手打字感觉区别就是有没有static关键字在前面

代码块:不要说构造代码块,就简称代码块,是大括号包起来的语句。里面一般是给成员变量赋值的语句、给静态成员变量赋值的语句

构造方法:不要说构造器,就说构造方法,因为这个就是一个类似函数的代码块。

必须统一了,刚开始要建立自信,必须抓住主要内容先建立体系,每次梳理记忆点只能最多3个。所以对于自己觉得同样内容的名字,保留一个,然后赶紧对应到代码

二.单步调试加载类代码:

package com.xy.java.day06.oop2_block_homeworkroot;

/**
 * @program: day06_javase_oop2_block
 * @description: 尝试理清
 * @author: [email protected]
 * @create: 2021-04-03 14:10
 **/

/**
 * 问题1: 思考注释一能否放开?会不会报错?这样书写格式好不好?怎么写可读性最好?
 * 答:可以放开,不报错。
 * 这样格式不好,通过s对象访问Student类的成员变量,最好写成通过类名点访问类的成员变量,就是:
 * //System.out.println(s.age); 注释一
 * 改成:System.out.println(Homework.s.age);
 * 自己代码里包含main()方法的类名是Exercise01,那就改成Exercise01.s.age
 *
 * 问题2: 思考控制台输出的顺序,并用文字描述它,需要说明原因
 *
 * 问题3: Homework building和Homework constructor会不会输出,为什么?
 * 答:因为没有创建Homework类对象。
 * 只有创建类对象,才能进行后续步骤:
 * 1.找到构造方法
 * 2.不执行静态变量赋值语句,首次类加载定义的静态变量
 * 3.执行成员位置的:
 * ​	(1)成员变量初始化语句
 * ​	(2)成员代码块的构造代码块中的给成员变量赋值的语句
 * 4.最后执行构造方法中的语句
 * 
 */

public class Exercise01 {
    //
    static Student s = new Student();
    {
        System.out.println("Homework building");
        s = null;
    }
    public static void main(String[] args) {
        //Exercise01 ex = new Exercise01();
        System.out.println("main");
        //System.out.println(Exercise01.s.age); //注释一
        Person p = new Person("刘备");
        System.out.println(p.name);
    }

    public Exercise01() {
        System.out.println("Homework constructor");
    }
}
class Person{
    {
        name = "赵云";
        System.out.println("Person building");
    }
    String name = "曹操";
    static Student s = new Student();

    public Person() {
    }

    public Person(String name) {
        System.out.println("Person constructor");
        this.name = name;
    }
}

class Student{
    int age = 10;
    {
        System.out.println("Student building");
        age = 20;
    }

    public Student(int age) {
        this.age = age;
    }

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

问题2: 思考控制台输出的顺序,并用文字描述它,需要说明原因

<1>在Homework类中:

调用main()方法,首先需要对main()所属的Homework类加载。

从类头开始向下找静态成员声明或赋值语句。找到静态成员声明语句。

静态成员初始化:创建一个Student类的对象,构造方法是空参数构造方法。加载Student类到方法区。

跳转到Student类头

(静态成员初始化没结束)

无输出

<2>在Student类中:

从类头开始向下找静态成员声明或赋值语句。没有找到静态成员。Student类中静态成员初始化结束。

开始创建Student类对象,找到空参数构造方法,暂时不执行。

从类头开始向下执行普通成员变量位置的代码

普通成员位置:成员变量赋值语句 age赋值10

构造代码块中语句 print输出

age赋值20

返回到构造方法:空参数默认构造方法 print输出

构造方法中语句全部执行完

结束创建Student类对象s,从而Homework类的静态成员初始化结束

有输出

Day06+周日周一 (提炼记忆点:加载类、创建对象、静态成员初始化、成员变量赋值、构造方法)_第1张图片

Day06+周日周一 (提炼记忆点:加载类、创建对象、静态成员初始化、成员变量赋值、构造方法)_第2张图片

 

 

<3>在Homework类中:

(静态成员初始化结束)

开始执行main()方法 <24行>print输出

<25行>注释

<26行>创建一个Person类对象,单参数构造方法。加载Person类到方法区。

Day06+周日周一 (提炼记忆点:加载类、创建对象、静态成员初始化、成员变量赋值、构造方法)_第3张图片

 

<4>在Person类中:

从类头开始向下找静态成员声明或赋值语句。找到静态成员声明语句。

静态成员初始化:创建一个Student类的对象s,构造方法是空参数构造方法

跳转到Student类

(Person类的静态成员初始化没结束)

<5>在Student类中:

(不再加载Student类、不再初始化Student类的静态变量)

开始创建Student类对象s,找到空参数构造方法,暂时不执行。

从类头开始向下执行普通成员变量位置的代码

普通成员位置:成员变量赋值语句 age赋值10

构造代码块中语句 print输出

age赋值20

返回到构造方法:空参数默认构造方法 print输出

构造方法中语句全部执行完

结束创建Student类对象s

有输出

Day06+周日周一 (提炼记忆点:加载类、创建对象、静态成员初始化、成员变量赋值、构造方法)_第4张图片

Day06+周日周一 (提炼记忆点:加载类、创建对象、静态成员初始化、成员变量赋值、构造方法)_第5张图片

 

 

<6>回到Person类中

Person类静态成员s初始化结束。Person类加载结束

(不再加载Person类、不再初始化Person类的静态变量)

开始创建Person类的对象p,用单参数name构造方法。找到单参数name构造方法,暂时不执行。

从类头开始向下执行普通成员变量位置的代码

普通成员位置:构造代码块中语句 name赋值赵云

print输出

成员变量赋值语句 name赋值曹操

返回到构造方法:单参数name构造方法 print输出

this对象name赋值刘备(来自main()中传递)

构造方法中语句全部执行完

结束创建Person类对象p

有输出

Day06+周日周一 (提炼记忆点:加载类、创建对象、静态成员初始化、成员变量赋值、构造方法)_第6张图片

 

<7>回到main()函数中

print输出

类Person的对象p属性name,name=刘备

有输出

 

Day06+周日周一 (提炼记忆点:加载类、创建对象、静态成员初始化、成员变量赋值、构造方法)_第7张图片

跳转偶尔还是会弄混,需要参考博客:

https://blog.csdn.net/SakuraKagetsu/article/details/87076876

你可能感兴趣的:(Java)