目录
1、this关键字是什么?
java关键字,字面意思“这个”,当对象创建之后,每个对象的堆内存之内就有一个this引用,这个引用指向内存单元本身,指向对象自己,是一个引用变量。
所以某些角度看,this就等于当前对象,所以它可以出现在实例方法中,因为它是一个可以访问对象的引用。
2、this引用内存分布图
如下图,当在main方法中创建一个对象 Student stu=new Student();,除了该对象的自身的属性之外,还隐含了一个this引用,这个引用存储着自身内存单元的地址。
例如:主方法
public class test04 {
public static void main(String[] args) {
Chinese chinese=new Chinese();
chinese.add(1,2);
System.out.println(chinese.getSum());
System.out.println(chinese);
}
}
Chinese类:
public class Chinese {
private String id;
private String name;
private String country;
private int sum;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public int getSum() {
return sum;
}
public void setSum(int sum) {
this.sum = sum;
}
//主要代码
public void add(int a, int b){
this.sum=a+b;
System.out.println(this);
}
}
运行结果:
可以发现在main方法中指向Chinese对象的一个引用的地址和add方法中this引用所存储的地址是相同的,都指向的是Chinese对象在堆内存中的内存单元。所以这里也可以看到,this其实就是方法的调用对象,谁调用了这个方法,this就指代哪个对象。静态方法不需要对象调用,所以更能证明静态方法中没有对象和引用存在,就不能调用实例成分了。
Chinese@4554617c
3
Chinese@4554617c
Process finished with exit code 0
3、为什么静态方法中不能调用实例成分?
静态方法的调用,是类名·方法名的方式进行调用,所以它和对象并没有关联,方法内部不存在对象,因而也就不存在this关键字,因为this指代的是当前对象,而实例成分的调用需要对象引用的参与,所以在静态方法中不存在能够调用实例成分的对象或者引用。再者静态方法在类加载的时候放置在方法区内存中,但是实例成分是在堆内存中,且要在对象创建并初始化后才有意义的,如果静态方法中有实例成分在编译阶段就会出现问题。
例如下图:图中num变量是实例变量,对它的调用应该通过【引用·成分名】的方式进行引用,main方法是static类型的方法,所以其内部没有对象,因而也就不能直接的去调用。
——————————为什么在实例方法中可以调用实例方法?————————————
因为调用实例方法的必然是一个对象的引用,那么这个被调用的实例方法A中就存在指代当前类对象的this引用,利用这个引用可以完成当前类中实例方法的调用
所以实例方法中可以调用实例方法,因为必然存在指向当前对象的引用this,所以this可以省略不写
实例方法中可以调用静态方法,如果在同一个类当中,可以省略类名,直接写方法名和参数的方式进行调用即可。
例如:代码中对方法B的调用可以写【this.B( )】也可以写做【B( )】;
类AB{ 实例方法A(){ 方法B(); } 实例方法B(){ java语句; } }
4、如何在静态方法中访问实例成分
很简单,不能访问实例成分是因为没有对象存在于静态方法内部,那么我们为它创建一个对象就可以了。
在静态方法内部进行实例化一个对象,然后再访问实例成分,这里注意,main方法就是普通的一个静态方法,和其他任意的静态方法一样,所以能在main方法中做的事情,都能在其他的静态方法中进行,所以是可以创建对象的,但是注意这个新创建的对象是一个新的内存单元,和你所调用方法的那个this所指代的对象不同,可以利用传参的方式,将当前对象内存单元的引用传递过去,使形参变量引用指向所期望的内存单元,以充当this的作用。
5、构造方法中this的应用
语法结构:this{ 可选参数 };————调用当前类构造方法;
构造方法用于创建对象,完成一定的对象信息的初始化操作,方法是可以嵌套调用的,构造方法也不例外,利用this可以很好的简化构造方法的编写,尤其是构造方法中有过多的内容时,很常用。
例如:创建一个矩形类rectangle,默认(调用无参的构造方法)生成的矩形是长2cm,宽2cm的矩形,自定义(调用有参的构造方法并传递参数)生成的矩形是长为long,宽为width的矩形。在两个构造方法中的操作都是进行赋值操作,只不过无参的构造方法是以固定的长宽生成矩形,有参的构造方式是以指定的长宽生成矩形,二者之间殊途同归,如果写两遍代码,作为练习无伤大雅,但是真正的项目之中,代码成千上万行,很多操作,这时候再写一遍会,代码繁琐重复,妨碍代码理解,也会占据不必要的内存。
public class rectangle {
private float length;
private float width;
public rectangle(){
this(2,2); // 调用有参的构造方法,该种方式只能写一句
}
//get/set方法
public float getLength() {
return length;
}
public void setLength(float length) {
this.length = length;
}
public float getWidth() {
return width;
}
public void setWidth(float width) {
this.width = width;
}
//有参的构造方法
public rectangle(float length,float width){
this.length=length;
this.width=width;
}
}
根据是否有参数,决定调用哪一个构造器。
调用构造方法要通过new关键字,但是这样需要重新创建对象,开辟新的内存空间,但是我们想要的效果是对我们所使用的当前对象发挥作用,那么通过this关键字可以有效的解决这个问题,简化代码。
注意使用this在某个构造方法中调用其他构造方法,这种调用只能有一次,只能有一句调用的语句。