美文网首页
对象的创建过程-实例变量与代码块实例初始化(二)

对象的创建过程-实例变量与代码块实例初始化(二)

作者: 小尾巴1024 | 来源:发表于2019-03-26 16:51 被阅读0次

1、我们在定义或声明实例变量的时候,可以通过为实例变量赋值或是通过代码块赋值,如果我们以这两种方式对实例变量进行初始化,那这两种初始化方式将会在构造函数执行前先执行。
实际上,如果我们对变量直接赋值或是通过代码块对其赋值,那么编译器会将其中的代码放到类的构造函数中去,
并且这些代码会被放在对超类构造函数的调用语句之后 (java要求构造函数的第一条语句必须是超类构造函数的调用语句),构造函数本身代码之前 。如下例子:

public class Student {
    /**
     * 对变量直接赋值会在构造函数执行前先执行
     */
    private int num1 = 1;
    private int num2 = num1+1;
    public Student(int var) {
        System.out.println(num1);
        System.out.println(num2);
        this.num1 = var;
        System.out.println(num1);
        System.out.println(num2);
    }
    /**
     * 代码块会在构造函数执行前先执行
     */
    {
        num2 += 3;
    }
    public static void main(String[] args) {
        new Student(8);  //输出1、5、8、5
    }
}

2、需要注意的是java是按照编程顺序来执行实例变量初始化器和实例变量初始化器中的代码的,并且不允许执行顺序靠前的实例代码块初始化在顺序靠后的实例变量。如下:

public class Student {
    {
        j = i;  //编译不通过
    }
    private int i = 1;
    private int j;
}
public class Student {
    private int j = i;   //编译不通过
    private int i = 1;
}

上面两种情况编译都不通过。编译是会提示我们使用一个未经定义的变量。之所以这么做是因为要保证一个变量在使用之前已经被初始化。
但是我们仍然可以避开这种语法检查。如下:

public class Student {
    private int j = getI();
    private int i = 1;

    public Student() {
        i = 2;
    }

    public int getI() {
        return i;
    }
    public static void main(String[] args) {
        Student stu = new Student();
        System.out.println(stu.j);   //输出0,可以知道j被赋予了i的默认值0,并且该操作发在实例i初始化之前和构造函数执行前
    }
}

参考:https://blog.csdn.net/justloveyou_/article/details/72466416

相关文章

  • 自整理1

    1.java类的实例的初始化过程: 静态变量->静态代码块->main->实例变量->实例初始化块->构造器 加载...

  • 对象的创建过程-实例变量与代码块实例初始化(二)

    1、我们在定义或声明实例变量的时候,可以通过为实例变量赋值或是通过代码块赋值,如果我们以这两种方式对实例变量进行初...

  • Objective-C实例变量的操作

    对象实例变量的操作 • 实例变量在初始化只做少量设置,如果在程序运行过程中需要设置我们需要对实例变量@public...

  • Python中的__init__/__new__/__call_

    __new__创建类的实例,用于控制新实例的创建 __init__ 用于new创建实例后,初始化实例变量 __ca...

  • Singleton单例模式详解

    饿汉式 直接创建实例对象,不管是否需要这个对象,都会创建,线程安全 直接实例化 枚举 静态代码块 懒汉式

  • 面向对象编程

    面向对象编程 一段完整的创建类的示例 使用关闭包定义静态私有变量与方法,所有实例创建过程中都能访问到 创建实例时,...

  • Java构造函数垃圾回收this笔记

    构造函数 用处:初始化类定义的实例变量、执行其他创建完整对象所需的启动过程 示例:class Myclass{ i...

  • python类的一些相关操作

    创建类 创建对象(实例) 创建变量 删除变量 修改变量 查看变量 类变量只能被实例查看而不能修改和删除

  • 利用for循环动态,快速创建UI控件

    利用for循环动态,快速创建UI控件 第一步 创建控件实例变量 用数组保存: 第二步 初始化实例变量 给定地址空间...

  • python 标准库学习笔记《四》

    魔术方法 __ new __ 创建实例对象 __ init __ 将传入的参数用于初始化实例对象 Notes:...

网友评论

      本文标题:对象的创建过程-实例变量与代码块实例初始化(二)

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