• this关键字的用法


    目录

    一.概述

    当一个对象创建成功之后(执行构造方法之前,对象已经创建成功),虚拟机(JVM)就会动态的分配一个引用,这个引用指向的就是创建出来的对象,并且该引用的名字就叫做this.可以理解为每一个方法内部都有一个局部变量叫this,每当初始化一个对象时,就把该对象的地址传递给了该对象每一个方法中的this变量,从而可以在方法内部使用这个的对象。

    二.使用动机

    this关键字只能在方法内部使用,表示对“调用方法的那个对象”的引用。this不能用于static方法中,因为this指代当前对象,而static无对象之说

    三.使用方法

    ①当局部变量和成员变量重名的时候,在方法中使用this表示成员变量以示区分。

    如果在一个方法中如果没有局部变量和成员变量同名,那么在这个方法中使用成员变量也不必使用this.
    class Person{
      int age;
      public Person(int age){
        this.age = age;
      }
    
      public int getAge(){
        return this.age;
      }
    }
    

    ②通过this关键字调用成员方法

    如果在方法内部调用同一个类的另一个方法,就不必使用this。
    class Person{
      public void openMouth(){
        ……;
      } 
    
      public void speak(){
        this.openMouth();
      } 
    }
    

    ③this关键字把当前对象传递给其他方法

    举例:在口袋妖怪中,训练师可以将杰尼龟通过训练进化为卡咪龟。为了将杰尼龟进化为卡咪龟,需要将创建的杰尼龟对象传递给Natrue.Evolution()方法,它是一个外部的工具方法。为了将其自身传递给外部方法,必须使用this关键字

    package com.game.ThisTest;
    
    /*
        业务逻辑:在精灵宝可梦中,训练师可以将会使用泡沫光线的杰尼龟训练为
                   会使用火箭头槌的卡咪龟
     */
    
    //训练家类:拥有将杰尼龟训练成为卡咪龟的职责
    class Trainer{
        public void practice(Zenigame zni){
            zni.useSkill();//杰尼龟使用技能
            zni.getEvolved().useSkill();//杰尼龟进化为卡咪龟后使用技能
        }
    }
    
    //卡咪龟类。卡咪龟可以使用火箭头槌技能
    class Wartotortle{
        Wartotortle(Zenigame zni){
            System.out.println("杰尼龟进化为卡咪龟");
        }
    
        void useSkill(){
            System.out.println("卡咪龟,快使用火箭头槌!");
        }
    }
    
    //在自然情况下,杰尼龟会进化为卡咪龟
    class Nature{
        static Wartotortle Evolution(Zenigame zni){
                return new Wartotortle(zni);
        }
    }
    
    //杰尼龟类,进化后会得到卡咪龟
    class Zenigame{
        Wartotortle getEvolved(){
           return Nature.Evolution(this);//this表示传递杰尼龟对象
       }
    
       void useSkill(){
           System.out.println("杰尼龟,快使用泡沫光线!");
       }
    }
    
    
    public class Pokemon {
        public static void main(String[] args) {
                new Trainer().practice(new Zenigame());
        }
    }
    

    ⑤当需要返回当前对象的引用时,就常常在方法写return this

    这种做法的好处是:当你使用一个对象调用该方法,该方法返回的是经过修改后的对象,且又能使用该对象做其他的操作。因此很容易对一个对象进行多次操作。
    //由于increment()通过this关键字返回了当前对象的引用,所以很容易对一个对象执行多次操作
    public class ReturnThisTest {
        int i = 0;
        ReturnThisTest increment(){
            i += 2;
            return this;
        }
        void print(){
            System.out.println("i = " + i);
        }
        public static void main(String args[]){
            ReturnThisTest x = new ReturnThisTest();
            x.increment().increment().print();
        }
    }
    

    ⑤在构造器中调用构造器需要使用this

    构造方法是在实例化对象时被Java虚拟机自动调用的,在程序中不能像调用其他方法一样去调用构造方法。但可以在一个构造方法中使用"this([参数1,参数2……]"的形式调用其他构造方法。 在使用this调用类的构造方法时,应注意一下几点: ☞只能在构造方法中使用this调用其他的构造方法,不能在成员方法中使用。 ☞在构造方法中,使用this调用构造方法的语句必须位于第一行,且只能出现一次。 ☞不能在一个类的两个构造方法中使用this互相调用。
    class Person{
        public Person(){
            System.out.println("无参的构造方法被调用了……");
        }
    
        //构造方法中的this调用其他构造函数
        public Person(String name){
            this();
            System.out.println("有参的构造方法被调用了……");
        }
    }
    
    public class StructMethodTest {
        public static void main(String[] args) {
            new Person("MiaoWu");
        }
    }
    

  • 相关阅读:
    ASP.NET 4.0 与 Entity Framework 4第一篇采用ModelFirst 开发方式创建数据库
    Web SSH 客户端Ajaxterm安装
    新浪微博Wordpress插件博客微博安装手册
    Sharetronix 微博客系统安装手册
    ASP.NET 4.0 与 Entity Framework 4第三篇使用Entity Framework调用存储过程
    QQ概念版体验[多图]
    您博客应该有的8个设计要素
    Centos 系统更新Python
    每天一个linux命令(28):tar命令
    C# 类(5) 重载
  • 原文地址:https://www.cnblogs.com/miaowulj/p/14493179.html
Copyright © 2020-2023  润新知