永利集团304com:Java学习笔记14

Java学习笔记14—this作为重回值时再次来到的是怎么着,学习笔记14—this

  一时会遇上this作为重临值的情景,那么此时重临的毕竟是哪些啊?

 
回来的是调用this所处方法的可怜目的的援用,读起来某些绕口哈,有没有回想小学语文深入分析句子成份的试题,哈哈。

  一小点剖析的话,主干是“重返的是援用”;

  什么援引呢?“那么些指标的援用”;

  哪个目的啊?“调用方法的可怜目的”;

  调用的哪些方法吗?“调用的是this所身处的格局”;那样就明白了。

 
再总计一下正是,this作为重返值时,重返的是调用某艺术的对象的引用,这一个办法就是包蕴“return
this;”这行命令的那几个格局;更简便易行点说,正是何人调用再次来到的正是哪个人。

  为了更明亮、直观的明白难点,上边以简要的例子表明。

  包human中定义了Person类,代码如下:

package human;

public class Person {
    String name;
    int age;

    public Person() {

    }
    public Person(String n, String g) {
        name = n;
        gender = g;
    }


    //test:this作返回值
    Person reThis1() {
        Person per = new Person("lu","female");
        System.out.println("reThis1 per:" + per.name);
        return this;
    }
    Person reThis2() {
        Person per = reThis1();
        System.out.println("reThis2 per:" + per.name);
        return this;
    }
    Person reThis3() {
        name = "ma";
        return this;
    }
    static void equRefer(Person per1, Person per2) {
        if(per1 == per2)
            System.out.println("per1指向的对象没有改变,仍与per2指向同一个对象");
        else
            System.out.println("per1指向的对象已改变,与per2指向不同的对象");
        System.out.println("per1:" + per1.name);
        System.out.println("per2:" + per2.name);
    }

    public static void main(String[] args) {
        Person per1 = new Person("liu","female");
        Person per2 = per1;

        per1 = per1.reThis1();
        Person.equRefer(per1, per2);

        per1 = per1.reThis2();
        Person.equRefer(per1, per2);

        System.out.println("调用reThis3之前,per1.name=" + per1.name);
        per1 = per1.reThis3();
        System.out.println("调用reThis3之后,per1.name=" + per1.name);
    }
}

 

出口结果如下:

 1 reThis1 per:lu
 2 per1指向的对象没有改变,仍与per2指向同一个对象
 3 per1:liu
 4 per2:liu
 5 reThis1 per:lu
 6 reThis2 per:liu
 7 per1指向的对象没有改变,仍与per2指向同一个对象
 8 per1:liu
 9 per2:liu
10 调用reThis3之前,per1.name=liu
11 调用reThis3之后,per1.name=ma

 

逐句分析执行进程:

(1).第1句:Person per1 = new Person(“liu”,”female”);

创办三个Person对象,将name最先化为“liu”,gender起先化为“female”,并让per1指向该对象。

(2).第2句:Person per2 = per1;

概念贰个Person类的指标援引,并与per1指向同一个对象;具体内部存款和储蓄器分配见图1:

永利集团304com 1

(3).第3句:per1 = per1.reThis1();

由per1调用reThis1()方法,并将回来值赋给per1;reThis1()方法体内定义了三个部分变量per,并创办叁个指标,由per指向它;具体内存分配见图2:

永利集团304com 2

继而输出reThis1 per:lu;最终回到this,并把重回的值赋给per1。

(4).第4句:Person.equRefer(per1, per2);

调用equRefer(per1,per2)来表明per1的值并未有改观;依据上面包车型大巴输出结果也可见per1仍与per2指向原本的指标,也正是说此时this的值与per1的值是一致的;也足以说,哪个人调用的归来的正是什么人。

输出结果:

per1指向的目的未有变动,仍与per2指向同二个指标
per1:liu
per2:liu

那时候的内部存款和储蓄器图如图3:

永利集团304com 3

(5).第5句:per1 = per1.reThis2();

per1调用reThis2(),由(4)可推测,此时per1的值也不会变,是由per1调用的this所处的不二等秘书诀,所以回来的也是per1;具体来解析的话,reThis2()定义了二个局地变量per,并给其赋值为reThis1(),约等于说reThis2()调用了reThis1(),由(3)、(4)可推知,此时的内部存款和储蓄器结构是底下这样的:

