关于java语言当中的this关键字:
1.this是一个关键字,翻译为:这个
2.this是一个引用,this是一个变量,this变量中保存了内存地址指向了自身,this存储在JVM堆内存java对象内部
3.创建100个java对象,每个对象都有this,也就是说有100个不同的this
4.this可以出现在“实例方法”当中,this指向当前正在执行这个动作的对象
5.this在多数情况下是可以省略不写的
6.this不能使用在带有static的方法中
示例代码01:
public class Customer { //顾客名【堆内存的对象内部中存储,所以访问该数据的时候,必须先创建对象,通过引用的方式访问】 String name;//实例变量:必须采用“引用.”的方式访问 //定义顾客购物方法 //每一个顾客购物最终的结果是不一样 //所以购物这个行为是属于对象级别的行为 //由于每一个对象在执行购物这个动作的时候最终结果不同,所以购物这个动作必须有对象参与 //重点: 没有static关键字的方法被称为“实例方法”,实例方法怎么访问?“引用.” //重点:没有static关键字的变量被称为“实例变量” //注意:当一个行为/动作执行的过程当中是需要对象参与的,那么这个方法一定要定义为“实例方法”,不要带有static关键字 //以下方法定义为实例方法,因为每一个顾客在真正购物的时候,最终的结果是不同的。所以这个动作在完成的时候必须有对象的参与。 public void shopping(){ System.out.println(this.name + "在购物"); } public static void doSome(){ //这个执行过程中没有“当前对象”,因为带有static的方法是通过类名的方式访问的 //或者说这个“上下文”当中没有“当前对象”,自然也不存在this(this代表的是当前正在执行这个动作的对象) //以下程序为什么编译报错 //doSome方法调用不是对象去调用,是一个类名去调用,执行过程中没有“当前对象“ //name是一个”实例变量“,以下代码的含义是:访问当前对象的name,没有当前对象,自然也不能访问当前对象的name //System.out.println(name); } public static void doOther(){ //假设想访问name这个实例变量的话应该怎么做? //System.out.println(this); //可以采用以下方案,但是以下方案,绝对不是访问的当前对象的name //创建顾客对象 Customer c = new Customer(); System.out.println(c.name);//这里访问的name是c引用指向对象的name } } ======================================================================================== public class CustomerTest01 { public static void main(String[] args) { //创建一个顾客对象 Customer c1 = new Customer(); c1.name = "zhangsan"; //顾客c1调用购物方法 c1.shopping(); //在创建一个顾客对象 Customer c2 = new Customer(); c2.name = "lisi"; //顾客c2调用购物方法 c2.shopping(); //调用doSome方法 //采用“类名.”的方式访问,显然这个方法在执行的时候不需要对象的参加 Customer.doSome(); //调用doOther方法; Customer.doOther(); } }
内存分析图:
示例代码02:
public class ThisTest { //实例变量(引用.的方式访问) int num = 10; //带有static的方法 //JVM负责调用main方法,JVM是怎么调用的 //ThisTest.main(String[]); public static void main(String[] args) { //没有当前对象this //以下代码什么意思? //访问“当前对象”的num属性 //System.out.println(num); //正确的访问方式 ThisTest tt = new ThisTest(); System.out.println(tt.num); }
示例代码03:
public class ThisTest02 { //带有static //不是实例方法 public static void main(String[] args) { //调用doSome方法 doSome(); //调用doSme方法 ThisTest02.doSome(); //调用doOther对象 //编译错误 //ThisTest.doOther();//实例对象必须先创建对象,通过引用.的方式访问 //doOther是实例方法 //实例方法调用必须有对象的存在 //以下代码表示的含义:调用当前对象的doOther方法 //但是由于main方法中没有this,所以以下方法不能使用 //doOther(); ThisTest02 tt = new ThisTest02(); // tt.doSome(); tt.run(); } //实例方法 public static void doSome(){ System.out.println("doSome excute!"); } //实例方法 public void doOther(){ //this表示当前对象 System.out.println("doOther excute!"); } //实例方法 //run是实例方法,调用run方法的一定是有对象存在的。 //一定是先创建了一个对象才能调用run方法 public void run(){ //在大括号中的代码执行过程中一定是存在"当前对象"的 //也就是说这里一定是有“this”的 System.out.println("run excute!"); //doOther是一个实例方法,实例方法调用必须有对象的存在 //以下代码表示的含义就是:调用当前对象的doOther方法 doOther();//this.大多数情况下都是可以省略的 //this.doOther();//比较完整的写法 } }
示例代码04:
class User { //属性 private int id;//实例变量 private String name; //无参构造函数 public User(){ } public User(int id,String name){ //等号前面的this.id是实例变量id //等号后面的id是局部变量id this.id = id; this.name