周六上午没课,周日休,周一清明节
做了两件事:
一.用时间堆出来记忆方式,不想给自己增加记忆负担。
二.继续梳理单步调试加载类的跳转过程(插曲:理解了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类的静态成员初始化结束
有输出
<3>在Homework类中:
(静态成员初始化结束)
开始执行main()方法 <24行>print输出
<25行>注释
<26行>创建一个Person类对象,单参数构造方法。加载Person类到方法区。
<4>在Person类中:
从类头开始向下找静态成员声明或赋值语句。找到静态成员声明语句。
静态成员初始化:创建一个Student类的对象s,构造方法是空参数构造方法
跳转到Student类
(Person类的静态成员初始化没结束)
<5>在Student类中:
(不再加载Student类、不再初始化Student类的静态变量)
开始创建Student类对象s,找到空参数构造方法,暂时不执行。
从类头开始向下执行普通成员变量位置的代码
普通成员位置:成员变量赋值语句 age赋值10
构造代码块中语句 print输出
age赋值20
返回到构造方法:空参数默认构造方法 print输出
构造方法中语句全部执行完
结束创建Student类对象s
有输出
<6>回到Person类中
Person类静态成员s初始化结束。Person类加载结束
(不再加载Person类、不再初始化Person类的静态变量)
开始创建Person类的对象p,用单参数name构造方法。找到单参数name构造方法,暂时不执行。
从类头开始向下执行普通成员变量位置的代码
普通成员位置:构造代码块中语句 name赋值赵云
print输出
成员变量赋值语句 name赋值曹操
返回到构造方法:单参数name构造方法 print输出
this对象name赋值刘备(来自main()中传递)
构造方法中语句全部执行完
结束创建Person类对象p
有输出
<7>回到main()函数中
print输出
类Person的对象p属性name,name=刘备
有输出
跳转偶尔还是会弄混,需要参考博客:
https://blog.csdn.net/SakuraKagetsu/article/details/87076876