永利集团304com 4

一些变量per指向的对象与per1是平等的,因为调用reThis1的目的是per1所指的靶子,所以重回值也是per1。

此处的输出结果为:

reThis1 per:lu
reThis2 per:liu

(6).第6句:Person.equRefer(per1, per2);

证实方面包车型客车定论,per1指向没变,此时的内部存款和储蓄器分配图如图4所示:

永利集团304com 5

(7).第7、8、9句:

System.out.println(“调用reThis3之前,per1.name=” + per1.name);
per1 = per1.reThis3();
System.out.println(“调用reThis3之后,per1.name=” + per1.name);

per1调用reThis3();reThis3()中期维修改了namer的值,由”liu”改为”ma”,然后回来this。

调用前后的内存结构分别如图6、图7所示:

永利集团304com 6

永利集团304com 7

输出结果:

调用reThis3之前,per1.name=liu
调用reThis3之后,per1.name=ma

再二遍验证了上述的结论。

 
至于为啥接纳this,笔者是如此掌握的:出于定义类的时候未有创立对象,所以不可能分明指标到底叫什么,就用this来归并意味着,等到具体调用时就足以知道对象的名字了,然后就用对象的援用替换this;所以为了有助于记念,能够清楚成什么人调用再次回到的正是什么人。

 
有关重临this有哪些含义,作者的接头是:记重临this的章程为A,也许A的方法体中对指标的质量做了一些操作或调用了好几方法成功了好几动作,显而易见,做完这几个操作后就把原对象的引用重返,重返后的气象是指标最新的气象,也许与对象调用方法A前不一样。

不时会遇见this作为重回值的情事,那么此时回到的终究是何等吗?
再次来到的…

(7).第7、8、9句:

由per1调用reThis1()方法,并将回来值赋给per1;reThis1()方法体钦命义了多个部分变量per,并创办三个目的,由per指向它;具体内部存款和储蓄器分配见图2:

输出结果:

//http://www.cnblogs.com/chanchan/p/7812166.html
package human;

public class TestMain {
    public static void main(String[] args) {

        Person per1 = new Person("liuP","female");
        Person per2 = per1;
        Person per3;
        Person per4;
        Student stu1 = new Student("liuS","female");
        Student stu2 = stu1;

        //追加2017.11.25
        per1 = stu1.reThis3();
        if( per1 == stu1 )
            System.out.println("per1与stu1指向同一个子类对象");
        else
            System.out.println("per1与stu1指向不同的对象");

        per1 = stu1.reThis1();
        if( per1 == stu1 )
            System.out.println("per1与stu1指向同一个子类对象");
        else
            System.out.println("per1与stu1指向不同的对象");

        per3 = stu1;
        per4 = per3.reThis3();
        if( per4 == per3 )
            System.out.println("per4与per3指向同一个子类对象");
        else
            System.out.println("per4与per3指向不同的对象");

        per3 = stu1;
        per4 = per3.reThis1();
        if( per4 == per3 )
            System.out.println("per4与per3指向同一个子类对象");
        else
            System.out.println("per4与per3指向不同的对象");

                per3 = stu1;
        stu1 = (Student) per3.reThis2(); //向下转型
        if( stu1 == per3 )
            System.out.println("stu1与per3指向同一个子类对象");
        else
            System.out.println("stu1与per3指向不同的对象");
    }

}

 

 

package human;

public class Person {
    String name;
    int age;

    public Person() {

    }
    public Person(String n, String g) {
        name = n;
        gender = g;
    }


    //test:this作返回值
    Person reThis1() {
        Person per = new Person("lu","female");
        System.out.println("reThis1 per:" + per.name);
        return this;
    }
    Person reThis2() {
        Person per = reThis1();
        System.out.println("reThis2 per:" + per.name);
        return this;
    }
    Person reThis3() {
        name = "ma";
        return this;
    }
    static void equRefer(Person per1, Person per2) {
        if(per1 == per2)
            System.out.println("per1指向的对象没有改变,仍与per2指向同一个对象");
        else
            System.out.println("per1指向的对象已改变,与per2指向不同的对象");
        System.out.println("per1:" + per1.name);
        System.out.println("per2:" + per2.name);
    }

