This引用和对象的构造以及初始化

Posted ohana!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了This引用和对象的构造以及初始化相关的知识,希望对你有一定的参考价值。

一,this引用

java编译器给每个成员方法增加了一个隐藏的引用类型参数,该参数指向当前对象(即就是成员方法运行时调用该成员方法的对象),该引用存在于所有成员方法中对成员变量的操作,对于用户来说是不需要添加的,编译器自动完成相应的操作

举个栗子:创建一个时间类

public class Date {
    public int year;
    public int month;
    public int day;

    public void setDate(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }
    public void printDate(){
        System.out.println(year + "-" + month + "-" + day);
    }

    public static void main(String[] args) {
        Date date = new Date();
        date.setDate(2021,9,14);
        date.printDate();
    }
}

让程序以debug方式运行,从监视窗口观察

我在将隐藏的this引用添加上,发现代码并未报错,而且可以正常运行

 

证明确实有隐藏的this并且在对象调用方法时自动添加,在编写程序时并不需要手动添加,但即使手动添加也不影响程序

this引用的特性:

  1. 哪个对象调用就是哪个对象的引用类型
  2. “this”引用只能在‘成员方法’中使用
  3. 在成员方法中,只能引用当前对象,而不能引用其他对象,具有final属性
  4. this引用可以为空,编译可以通过,但是运行会报错

 

 报了一个指针异常的错误(java.lang.NullPointerException)

二,对象的构造以及初始化

构造方法

构造方法也称为构造器,是一个特殊的成员方法,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次

  1. 名字与类名相同,没有返回值类型,即使设置为void也不行

    也会正常运行

     若添加void或者其他返回值类型

  2. 一般情况下用public来修饰
  3. 在创建对象时系统自动调用,并且在整个对象的生命周期内只调用一次
    public Date(){
            this.year = 2000;
            this.month = 3;
            this.day = 10;
            System.out.println(this.year + "-" + this.month + "-" + this.day);
            System.out.println("我是无参构造方法");
        }
    public Date(int year, int month, int day) {
            this.year = year;
            this.month = month;
            this.day = day;
            System.out.println(this.year + "-" + this.month + "-" + this.day);
            System.out.println("我是含有三个参数的构造方法");
        }

     

  4. 构造方法的作用就是给成员进行初始化,不负责开辟空间
  5. 构造方法可以重载(名字相同,参数列表不同)

    在(2)中的两个构造方法就是重载

  6. 如果用户没有显式定义,系统会自动生成,并且一定是无参的
    public class TestDate {
        public int year;
        public int month;
        public int day;
    
        public void printTestDate(){
            System.out.println(this.year + "-" + this.month + "-" + this.day);
        }
    
        public static void main(String[] args) {
            TestDate date = new TestDate();
            date.printTestDate();
        }
    }

     当用户不显式定义的时候,系统自动生成无参的构造方法

  7. 在构造方法中可以通过调用this来简化代码(但this引用必须是第一条语句,而且不能形成递归调用)
    public class TestDate {
        public int year;
        public int month;
        public int day;
    
        public TestDate(){
            System.out.println("我是无参构造方法!");
        }
    
        public TestDate(int year, int month, int day) {
            this();
            this.year = year;
            this.month = month;
            this.day = day;
        }
    }

如果this语句不是第一句的情况下,系统会自动报错,说,this引用必须是第一条

this成环调用的话,会报一个”递归构造器的调用“的错误

三,初始化

在Java中,当定义了一个局部变量,必须要初始化,但在之前的成员变量中,我们并没有初始化,之所以会编译通过,是因为程序背后,在JVM层面做了好多事情

默认初始化

  1. 检测对象对应的类是否加载
  2. 为对象分配内存空间
  3. 处理并发安全问题
  4. 初始化分配的空间(此时对象空间被申请好后,对象中的成员已经被设置好了初始值)比如:byte  ---->   0  char ---->  '\\u0000' 等等
  5. 设置对象头信息
  6. 调用构造方法给对象中的各个成员赋值

就地初始化

即就是在声明成员变量时,直接给了初始值

public int year = 2000;
public int month = 3;
public int day = 10;

以上是关于This引用和对象的构造以及初始化的主要内容,如果未能解决你的问题,请参考以下文章

Java SE基础巩固

对各类知识点的回顾

java的this关键字理解

类和对象

java的初始化与清理

对象的this引用