子类、继承与代码块
代码块
1.普通代码块:是最常见的代码块,在方法里用一对“{}”括起来的数据,就是普通的代码块。 如:
public ClassA() {
System.out.println("this is class A");
}
- 构造代码块:是在类中直接定义的,用“{}”括起来的代码。每次调用构造方法前执行,都会先执行构造代码块。如:
public class ClassA {
public ClassA() {
System.out.println("this is class A");
}// 普通代码块
{ System.out.println("Class A"); } // 构造代码块
}
- 静态代码块:他在类中的成员位置,用“{}”括起来的代码。只不过他用了static修饰了,且只执行一次
public class ClassA {
public ClassA() {
System.out.println("this is class A");
}// 普通代码块
{ System.out.println("Class A"); } // 构造代码块
static { System.out.println("Class A Static "); } // 静态代码块
}
子类、继承与代码块 调用顺序
父类ClassA
public class ClassA {
public ClassA() {
System.out.println("this is class A");
}
{
System.out.println("Class A");
}
}
子类ClassB
public class ClassB extends ClassA{
public ClassB() {
System.out.println("this is class B");
}
{
System.out.println("Class B");
}
public static void main(String[] args) {
new ClassB();
}
结果
Class A
this is class A
Class B
this is class B
总结
1、构造代码块 先执行, 再依据 先父类再子类的顺序执行
2、父类 构造代码块,父类构造函数
3、子类 构造代码块,子类构造函数
子类、继承与静态代码块 调用顺序
父类
public class ClassA {
public ClassA() {
System.out.println("this is class A");
}
{
System.out.println("Class A");
}
static {
System.out.println("static ClassA code");
} // 新增的静态代码块
}
子类
public class ClassB extends ClassA{
public ClassB() {
System.out.println("this is class B");
}
{
System.out.println("Class B");
}// 构造代码块
static {
System.out.println("static ClassB code");
}// 静态代码块
public static void main(String[] args) {
new ClassB(); //
}
}
输出结果
static ClassA code
static ClassB code
Class A
this is class A
Class B
this is class B
总结2
1、static静态代码块 先执行, 再依据 先父类再子类的顺序执行
2、父类 构造代码块,父类构造函数
3、子类 构造代码块,子类构造函数
搞个复杂一点的
父类
public class ClassA {
static {
System.out.println("第一个 static ClassA ");
}
{
System.out.println("第一个Class A构造代码块");
}
public ClassA() {
System.out.println("this is class A");
}
{
System.out.println("第二个Class A 构造代码块");
}
static {
System.out.println("第二个static ClassA code");
}
}
子类
public class ClassB extends ClassA{
static {
System.out.println("第一个 static ClassB ");
}
{
System.out.println("第一个Class B构造代码块");
}
public ClassB() {
System.out.println("this is class B");
}
{
System.out.println("第二个Class B 构造代码块");
}
static {
System.out.println("第二个static ClassB code");
}
public static void main(String[] args) {
{
System.out.println(" main的构造代码块");
}
new ClassB();
}
}
输出结果:
第一个 static ClassA
第二个static ClassA code
第一个 static ClassB
第二个static ClassB code
main的构造代码块
第一个Class A构造代码块
第二个Class A 构造代码块
this is class A
第一个Class B构造代码块
第二个Class B 构造代码块
this is class B
改动下 main函数
public static void main(String[] args) {
{
System.out.println(" main的构造代码块");
}
new ClassB();
System.out.println("------ 分界线-------");
new ClassA();
new ClassB();
}
输出结果:
第一个 static ClassA
第二个static ClassA code
第一个 static ClassB
第二个static ClassB code
main的构造代码块
第一个Class A构造代码块
第二个Class A 构造代码块
this is class A
第一个Class B构造代码块
第二个Class B 构造代码块
this is class B
------ 分界线-------
第一个Class A构造代码块
第二个Class A 构造代码块
this is class A
第一个Class A构造代码块
第二个Class A 构造代码块
this is class A
第一个Class B构造代码块
第二个Class B 构造代码块
this is class B
总结3
他会执行父类classA类下的静态块,再子类ClassB,在执行main方法,然后执行代码,静态的只执行一次,构造方法块每次都执行
进一步看static 静态代码块
//在上面基础上只修改main函数,无new 类
public static void main(String[] args) {
System.out.println("------ 空执行main函数-------");
}
输出结果:
第一个 static ClassA
第二个static ClassA code
第一个 static ClassB
第二个static ClassB code
------ 空执行main函数-------
总结4
static 代码在类加载的时候,就执行了。