前言
▲▲▲我是一个学生,不是大学生,现在疫情开学了,每日的时间比较少▲▲▲
▲▲因此平日只能写一写短小的时间较少的文章▲▲
☺☺☺作者周末会记录写一些长文☺☺☺
∷新人榜单在榜∷
◑◑大号也差不多这个名字◑◑
…最后感谢大家的支持与关注,如果大家又什么意见或者建议可以找作者…
√大家如果觉得作者还不错的话,还请给作者一个关注。
目录
三,我们如果调用实例AA aa = new AA();,输出又是怎样的?
四,我们知道了AA aa = new AA();的输出,那么它为什么这样输出呢?
代码块的基本介绍
代码块又称为初始化块,属于类中的成员【即 类中的一部分】,类似于方法,将逻辑语句,封装在方法体之中,通过{}包围起来。
但与方法不同的是,没有参数,没有方法名,没有返回,只有方法体,而且不用通过对象或类显示调用,而是加载类的时候,或者创建对象的时候隐式调用。
注意事项:
1.修饰符 可以选择 如果要写也只能写 static
2.代码块分为两类,使用static 修饰的叫做静态代码块,没有static修饰的叫做普通代码块或非静态代码块。
3.;可以写也可以省略。
细节讨论
package demo01;
public class demo9 {
public static void main(String[] args) {
//类被加载的情况举例
//创建对象实例时(new)
//AA aa = new AA();因为AA类是BB类的子类,所以类加载的时候先加载AA类的主类BB,然后再加载AA类
//2.创建子类对象实例,父类也会被加载,而且父类先被加载,子类后被加载
//AA aa2 = new AA();
//3.使用类的静态成员时(静态属性,静态方法)
// System.out.println(Cat.n1);//这里很有趣,public static int n1 = 999;//静态属性,放在主类和父类的运行情况不同
//static 代码块,是在类加载时执行的,而且只会执行一次。
// DD dd = new DD();
// DD dd1 = new DD();
//普通代码块,在创建实例对象时,会被隐式的调用
//被创建一次,就会调用一次
//如果只是使用类的静态成员时,普通代码并不会被调用
System.out.println(DD.n1);//8888 静态模块块一定会被执行
}
}
class DD{
public static int n1 = 8888;
//静态代码块
static {
System.out.println("DD的静态代码块1被执行...");
}
//普通代码块,在new对象时,被调用,而且是每创建一个对象就调用一次。
//可以这样简单理解,普通代码块是构造器的补充
{
System.out.println("DD的普通代码块...");
}
}
class Animal {//主类
//静态代码块
static {
System.out.println("Animal 的静态代码块1被执行...");
}
}
class Cat extends Animal{//父类
public static int n1 = 999;//静态属性
//静态代码块
static {
System.out.println("Cat 的静态代码块1被执行");
}
}
class BB{
//静态代码块
static {
System.out.println("BB的静态代码块1被执行...");//1
}
}
class AA extends BB {//因为AA类是BB类的子类
//静态代码块
static {
System.out.println("AA的静态代码块1被执行.....");
}
}
举例分析:
我们分析一下,AA aa = new AA();
一,类什么时候被加载呢?
情况一:创建实例对象时(new)
情况二:创建子类对象实例,父类也会被加载。
情况三:使用类的静态成员时(静态属性,静态方法)
二,我们上面的代码中有几个类?他们的关系又是怎样的?
我们分析可以知道:在上述的代码中一共有五个类,它们按照代码中的顺序分别为,DD,Animal,Cat,BB,AA。其中,Cat 继承Animal,其中Animal为主类,Cat为子类。AA继承BB其中AA为子类
BB为父类。
三,我们如果调用实例AA aa = new AA();,输出又是怎样的?
输出结果:BB的静态代码块1被执行...
AA的静态代码块1被执行.....
四,我们知道了AA aa = new AA();的输出,那么它为什么这样输出呢?
因为我们创建实例AA aa = new AA();,我们需要知道的是,普通的代码块,在创建对象实例时,会被隐式调用,被创建一次就会调用一次。如果只是使用类的静态成员时,普通代码块并不会执行。
在上面的代码中
因为AA类是BB类的子类,所以类加载的时候先加载AA类的主类BB,先输出主类的内容,然后再加载输出子类AA。