美文网首页
Java基础提升1

Java基础提升1

作者: 努力的土豆 | 来源:发表于2019-03-20 20:42 被阅读0次

从今天开始进行基本功的提升,(本人很菜,写的可能不好,欢迎大家提出意见,此外,引用别人的东西,我会全部标识出),我不知道,这个过程会什么时候结束,总之,我会努力的把这个过程记录下来。不想提升技术的程序员不是好程序员

Java 静态代码块,构造代码块,构造函数

/**
 * @ClassName: TestA
 * @Description: TODO
 * @Author: kevin
 * @Date: 2019-03-20 19:24
 * @Version: 1.0
 **/
public class TestA {

    static int value = 1;

    static {
        System.out.println("This is TestA 静态代码块");
        value++;
        System.out.println(value);
    }

    {
        System.out.println("This is TestA 构造代码块");
    }
    public TestA() {
        System.out.println("This is TestA 无参构造函数");
    }

    public TestA(String str) {
        System.out.println("This is TestA 有参构造函数: str = " + str);
    }

    public static void main(String[] args) {
        System.out.println("===============");
        TestA a = new TestA();
        System.out.println("---------------");
        TestA b = new TestA("B");
    }
    
    static {
        value *= 2;
        System.out.println(value);
    }
}

这里通过一段简单的代码,引入今天的内容。首先简单了解标题中的各个概念

静态代码块

  1. 用static声明,每个静态代码块只会执行一次,在JVM加载类的时候会执行静态代码块,注意优先于主函数
  2. 静态代码块负责初始化类,因此不能存在于任何方法体内,不存在被对象调用
  3. 静态代码块可以有多个,其执行顺序是,先定义,先执行。

构造代码块

  1. 用{}声明,构造代码块的作用是给对象进行初始化。
  2. 和静态代码块不同,构造代码块在创对象时被调用,因此,调用次数可能不止一次,也仅仅只能被对象调用,且执行顺序优先于构造函数。
  3. 构造代码块的作用是给所有对象进行统一的初始化,因为优先级高于构造函数。

构造函数

  1. 创建对象时,就会调用对应的构造函数,注意实际中构造函数可能不止一个,因此调用不同的构造函数,就会初始化不同实例对象。
  2. 对象创建时,构造函数只能调用一次。
  3. 同构造代码块一样,只能被对象调用,不能被类调用。

通过概念的介绍就会清晰地知道上述代码的运行结果

This is TestA 静态代码块
2
4
===============
This is TestA 构造代码块
This is TestA 无参构造函数
---------------
This is TestA 构造代码块
This is TestA 有参构造函数: str = B

静态变量,静态代码块,变量,构造代码块,构造函数,执行的顺序

静态变量,静态代码块 > 变量,构造代码块 > 构造函数

/**
 * @ClassName: TestB
 * @Description: TODO
 * @Author: kevin
 * @Date: 2019-03-20 20:06
 * @Version: 1.0
 **/
public class TestB {
    public static String staticZone = "这是静态变量";

    public String variable;

    public String variable2 = "haha";

    static {
        System.out.println("这是静态代码块");
        System.out.println(staticZone);
    }

    {
        System.out.println("这是构造代码块");
        System.out.println(variable);
        System.out.println(variable2);
        System.out.println(staticZone);
    }

    public TestB() {
        System.out.println("这是无参构造函数");
    }

    public TestB(String str) {
        System.out.println("This is TestB 有参构造函数: str = " + str);
    }

    public static void main(String[] args) {
        System.out.println("========");
        TestB a = new TestB();
        System.out.println("--------");
        TestB b = new TestB("B");
    }
}

运行结果

这是静态代码块
这是静态变量
========
这是构造代码块
null
haha
这是静态变量
这是无参构造函数
--------
这是构造代码块
null
haha
这是静态变量
This is TestB 有参构造函数: str = B

