zoukankan      html  css  js  c++  java
  • Java里this的作用和用法

    对象创建的过程和this的本质

      构造方法是创建Java对象的重要途径,通过new关键字调用构造器时,构造器也确实返回该类的对象,但这个对象并不是完全由构造器负责创建。创建一个对象分为如下四步:

      1. 分配对象空间,并将对象成员变量初始化为0或空

      2. 执行属性值的显示初始化

      3. 执行构造方法

      4. 返回对象的地址给相关的变量

      this的本质就是“创建好的对象的地址”! 由于在构造方法调用前,对象已经创建。因此,在构造方法中也可以使用this代表“当前对象” 。

      this最常的用法:

      1.  在程序中产生二义性之处,应使用this来指明当前对象;普通方法中,this总是指向调用该方法的对象。构造方法中,this总是指向正要初始化的对象。

      2. 使用this关键字调用重载的构造方法,避免相同的初始化代码。但只能在构造方法中用,并且必须位于构造方法的第一句。

      3. this不能用于static方法中。

    【示例4-8】this代表“当前对象”示例

     1 public class User {
     2     int id;        //id
     3     String name;   //账户名
     4     String pwd;   //密码
     5  
     6     public User() {
     7     }
     8     public User(int id, String name) {
     9         System.out.println("正在初始化已经创建好的对象:"+this);
    10         this.id = id;   //不写this,无法区分局部变量id和成员变量id
    11         this.name = name;
    12     }
    13     public void login(){
    14         System.out.println(this.name+",要登录!");  //不写this效果一样
    15     }   
    16      
    17     public static void main(String[] args) {
    18         User  u3 = new User(101,"高小七");
    19         System.out.println("打印高小七对象:"+u3);
    20         u3.login();
    21     }
    22 }
    
    

     【示例4-9】this()调用重载构造方法

     1 public class TestThis {
     2     int a, b, c;
     3  
     4     TestThis() {
     5         System.out.println("正要初始化一个Hello对象");
     6     }
     7     TestThis(int a, int b) {
     8         // TestThis(); //这样是无法调用构造方法的!
     9         this(); // 调用无参的构造方法,并且必须位于第一行!
    10         a = a;// 这里都是指的局部变量而不是成员变量
    11 // 这样就区分了成员变量和局部变量. 这种情况占了this使用情况大多数!
    12         this.a = a;
    13         this.b = b;
    14     }
    15     TestThis(int a, int b, int c) {
    16         this(a, b); // 调用带参的构造方法,并且必须位于第一行!
    17         this.c = c;
    18     }
    19  
    20     void sing() {
    21     }
    22     void eat() {
    23         this.sing(); // 调用本类中的sing();
    24         System.out.println("你妈妈喊你回家吃饭!");
    25     }
    26  
    27     public static void main(String[] args) {
    28         TestThis hi = new TestThis(2, 3);
    29         hi.eat();
    30     }
    31 }

    this, 一个官方的说法是,this首先是一个对象,它代表调用这个函数的对象。

    根据面向对象的基本语法,每当调用变量或者函数的时候,都要按照类名.变量(函数)的格式来调用,意即每个变量或函数都必须属于某一个实际的对象而不是一个类(static的除外).
           在不会产生混淆的地方, this是可以省略的,但一般都会加上,(Think in Java里面说最好不要加,因为大家都不加)

    例如,下面的程序中,类"Person"里面加与不加 this 编译运行后的结果是一样的:

     package testThis;
     2 
     3 public class Test {
     4     public static void main(String args[]){
     5         Person p1 = new Person();
     6         p1.name = "zhangsan";
     7         Person p2 = new Person();
     8         p2.name = "lisi";
     9         
    10         p1.talk();
    11         p2.talk();
    12     }
    13 }
    14 
    15 class Person{
    16     String name;
    17     void talk(){
    18         System.out.println("My name is " + this.name);
    19     }
    20 }
    复制代码

     上面的代码里第18行,不管是"this.name"还是"name",运行的结果都是:

    My name is zhangsan
    My name is lisi

     因为前面已经把p1和p2里面的name变量赋值,所以执行方法的时候,都会打印出它们各自的数据.

    但是,当函数里面有参数时,如果函数的参数和成员变量一样,这时不加this的话,程序就会根据"就近原则",自动调用最近的值,如下面的代码:

    
    

     因为前面已经把p1和p2里面的name变量赋值,所以执行方法的时候,都会打印出它们各自的数据.

    上面已经把对象p1和p2里面的变量name分别赋值为"zhangsan"和"lisi",但类"Person"里面的方法"talk"现在有了参数"String name",而且没有加"this",这时如果运行这个方法,方法就会接收后面参数传送给它的值,分别是"zhang"和"li",这时运行结果就会是:

    My name is zhang
    My name is li

    所以,这里虽然对象p1和p2各有自己的变量 name,但它们调用的方法接收的却是参数里面的值,(从系统里各变量的颜色背景也可心看出对应的变量),而不是它们自己本身的值.所以这里输出的结果跟它们自己内部的值无关.

    如果想要在它们各自调用talk()方法时分别输出自己内部的值,则需要在类 "Person"里面的方法"talk"里加上"this",这样,当它们各自调用这个方法时,输出的结果都是它们各自内部变量的值了

    参考博文:https://www.cnblogs.com/livterjava/p/4709383.html

  • 相关阅读:
    怎样通过iPhone Safari 来安装测试版ipa
    UINavigationController检测后退按钮被按下
    Android系统在超级终端下必会的命令大全(adb shell命令大全)
    so 加载符号找不到的问题解决
    Ubuntu Android 开发jdk1.5和1.6之间的切换
    UIView animation
    HTC G11 获取Root权限图文教程
    Android.mk文件语法规范
    Android NDK 下的宽字符编码转换及icu库的使用
    [转载].NET制作安装卸载程序 Virus
  • 原文地址:https://www.cnblogs.com/bukechuji/p/10976814.html
Copyright © 2011-2022 走看看