java| this关键字
- 一个对象一个this。
- this是一个变量,是一个引用,this保存当前对象的内存地址,指向自身。
所以严格意义上说,this就是表示“当前对象” - this存储在堆内存当中对象的内部。
- 当局部变量和成员变量重名的时候,在方法中使用this表示成员变量来区分。
- 所以,this代表的是当前变量。
为什么this不能用在静态方法?
public static void doSome(){ System.out.println(this); //报错! }
this代表的是当前对象,而静态方法的调用不需要对象。矛盾了。
当程序运行的时候,Java编译器将java文件编译成class文件,jvm操作Java解释器执行字节码文件。
具体来说就是首先会在方法区创建class文件区,之后main方法进栈,在栈中进行对象的创建,在堆中进行实例化,栈中的对象通过内存中的位置标识指向堆中的new出来的对象的实例,对象中的方法的执行在栈中,执行完之后就会销毁。
源代码:
public class _001 { public static void main(String[] args) { Customer q1 = new Customer("憨包"); Customer q2 = new Customer("hh"); }} //顾客类 class Customer{ //属性 String name ; //构造方法//无参构造方法 public Customer(){} //有参构造方法 public Customer(String s){ name = s;} //顾客购物方法实例方法 public void shopping (){ System.out.println(name + "正在购物"); }}
从内存图上看,c2 和this 也是一样的
this在set、get方法中
public int getId() { return id; } public void setId(int id) { this.id = id; }
THIS什么时候不能省?
· 在set 、 get方法中
原代码:
public void setNo(int i){ //缺点: 形式参数名没有意义。(i和s) i = no; } public int getNo() { return no; } public void setName(String s){ name = s; } public String getName(){ return name; }
此时多定义了i,和s,方法名中的形式参数没有意义。
修改后(也是目前常用set、get版本,增强了可读性)
public void setNo(int no){ this.no = no; } public int getNo() { return no; } public void setName(String name){ this.name = name; } public String getName(){ return name; }
若定义 no = no,在java中存在就近原则,则只会复制给方法名中的no,相当于自己赋值给自己,无关main方法中的no。
class Student { private int no; private String name;
当前对象no,this.no指class中的no,后面no等于上一行int no。
这里使用this关键字。这里this指实例变量,此时this.不能省略。
this作用: 区分实例变量和静态变量。
public String getName(){ return name; //name前省略了this,getName 获取的是“当前对象”的名字 }
综上,在实例方法或者构造方法中,为了区分局部变量和实例变量,这种情况下this不能省。
this()
1. this除了可以在实例方法中,也可以在构造方法中。
2. 通过当前构造方法,调用同类的另一个构造方法:
语法格式: this(实参列表)
例如:
public data(){ /** this.year = 1970; this.month = 1; this.day = 1; */ //通过一个构造方法调用当前类的另一个构造方法。 this(1970,1,1); }
通过构造方法1 调用构造方法2,可以做到代码的复用。
需要注意的是,两个构造方法要在同一个类中。
this()要出现在构造器的第一个语句,即出现在构造方法的第一行。
3.this()语句的语法作用?
实现代码的复用。