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()这种语法只能出现在构造函数第一行。
什么时候程序在运行的时候出现空指针异常呢?
- 空引用访问实例相关的数据,因为实例相关的数据就是对象相关的数据,这些数据在访问的时候必须有对象的参与,当空引用的时候,对象不存在,访问这些实例数据一定会出现空指针异常。
实例相关的数据包括:
- 实例变量【对象需要存在】
- 实例方法【对象需要存在】