学习笔记--Java中this关键字

Java中this关键字

关于Java语言中的this关键字

  • this 是一个关键字,翻译为:这个
  • this 是一个引用,一个变量,this变量中保存的内存地址指向自身
  • 每一个对象都有自己的this,创建多少Java对象,就有多少个不同的this
  • this存储在JVM堆内存中的Java对象中
  • this可以出现在实例方法中,this指代当前执行对应实例方法的对象引用
  • this不能使用在有 static 的方法中

测试1:

public class Customer {

    // 姓名
    String name;

    // 构造方法
    public Customer(){
        
    }

    // 顾客购物的行为
    // 不带 static 关键字
    // 没有 static 的变量和方法分别称为实例变量和实例方法
    // 实例变量和实例方法的调用需要使用引用
    // 因为没有一个顾客购买不同,所以该方法应使用实例方法
    // 注意:当一个行为?动作在执行过程中涉及对象的参与,应该使用实例方法【不带static关键字】
    public void shopping(){

        System.out.println(this.name + "在购物");
        // this 代表当前执行该实例方法的对象引用

    }

    public static void doSome(){

        // System.out.println(name);    报错
        // 这个执行过程中没有“当前对象”,因为带有static的方法是 类.方法
        // name 实例变量,上述代码表示:访问当前对象的实例变量name

        // System.out.println(this);    报错
        // 使用static方法调用不需要对象,直接使用类名,所以执行过程中没有当前对象

    }
}
public class ThisTest01{

    public static void main(String[] args) {
        
        // 创建Customer对象
        Customer c1 = new Customer();
        c1.name = "jock";

        // 创建Customer对象
        Customer c2 = new Customer();
        c2.name = "rose";

        // 顾客购物
        c1.shopping();
        c2.shopping();

        // 带static的方法
        Customer.doSome();
    }
}

测试2:

public class ThisTest02 {
    
    // 实例变量(引用)
    int num = 10;
    

    public static void main(String[] args){

        // System.out.println(num); 报错
        // this 或 实例变量 不能使用在有 static 的方法中

        // System.out.println(this.num); 报错
        // 与上面一样
    }
}

测试3:

public class ThisTest03 {
    
    public static void main(String[] args) {
        
        // 调用doSome方法
        ThisTest.doSome();

        // 或者
        doSome();

        // 调用doOther方法
        // ThisTest.doOther()   报错
        // 实例方法需要引用和对象,但目前在类自身中
        // this.doOther();  报错
        // 因为 main 方法是静态方法带有static

    }

    // 带有static   静态方法
    public static void doSome() {
        System.out.println("do some!");
    }

    // 不带static   实例方法
    public void doOther() {
        System.out.println("do other!");
    }

    // 实例方法
    public void run() {

        // 想要运行run实例方法,需要有对象
        
        System.out.println("run !");
        doOther();  // 成功调用
        // 运行run说明已经有对象,所以doOther能调用
        this.doOther(); // 同理
    }
}

结论:

  • 在带有static的方法当中不能“直接”访问实例变量和实例方法
  • 因为实例变量和实例方法都需要对象的存在
  • 而static的方法当中是没有this的,也就是说明当前对象不存在
  • 自然也是无法访问当前对象的实例变量和实例方法

this什么时候不能省略

  • 用来区分局部变量和实例变量的时候,this 不能省略
public class User {
    
    private int id;
    private String name;

    /*
    public void setId(int a) {
        id = a;
    }
    */
    // 传入参数与id不同可以区分,id是实例变量,a是传入参数

    /*
    public void setId(int id) {
        id = id;
    }
    */
    // 传入参数与id相同,由于就近原则传入参数为前一个id,后一个是实例变量

    // 上述两种含义不同,前者是:实例变量 = 传入参数;后者是:传入参数 = 实例变量

    // 传入参数与id相同应该用
    public void setId(int id) {
        this.id = id;
    }
}

this可以使用在哪里?

  • 可以使用在实例方法当中,代表当前对象

    语法格式:this.

  • 可以使用在构造器【构造方法】当中,通过当前的构造方法调用其他的构造方法

    语法格式:this(实参列表);

重点:this()只能出现在构造函数第一行


Java面向对象



posted @ 2022-02-04 16:55  sha0dow  阅读(55)  评论(0编辑  收藏  举报