继承时,执行顺序

  1. 执行父类静态代码块,并初始化父类的静态成员变量
  2. 执行子类静态代码块,并初始化子类的静态成员变量
  3. 依次执行父类的构造代码块,构造函数,并初始化父类普通的成员变量
  4. 依次执行子类的构造代码块,构造函数,并初始化子类普通的成员变量
/**
 * @ClassName: A
 * @Description: TODO
 * @Author: kevin
 * @Date: 2019-03-20 20:28
 * @Version: 1.0
 **/
public class A {

    static {
        System.out.println("This is A 静态代码块");
    }

    {
        System.out.println("This is A 构造代码块");
    }
    public A() {
        System.out.println("This is A 无参构造函数");
    }

    public A(String str) {
        System.out.println("This is A 有参构造函数: str = " + str);
    }

}


/**
 * @ClassName: B
 * @Description: TODO
 * @Author: kevin
 * @Date: 2019-03-20 20:30
 * @Version: 1.0
 **/
public class B extends A {

    static {
        System.out.println("This is B 静态代码块");
    }

    {
        System.out.println("This is B 构造代码块");
    }
    public B() {
        System.out.println("This is B 无参构造函数");
    }

    public B(String str) {
        System.out.println("This is B 有参构造函数: str = " + str);
    }

    public B(String str, int tmp) {
        super(str);
        System.out.println("This is B 有参构造函数: str = " + str + " tmp = " + tmp);
    }

    public static void main(String[] args) {
        System.out.println("===============");
        B a = new B();
        System.out.println("---------------");
        B b = new B("B");
        System.out.println("---------------");
        B C = new B("C", 6);
    }
}

执行结果,注意实例对象c的执行过程有别于实例对象b。

This is A 静态代码块
This is B 静态代码块
===============
This is A 构造代码块
This is A 无参构造函数
This is B 构造代码块
This is B 无参构造函数
---------------
This is A 构造代码块
This is A 无参构造函数
This is B 构造代码块
This is B 有参构造函数: str = B
---------------
This is A 构造代码块
This is A 有参构造函数: str = C
This is B 构造代码块
This is B 有参构造函数: str = C tmp = 6

参考文章链接
Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序
Java普通代码块,构造代码块,静态代码块区别,执行顺序的代码实例

相关文章

  • Java基础提升1

    从今天开始进行基本功的提升,(本人很菜,写的可能不好,欢迎大家提出意见,此外,引用别人的东西,我会全部标识出),我...

  • 面试题汇总

    1.Java基础面试问题 Java基础之基础问题 Java基础之面向对象 Java基础之数据结构 Java基础之I...

  • 简述JavaEE学习流程

    1,Java基础 Java基础也就是JavaSE,Java SE(Java Platform, Standard ...

  • Java基础:注解

    系列阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 1. 概述 注解...

  • Java基础面试大全

    Java基础面试 Java基础面试... 1 1. Java基础知识... 5 1.1. Java源程序的扩展名是...

  • Java基础:类加载器

    系列阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 1. 什么是类加...

  • 在Alibaba广受喜爱的“Java突击宝典”简直太牛了

    0-1年:夯实基础 1.Java基础(Java异常分类及处理+Java反射+Java注解+Java内部类+Java...

  • Java全套学习资料

    Java基础 1-1 就业课(2.0)-Java基础语法 第1节java运行环境 第2节HelloWorld案例 ...

  • java接口及其新特性——Java基础回炉(三)

    前言 本文是Java基础回炉文集的第三篇,关于文集可通过《Java基础回炉和提升暨文集开篇》了解。 今天我们将从接...

  • java基础提升篇

    此篇幅是个人整理的一点心得,针对的广大的普通大众人员,还有此篇文章的出发点是从先就业后择业的角度去分析java程序...

网友评论

      本文标题:Java基础提升1

      本文链接:https://www.haomeiwen.com/subject/iswtvqtx.html