【Java之旅】7.this关键字
7.1前情回顾
上回我们说static方法的时候,编写程序时报了个错误
现在我们就来讨论讨论这个this关键字到底甚么时候有什么时候没有
7.2 意思
①this是个啥?
每一个实例对象在堆中被new出来的时候,都有一个属性叫做this,这个属性保存了对象在堆内存中的内存地址。
所以说 this也是一种成员属性,而且还是一种隐藏的成员属性,
我们就以上一篇博客写的代码为例子
public class StaticTest
{
public static void main(String[] args)
{
Rainbowman buck = new Rainbowman();
Rainbowman ash = new Rainbowman(167,"kupurk","China");
buck.setLevel(216);
buck.setName("Mo__");
Rainbowman.setArea("Earth");
System.out.println(buck);
System.out.println(ash);
}
}
class Rainbowman
{
private int level;
private String name;
private static String area="China";
//private String area;
public Rainbowman()//构造方法重载
{
}
public Rainbowman(int level,String name,String area)//构造方法重载
{
this.level=level;
this.name=name;
this.area=area;
}
public static void setArea(String sarea)
{
area=sarea;
}
public void setLevel(int level)
{
this.level = level;
}
public int getLevel()
{
return level;
}
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
public String toString()
{
return "[" + level +"," + name +","+ area + "]";
}
}
这里的this其实也是一种成员属性,this所代表的值,即为该对象的地址。
每当我们使用构造函数new Rainbowman()时,在JVM的堆内存空间中,会自动划定一块区域。
并且将区域的首地址地址赋给this
Rainbowman buck = new Rainbowman();
我们再看我们写的那些方法,以及有参的构造方法
我们都用了“ this.’ 属性名 ’ ”的方式去给属性赋值
这个this在这里很像引用的用法,this是从哪来的呢?
this 是方法中的一个隐藏参数,它存放着对象的地址
这个构造方法的构造原理如下图
在我写的那串代码里,每个方法中,都藏着一个隐藏的参数this
例如:
public void setLevel(int level)
{
this.level = level;
}
它的真面目是
public void setLevel(Rainbowman this,int level)
{
this.level = level;
}
只有这样我们才能去使用this
7.3 再看前情回顾
那我们看前情回顾那怎么错了呢?
class Rainbowman
{
private int level;
private String name;
private static String area="China";
public static void setArea(String area)
{
this.area=area;
}
/*
不过这么写,系统却还是报错了
E:\工具\Markdown\输出\EditPlus_out\Classname\Test>javac StaticTest.java
StaticTest.java:32: 错误: 无法从静态上下文中引用非静态 变量 this
this.area=area;
^
1 个错误
*/
}
系统爆出的错误是,无法从静态上下文引用非静态变量 this,原因是因为,这是一个静态方法,静态方法中没有隐含的this参数。
结论:
静态方法和成员方法最大的区别在于,
静态方法中没有隐含的this参数,成员方法中有隐含的this参数。
这样也就解释了,为什么空指针异常发生在调用成员方法时,不会再静态方法被调用的时候发生。