Java学习-小白入门

子类、继承与代码块

2019-01-23  本文已影响0人  天马行空爱做梦

代码块

1.普通代码块:是最常见的代码块,在方法里用一对“{}”括起来的数据,就是普通的代码块。 如:

public ClassA() {
System.out.println("this is class A");
}

  1. 构造代码块:是在类中直接定义的,用“{}”括起来的代码。每次调用构造方法前执行,都会先执行构造代码块。如:

public class ClassA {
public ClassA() {
System.out.println("this is class A");
}// 普通代码块
{ System.out.println("Class A"); } // 构造代码块
}

  1. 静态代码块:他在类中的成员位置,用“{}”括起来的代码。只不过他用了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 代码在类加载的时候,就执行了。

上一篇 下一篇

猜你喜欢

热点阅读