java再复习——this的真正意义以及方法区的方法信息与对象的方法是如何产生关联的
2017-02-22 15:12
405 查看
this关键字:指代当前调用某方法的实际对象
this关键字最常用场景:
public class Student {
String name;
public Student(String name) {
this.name = name;
}
}
在同名的情况下,用来区分是局部变量还是对象的全局变量,当然还有其他场景,比如this()调用本类的其他构造方法,或者其他方法等等吧。
我们也知道,其实在方法在中调用每一个方法,或者使用属性,JVM默认会在前面加上一个this.的关键字,即时我们不写出来,比如:
public class Student {
String sex;
public void setSex(String sexStr){
sex = sexStr;
//相当于this.sex = sexStr;
}
}
其实我们程序中的每一个方法,都有两个隐式参数,上述方法在JVM调用的时候,其实是这样的:
JVM.setSex(this,super,....);
每次调用的时候,JVM会传入当前调用此方法的对象的地址,以及它的父类的对象的地址(这在JVM中,对象是一个包裹的对象形态,参照一个类的初始化流程,其实this与super传入的都是当前对象的地址)。
还记得上次说过的代码的大体执行流程与内存状态,JVM在加载类的信息的时候会将方法也加载到方法区作为一个常量,然后对象中的对方指向的是方法区中的方法,这是为什么呢?将方法代码加载到方法区这个想法不难理解,这与将静态变量一并加载到方法区一样,因为他们都是属于类的,没必要给每个对象中声明一份,那么如何保证每个对象执行方法,却是与本对象相关的执行结果呢?就是这个隐式参数的作用!看图
如图所示,对象中的方法执行方法区的方法信息,JVM调用方法区的方法时,会默认的传入当前调用此方法的对象的地址,也就是0x45ed,而这个方法中默认的每行代码前面都会加上this.的语句,这样就会又找回到这个对象身上的属性,以及做的一切操作,都是与当前所调用此方法的对象相关。
this关键字最常用场景:
public class Student {
String name;
public Student(String name) {
this.name = name;
}
}
在同名的情况下,用来区分是局部变量还是对象的全局变量,当然还有其他场景,比如this()调用本类的其他构造方法,或者其他方法等等吧。
我们也知道,其实在方法在中调用每一个方法,或者使用属性,JVM默认会在前面加上一个this.的关键字,即时我们不写出来,比如:
public class Student {
String sex;
public void setSex(String sexStr){
sex = sexStr;
//相当于this.sex = sexStr;
}
}
其实我们程序中的每一个方法,都有两个隐式参数,上述方法在JVM调用的时候,其实是这样的:
JVM.setSex(this,super,....);
每次调用的时候,JVM会传入当前调用此方法的对象的地址,以及它的父类的对象的地址(这在JVM中,对象是一个包裹的对象形态,参照一个类的初始化流程,其实this与super传入的都是当前对象的地址)。
还记得上次说过的代码的大体执行流程与内存状态,JVM在加载类的信息的时候会将方法也加载到方法区作为一个常量,然后对象中的对方指向的是方法区中的方法,这是为什么呢?将方法代码加载到方法区这个想法不难理解,这与将静态变量一并加载到方法区一样,因为他们都是属于类的,没必要给每个对象中声明一份,那么如何保证每个对象执行方法,却是与本对象相关的执行结果呢?就是这个隐式参数的作用!看图
如图所示,对象中的方法执行方法区的方法信息,JVM调用方法区的方法时,会默认的传入当前调用此方法的对象的地址,也就是0x45ed,而这个方法中默认的每行代码前面都会加上this.的语句,这样就会又找回到这个对象身上的属性,以及做的一切操作,都是与当前所调用此方法的对象相关。
相关文章推荐
- JavaScript基础(基本语法:变量、语句、数组、函数、对象、全局方法以及js与java不同,js与html关联)
- java中equals和==之间的区别?clone方法的作用,及其为什么要使用clone方法?如何使用clone复制对象?以及深克隆浅克隆
- 为什么要重写java中对象的equals方法和hashCode方法以及如何重写
- JAVA如何在任意方法中打印当前线程栈信息(StackTrace)
- JAVA面向对象基础:继承、变量隐藏、方法重写、包、修饰符、this、super
- 图解Java对象初始化过程以及方法调用
- 21-JavaScript-面向对象-对象的属性和方法以及this
- Flex中如何监测摄像头Camera对象活动以及状态事件与信息
- [编写高质量代码:改善java程序的151个建议]建议66 asList方法产生的List对象不可更改
- 图解Java对象初始化过程以及方法调用
- JAVA 对象序列化(三)——transient以及Externalizable的一种替代方法(使用Serializable)
- java基础类,对象,方法以及三大特性
- objective-c中对象所有权的内存管理(关于set,get方法),以及如何使用@property来进行简易操作(九)
- Java中如何遍历Map对象的4种方法
- 图解Java对象初始化过程以及方法调用
- Java.内部类方法对外部类对象的引用x-this.x-Test.this.x
- Java静态初始化,实例初始化以及构造方法复习~
- Java第二课 Java面向对象编程,面向对象编程和面向过程编程的区别,我们如何才能掌握面向对象的编程,类和对象的关系;讲解了Java中的构造、重载、this和super变量、静态变量、Java中的常
- objective-c中对象所有权的内存管理(关于set,get方法),以及如何使用@property来进行简易操作(九)