• Java关键字之this


    Java关键字之this

    概念

    this关键字只能在方法内部使用,表示对“正在调用方法的对象”的引用。
    具体来讲。有以下两种情况:

    • 构造器中引用该构造器正在初始化的对象
    • 在方法中引用调用该方法的对象
    package com.my.pac09;
    
    /*
     *  ThisTest.java
     *  this  对“调用方法那个对象”的引用
     */
    
    public class ThisTest {
        private int height;
        public int width;
    
        public void setHeight(int height) {
            //this.height代表对象属性,和形参height进行区分
            this.height = height;
        }
    
        public int getHeight() {
            //省略了this,下面两句效果相同
            //都显示正在调用method方法。
            method();
            this.method();
            return this.height;
        }
    
        public ThisTest addOneToWidth() {
            //this代表正在调用addOneToWidth方法的对象的引用
            this.width++;
            System.out.println("宽度加一,现在是:"+this.width);
           //返回该对象的引用
            return this;
        }
    
        public ThisTest(int height) {
            this.height = height;
        }
    
        public ThisTest(int height, int width) {
            //调用ThisTest(int height)构造器
            this(height);
            this.width = width;
        }
    
        public void method() {
            System.out.println("正在调用method方法");
        }
    }
    
    /*ThisAllTest.java*/
    package com.my.pac09;
    
    public class ThisAllTest {
        public static void main(String[] args) {
            ThisTest test = new ThisTest(1, 2);
            System.out.println("高度为:" + test.getHeight() + ",宽度为: " + test.width);
            ThisTest me = test.addOneToWidth().addOneToWidth();
        }
    }
    
    //测试结果
    正在调用method方法
    正在调用method方法
    高度为:1,宽度为: 2
    宽度加一,现在是:3
    宽度加一,现在是:4
    

    表现形式

    • 内部调用同一个类的另外一个方法,可以省略this。
     public int getHeight() {
        //省略了this,下面两句效果相同
        //都显示正在调用method方法。
        method();
        this.method();
        return this.height;
    }
    
    //结果
    正在调用method方法
    正在调用method方法
    

    虽然在非static的前提下,方法必须需要以对象.方法的形式调用,但是在一个方法中调用同类的另一个方法,对象已经创建,则不需要重复地在方法中再次创建,这时候this就是这个已创建对象的引用。加之省略this,也就成了如上直接method();的情况。

    • 返回当前对象的引用。
    public ThisTest addOneToWidth() {
        //this代表正在调用addOneToWidth方法的对象的引用
        System.out.println("宽度加一,现在是:"+this.width);
        this.width++;
        //返回该对象的引用
        return this;
    }
        
    ThisTest me = test.addOneToWidth().addOneToWidth();
    
    //结果
    宽度加一,现在是:3
    宽度加一,现在是:4
    

    可以看到,addOneToWidth()方法返回的是当前对象的引用,所以可以在同一条语句里对对象执行多次操作。

    • 在构造器中调用另一个构造器。
    public ThisTest(int height) {
        this.height = height;
    }
    
    public ThisTest(int height, int width) {
        //调用ThisTest(int height)构造器
        this(height);
        this.width = width;
    }
    

    构造器中this表示的是正在初始化的对象的引用,this加上参数列表,就产生例如对另一个构造器明确的调用,可以减少许多代码量。
    另外,前面提到,上一篇关于构造器提到,this语句必须放在构造器执行体除注释外的第一句。因此,不能在一个构造器中同时运用两个this!!!

    • 形参名和属性名相同的情况。
    public void setHeight(int height) {
        //this.height代表对象属性,和形参height进行区分
        this.height = height;
    }
    

    当然,形参处可以使用任何一个变量名称,但是,用this.height=height;的形式,可以很清楚地让别人区分传入形参和成员变量,且见名知义。

    • 在方法内将自身传递给另外一个方法。

    ps:这个点其实我还是不太能够掌握,或者说举不出一个合适的例子,所以我参照Thinking in Java 并进行一定的修改,以助理解。先附上代码:

    package com.my.pac09;
    /*PassingThis.java*/
    public class PassingThis {
        public static void main(String[] args) {
            Person p = new Person();
            Apple apple = new Apple(5);
            apple.displayPeelNum();//此时皮的数量:5
            p.eat(apple);
        }
    }
    class Person {
        public void eat(Apple apple) {
            System.out.println("开始剥皮...");
            Apple peeled = apple.getPeeled();
            peeled.displayPeelNum();
            System.out.println("剥完的苹果就是好吃~");
        }
    }
    class Apple {
        public int num;
        //构造器,传入皮的数量
        Apple(int num){
            this.num = num;
        }
        Apple getPeeled() {
            //意思是把apple传给Peeler的peel方法剥皮,this代表传进去的apple
            return Peeler.peel(this);
        }
        void displayPeelNum() {
            System.out.println("此时皮的数量:" + num);
        }
    }
    class Peeler {
        //static修饰的类方法,可以直接利用Peeler.peel(..)调用
        static Apple peel(Apple apple) {
            //...remove peel 剥皮的过程
            while (apple.num > 0) apple.num--;
            return apple;
        }
    }
    
    //测试结果
    此时皮的数量:5
    开始剥皮...
    此时皮的数量:0
    剥完的苹果就是好吃~
    
    

    可以看到,下面的部分在Apple类中调用Peeler的peel方法,将刚刚创建的apple对象作为形参传入其中进行剥皮操作,Peeler的peel是一个外部工具方法(将要用于许多其他的类,比如香蕉,梨等),所以将自身传递给外部方法,this就很有用。

    ps:文章若有错误,欢迎大家批评指正!
    参考书籍:《Thinking in Java》、《疯狂Java讲义》

  • 相关阅读:
    SQLdiag-配置文件-ProfilerCollector
    SQLdiag-配置文件-PerfmonCollector
    SQLdiag-初识
    Trace-跟踪高消耗的语句需添加哪些事件
    RML Utilities for SQL Server
    【译】第十五篇 Integration Services:SSIS参数
    修改数据文件和日志文件路径
    Trace-导出已有的服务器端跟踪
    iphoneX的适配问题
    添加阿里巴巴图标,让你页面小图标都是CSS3写成
  • 原文地址:https://www.cnblogs.com/summerday152/p/12005295.html
Copyright © 2020-2023  润新知