天天看点

java| this关键字

java| this关键字

  1. 一个对象一个this。
  2. this是一个变量,是一个引用,this保存当前对象的内存地址,指向自身。

    所以严格意义上说,this就是表示“当前对象”

  3. this存储在堆内存当中对象的内部。
  4. 当局部变量和成员变量重名的时候,在方法中使用this表示成员变量来区分。
  5. 所以,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 + "正在购物");
    }}

           

上面代码 jvm如图所示

java| this关键字

在set、get方法中:

public int getId() {
    return id;
}
public void setId(int id) {
    this.id = id;
}
           

THIS什么时候不能省?

  1. 在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()

java| this关键字
public data(){
   
/** this.year = 1970;
    this.month = 1;
    this.day = 1;
     */
    //通过一个构造方法调用当前类的另一个构造方法。
    this(1970,1,1);

}
           

通过构造方法1 调用构造方法2,可以做到代码的复用。

需要注意的是,两个构造方法要在同一个类中。this()要出现在构造器的第一个语句,即出现在构造方法的第一行。

$

$

3. this()语句的作用是什么?

实现代码的复用。