大白成为Java软件攻城狮的第二十天(this关键字)

this关键字

关于java语言当中的this关键字

  • 1 this是一个关键字,翻译为:这个
  • 2 this是一个引用,this是一个变量,this变量中保存了内存地址指向了自身,this存储在JVM堆内存java对象内部。
  • 3 创建100个java对象,每一个对象都有this,也就是说有100个不同的this
  • 4 this可以出现在“实例方法”中,this指向当前正在执行这个动作的对象。(this代表当前对象)
  • 5 this在大多数情况下都是可以省略不写的
  • 6 this不能使用带有static的方法中
public class CustomerTest
{
	public static void main(String[] args){
		//创建Customer对象
		Customer c1 = new Customer();
		c1.name = "zhangsan";
		
		//c1购物
		c1.shopping();

		Customer c2 = new Customer();
		c2.name = "lisi";
		c2.shopping();

		//调用doSome方法(修饰符列表上有static)
		//采用"类名."的方式访问,显然这个方法在执行的时候不需要对象的参加
		Customer.doSome();

		//调用doOther方法 
		Customer.doOther();
	}
}
public class Customer
{
	//姓名
	String name;
	
	//构造方法
	public Customer(){
	
	}
	
	//不带有static关键字的方法
	//顾客购物的行为
	//每一个顾客购物最终的结果是不一样的
	//所以购物这个行为是属于对象级别的行为
	//由于每一个对象在执行购物这个行为的时候最终结果不同,所以购物这个动作必须有对象的参与
	//重点:没有static关键字的方法被称为“实例方法”
	//重点:没有static关键字的变量被称为“实例变量”
	//注意:当一个行为/动作执行的过程中是需要对象参与的,那么这个方法一定要定义为“实例方法”,不要带static关键字
	public void shopping(){
		System.out.println(this.name + "在购物!");//完整写法
		System.out.println(name+"在购物!");//this可以省略不写
	}

	public static void doSome(){
		//这个执行过程中没有“当前对象”,因为带有static的方法是通过类名的方式访问的。
		//或者说这个"上下文"当中没有"当前对象",自然也不存在this(this代表的是当前正在执行的这个动作的对象)
		
		//以下程序为什么编译错误呢?
		//doSome方法调用不是对象去调用,是一个类名去调用,执行过程中没有“当前对象”。
		//name是一个"实例变量"。以下代码的含义是:访问当前对象的name。
		//System.out.println(name);
		
		//static方法调用不需要对象,直接使用类名,所以执行过程中没有当前对象,所以不能使用this
		//System.out.println(this);
	}

	public static void doOther(){
		//假设想访问name这个实例变量的话应该怎么做?
		//System.out.println(name); //编译报错
		
		//可以采用以下方案,但是以下方案,绝对不是访问当前对象的name
		//创建对象
		Customer c = new Customer();
		System.out.println(c.name);//这里访问的name是c引用指向对象的name
	}
}

编译结果:
在这里插入图片描述

实例方法必须有对象的存在

例:

实例方法
public void doOther(){
	System.out.println("do other!");
}

run是实例方法,调用run方法的一定是有对象存在的。一定先创造一个对象才能调用run方法

public void run(){
	System.out.println("run !");
	
	doOther是一个实例方法,实例方法调用必须有对象的存在
	以下代码的含义就是:调用当前对象的doOther方法
	doOther();//this大部分情况下可以省略
	this.doOther();//完整写法
}

最终结论:

  • 在带有static的方法当中不能直接访问实例变量和实例方法。
  • 因为实例变量和实例方法都需要对象的存在。
  • 而static的方法当中是没有this的,也就是说当前对象不存在。
  • 自然也是无法访问当前对象的实例变量和实例方法。

this.什么时候不能省略?

用来区分局部变量和实例变量的时候,“this.”不能省略。

public class User(){
	private int id; //实例变量
	
}

public int setId(int id){
	this.id = id; // 等号前面的是实例变量,等号后面的是局部变量
}

this可以使用在哪里?

  • 1 实例方法中,代表当前对象【语法格式:this.
  • 2 构造方法中,通过当前的构造方法调用其他的构造方法【语法格式:this(实参);

重点记忆:this()这种语法只能出现在构造函数第一行。

什么时候程序在运行的时候出现空指针异常呢?

  • 空引用访问实例相关的数据,因为实例相关的数据就是对象相关的数据,这些数据在访问的时候必须有对象的参与,当空引用的时候,对象不存在,访问这些实例数据一定会出现空指针异常。

实例相关的数据包括:

  • 实例变量【对象需要存在】
  • 实例方法【对象需要存在】
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值