码迷,mamicode.com
首页 > 其他好文 > 详细

this关键字详解

时间:2021-01-01 12:56:30      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:重复   private   对象   class   之间   pre   mic   public   com   

this关键字代指当前对象,可在方法中区分全局变量和局部变量

public class ThisTest {

    private int age;

    public ThisTest(){
        System.out.println("我是空参");
    }

    public ThisTest(int age){
        this.age = age;
        System.out.println("我是实参");
    }
}

this关键字除了可以区分变量,还可以在构造函数中被调用,减少构造函数中重复的代码

public class ThisTest {

    private int age;

    public ThisTest(){
        System.out.println("我是空参");
    }

    public ThisTest(int age){
        //调用空参构造函数
        this();
        this.age = age;
        System.out.println("我是实参");
    }

    public static void main(String[] args) {
        new ThisTest(12); //先打印‘我是空参‘,再打印‘我是实参‘
    }
}

在类加载的过程中,会生成两个方法,一个是clinit()方法,用来初始化静态变量;另一个是init()方法,在new 对象的时候被调用,默认是空参构造函数,那么,如果有多个构造函数,并且又面临在构造函数中调用其他构造函数方法的情况,init()方法如何生成?

还是使用ThisTest类来验证:

public class ThisTest {

    private int age;

    public ThisTest(){
        System.out.println("我是空参");
    }

    public ThisTest(int age){
        this();
        this.age = age;
        System.out.println("我是实参");
    }

    public static void main(String[] args) {
        new ThisTest(12);
    }
}

使用jclasslib反编译得到:

技术图片

可见生成的字节码里面有两个init()方法,所以可以得知,当Java前端编译器(也就是我们经常说的编译器)把文件进行编译后,会针对不同的构造函数生成不同的init()方法,声明了多少个构造函数就生成多少个重载的init()方法

再看反编译后的方法的调用指令:

技术图片

可以看出构造方法之间的调用编译过后就是生成的init()方法的调用!!!

this关键字详解

标签:重复   private   对象   class   之间   pre   mic   public   com   

原文地址:https://www.cnblogs.com/muhexiong/p/14203028.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!