    public static void main(String[] args) {
        Person per1 = new Person("liu","female");
        Person per2 = per1;

        per1 = per1.reThis1();
        Person.equRefer(per1, per2);

        per1 = per1.reThis2();
        Person.equRefer(per1, per2);

        System.out.println("调用reThis3之前,per1.name=" + per1.name);
        per1 = per1.reThis3();
        System.out.println("调用reThis3之后,per1.name=" + per1.name);
    }
}

 
关于再次来到this有怎么着意思,小编的精通是:记重临this的办法为A,大概A的方法体中对目的的属性做了一点操作或调用了一些方法成功了一些动作,综上可得,做完这么些操作后就把原对象的引用再次来到,重临后的景观是目的最新的景观,可能与指标调用方法A前不相同。

浅析见后文

 
包human中定义了Person类、Student类及测量检验类TestMain,当中Student是Person的子类。

请尊重笔者劳动成果,转发请在标题表明“转发”字样,并标记原版的书文链接:

 

调用reThis3之前,per1.name=liu
调用reThis3之后,per1.name=ma

 
有关为什么选取this,笔者是这么清楚的:出于定义类的时候没有制造对象,所以无法明确指标到底叫什么,就用this来归并意味着,等到具体调用时就足以掌握对象的名字了,然后就用对象的引用替换this;所以为了便于回忆,能够知道成何人调用重临的就是哪个人。

增添了下边5项测验代码:

创立贰个Person对象,将name开始化为“liu”,gender早先化为“female”,并让per1指向该对象。

package human;

public class Student extends Person {
    String stuNumber;
    int score;

    public Student(String n, String g) {
        super(n,g);
    }

    Person reThis1() {
        Person per = new Person("luPS","female");
        System.out.println("reThis1 per S:" + per.name);
        return this;
    }

    Student reThis2() {
        Person per = reThis1();
        System.out.println("reThis2 per S:" + per.name);
        return this;
    }

}

(4).第4句:Person.equRefer(per1, per2);

也正是说,尽管是由子类来调用父类的归来this的法子,不论子类有没有重写该办法,重返值都是指向调用该措施的子类对象的;

  哪个指标呢?“调用方法的非常指标”;

(1).第1句:Person per1 = new Person(“liu”,”female”);

 

 
回去的是调用this所处方法的非常目的的引用,读起来有个别绕口哈,有未有回看小学语文深入分析句子成份的试题,哈哈。

 

表达方面包车型大巴下结论,per1指向没变,此时的内部存款和储蓄器分配图如图4所示:

追加(11.26):

永利集团304com 8

(11.26)

(5).第5句:per1 = per1.reThis2();

有的变量per指向的指标与per1是大同小异的,因为调用reThis1的靶子是per1所指的靶子,所以重临值也是per1。

  有时会遇到this作为重返值的境况,那么此时赶回的毕竟是怎么吗?

System.out.println(“调用reThis3之前,per1.name=” + per1.name);
per1 = per1.reThis3();
System.out.println(“调用reThis3之后,per1.name=” + per1.name);

(2).子类对象调用父类中回到this的情势,该办法已被子类重写,且再次来到值类型与父类再次回到值类型一致

 

调用前后的内存结构分别如图6、图7所示:

(3).父类对象引用指向子类对象时,即进步转型时,父类对象援用调用未被子类重写的归来this的不二诀要

per1调用reThis2(),由(4)可估算,此时per1的值也不会变,是由per1调用的this所处的章程,所以回来的也是per1;具体来深入分析的话,reThis2()定义了二个某些变量per,并给其赋值为reThis1(),也便是说reThis2()调用了reThis1(),由(3)、(4)可推知,此时的内部存储器结构是下边那样的:

reThis1 per:lu
reThis2 per:liu

(5).向上转型时,父类对象引用调用被子类重写的归来this的诀窍,且重临值类型为父类重返值类型的子类

(4).向上转型时,父类对象援用调用被子类重写的回到this的方法,且重回值与父类重返值类型一致

(11.26)

当由针对子类对象的父类对象援引来调用重回this的诀窍时,同样的,重回值也都指向了
调用该方法的 父类对象援用 所指向的子类对象;

 

Person类代码如下:

发表评论

电子邮件地址不会被公开。 必填项已用*标注