源码:


输出结果:

在main方法中打印出来new出来的那个实例对象的地址是
student.Xx@7b1d7fff
在new实例化对象的时候,调用构造函数时打印出来的
this
也是student.Xx@7b1d7fff
打印出来成员方法中的
this
也是student.Xx@7b1d7fff
。
综上,new关键字应该是先执行的,作用是根据类
开辟堆内存空间,创建出来对象的引用就是student.Xx@7b1d7fff
,而调用构造方法时,通过this关键字访问的属性并不是类中的属性,而是实例化的那个对象中的属性(此时该对象属性为初始值),构造函数的作用就是对new出来的那个对象的属性进行初始化。以为this指向的是创建出来的那个堆内存空间,所以如果在静态方法中访问this会出现这样一个问题,类是由JVM生成的,生成类后类的静态方法就可以访问了,因为this总是指向新开辟的那个堆内存空间,此时并没有调用new关键字开辟内存空间,所以JVM创建一个类后,静态方法中的this并没有明确指向,这样再通过this调用,逻辑就会出错。这也是为什么编译时,静态方法中不允许出现this关键字的原因。
***记住一点,this总是指向new出来的那个堆内存空间就行了。
网友评论