【Java之旅】7.this关键字

【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参数

这样也就解释了,为什么空指针异常发生在调用成员方法时,不会再静态方法被调用的时候发生。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值