Java关键字this详解

this关键字概述

在实例方法或构造函数中,this 是对当前对象的引用调用其方法或构造函数的对象。 可以使用 this 在实例方法或构造函数中引用当前对象的任何成员。

this与字段一起使用

使用this关键字的最常见的情况是字段被方法或构造函数中的参数覆盖,用来区分实例变量和局部变量。

未使用this:

public class Point {
          
   
    public int x = 0;
    public int y = 0;
        
    //constructor
    public Point(int a, int b) {
          
   
        x = a;
        y = b;
    }
}

使用this:

public class Point {
          
   
    public int x = 0;
    public int y = 0;
        
    //constructor
    public Point(int x, int y) {
          
   
        this.x = x;
        this.y = y;
    }
}

构造函数的参数覆盖对象的字段,要引用Point字段x,构造函数必须使用this.x。

this与构造函数一起使用

在构造函数中,使用this关键字调用同一类中的另一个构造函数。这样做称为显式构造函数调用。

public class Rectangle {
          
   
    private int x, y;
    private int width, height;
        
    public Rectangle() {
          
   
        this(0, 0, 1, 1);
    }
    public Rectangle(int width, int height) {
          
   
        this(0, 0, width, height);
    }
    public Rectangle(int x, int y, int width, int height) {
          
   
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
    }
    ...
}

此类包含一组构造函数。每个构造函数初始化矩形的部分或全部成员变量。构造函数为其初始值不是由参数提供的任何成员变量提供默认值。例如,无参构造函数Rectangle在坐标 0,0 处创建一个 1x1。两参数构造函数调用四参数构造函数,传入宽度和高度,但始终使用 0,0 坐标。和以前一样,编译器根据参数的数量和类型确定要调用的构造函数。 如果存在,另一个构造函数的调用必须是构造函数的第一行。

注:this()和super()必须放在构造函数的第一行,this和super不能同时出现在一个构造函数里面。

扩展

实例变量

实例变量是指在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。 类的每个对象维护它自己的一份实例变量的副本。

局部变量

定义在方法之中的变量。

含义

实例变量:定义在类中但在任何方法之外。(New出来的均有初始化) 当一个对象被实例化之后,每个实例变量的值就跟着确定; 实例变量在对象创建的时候创建,在对象被销毁的时候销毁; 实例变量的值应该至少被一个方法、构造方法或者语句块引用,使得外部能够通过这些方式获取实例变量信息; 访问修饰符可以修饰实例变量; 实例变量对于类中的方法、构造方法或者语句块是可见的。一般情况下应该把实例变量设为私有。通过使用访问修饰符可以使实例变量对子类可见; 实例变量具有默认值。数值型变量的默认值是0,布尔型变量的默认值是false,引用类型变量的默认值是null。变量的值可以在声明时指定,也可以在构造方法中指定; 实例变量可以直接通过变量名访问。但在静态方法以及其他类中,就应该使用完全限定名:ObjectReference.VariableName。

异同

局部变量要先赋值,再进行运算,而实例变量均已经赋初值。(这是局部变量和实例变量的一大区别) 实例变量的对象赋值为null。 局部变量不允许范围内定义两个同名变量。实例变量的作用域在本类中完全有效,当被其他的类调用的时候也可能有效。 实例变量和局部变量允许命名冲突。

类变量(静态变量)

被static关键字修饰的变量。

类方法

static修饰的方法。

实例方法

由类创建实例调用。
class A {
          
   
    public void instanceMethod() {
          
   
        System.out.println("实例方法");
    }

    public static void staticMethod() {
          
   
        System.out.println("静态方法");
        //编译报错
        instanceMethod();
        new A().instanceMethod(); 
    }
}

class B {
          
   
    public void callInstanceMethod() {
          
   
        //实例方法。
        new A().instanceMethod();
        //静态方法。
        A.staticMethod(); 
    }
}

不以物喜,不以己悲

经验分享 程序员 微信小程序 职场和发展