zoukankan      html  css  js  c++  java
  • Java中this的功能与作用

    粗粒度上来说,Java中关键字this主要有2个功能:

    1、表示“当前对象”的引用

    (1)作为参数传入

    【程序实例1】

     1 public class MyObject {
     2 
     3     public Integer val;
     4 
     5     public MyObject() {
     6         this.val = 0;
     7     }
     8 
     9     public void methodA(Integer x) {
    10         this.val += x;
    11         System.out.println("MethodA: val = " + this.val);
    12     }
    13 
    14 }
    1     public static void main(String[] args) {
    2         MyObject objA = new MyObject();
    3         MyObject objB = new MyObject();
    4         System.out.println("Main A: val = "+objA.val);
    5         System.out.println("Main B: val = "+objB.val);
    6         
    7         objA.methodA(3);
    8         objB.methodA(10);
    9     }

    【运行结果】

    1 Main A: val = 0
    2 Main B: val = 0
    3 MethodA: val = 3
    4 MethodA: val = 10

    【结果分析】

    在main函数中,我们创建了两个对象objA和objB,并它们调用了同一个方法methodA(), 但是传入的参数是不同,那么methodA()是怎么知道它是objA、objB调用的呢?

    其实,是编译器在暗中做了一个操作:将“所操作对象”的引用作为第一个参数传给了被调用的方法。

    对应于程序实例1中代码,就是:

      objA.methodA(3) --- methodA(objA,3)

      objB.methodA(10) --- methodA(objB,10)

    前面说,将操作对象的引用作为第一个参数传入到了方法中,参数传进来是要来使用的,否则多此一举传到方法中干啥,那么在方法内部该怎么获得“操作对象的引用”呢?

    仔细观察程序实例1中的MyObject类的methodA(),发现:this.val += x;

    也就是说,我们要取当前对象的val值,然后与x相加,再赋值给val。没错,此时this就是操作对象的引用!

    其实,面向对象的编程语言中,都有类似java中this的关键字:C++中的this、Python中的self。

    (2)作为参数返回

    【程序实例2】

     1 public class MyObject {
     2 
     3     public Integer val;
     4 
     5     public MyObject() {
     6         this.val = 0;
     7     }
     8 
     9     public MyObject methodA(Integer x) {
    10         this.val += x;
    11         return this;
    12     }
    13     
    14     public void printf(){
    15         System.out.println("print: val="+this.val);
    16     }
    17 
    18 }
    1     public static void main(String[] args) {
    2         MyObject objA = new MyObject();
    3         objA.methodA(3).printf();
    4         
    5     }

    【运行结果】

    1 print: val=3

    【结果分析】

    由于methodA()中返回的参数是this,我们才可以链式地调用方法printf(),否则,不能链式地调用。(this可以作为返回值很有用啊)

    当然,此处的this仍然是当前操作对象的引用。

    ====================我是华丽的分割线====================

    再说下,this不被建议使用的情况:

    【程序实例3】

     1 public class MyObject {
     2 
     3     public Integer val;
     4 
     5     public MyObject() {
     6         this.val = 0;
     7     }
     8 
     9     public void methodA(Integer x) {
    10         this.val += x;
    11         this.methodB();
    12         System.out.println("MethodA: val = " + this.val);
    13     }
    14     
    15      private void methodB(){
    16         System.out.println("Run methodB !");
    17     }
    18 
    19 }

    该代码是可以正常运行的,但是其实程序的第11行中的this是不符合规范的:如果我们想在方法内部调用另外一个方法,那么直接写方法名即可,不需要加上this。如果非要写上也可以,但是毫无必要。

    2、在构造器中调用构造器

    一个类中可能会有多个构造器,这时,如果想在一个构造器中调用另外一个构造器,则可以使用this。

    【程序实例4】

     1 public class MyObject {
     2 
     3     public Integer val;
     4     
     5     public String strVal;
     6 
     7     public MyObject(Integer x) {
     8         this.val = x;
     9     }
    10     
    11     public MyObject(String str){
    12         this.strVal = str;
    13     }
    14     
    15     public MyObject(Integer x, String str){
    16         this(x);
    17         this.strVal = str;            //此处不能再次使用this(str)
    18     }
    19 
    20 }

    注意:

      (1)可以用this调用另一个构造器,但是却不能调用两个;

      (2)必须将构造器的调用放在方法的起始处,否则编译器会报错。

    转载时,请附上本文出处:http://www.cnblogs.com/acode/p/5829879.html

  • 相关阅读:
    .Net高并发解决思路 以及乐观锁 悲观锁等
    HTTP和HTTPS TCP/IP的UDP和TCP Socket和WebSocket RabbitMq和队列 Redis和Memcached
    C# Attribute特性 泛型<T> 方法的out ref this(扩展方法) Equals与==
    C# 托管与非托管类型 堆和栈 值类型与引用类型 装箱与拆箱
    C# 递归、冒泡算法 委托与事件 链表 二叉树 平衡二叉树 红黑树 B-Tree B+Tree 索引底层 表达式树
    C# 爬取数据
    C# 常用设计模式 并发编程(异步 多线程) 锁与死锁 集合数组List
    C# NPOI Excel多级表头导出多个表
    windows Server 2016安装Sqlserver远程连接的坑
    hdfs之NameNode故障处理的两种方式
  • 原文地址:https://www.cnblogs.com/acode/p/5829879.html
Copyright © 2011-2022 走看看