刚开始学习面向对象的时候,看到this和super觉得this就是指当前对象,super指最近的父级对象。觉得用处不大。

后来,随着学习的深入,看别人的代码越来越多,发现this和super的使用率贼高~,就决定深入的了解一下这俩兄弟。

既然设计到继承和对象,我们就可以从JVM的堆栈的角度去分析。

首先,当我们创建一个子类的时候,在堆中的子类对象一定包含着其继承的父类对象。如果子类和父类都包含名字为value的成员变量。我们可以用this和super来进行操作。

老规矩,show you my code。代码中参悟。

父类:

public class Father {
int value; public void val() {
value = 10;
System.out.println("Father'value is" + value);
}
}

子类:

public class Child extends Father {
int value; public void dirValue() {
value = 20;
System.out.println("Child'value is " + value);
// 这时候应该为0
System.out.println("子类中没有调用super的Father" + super.value);
super.val();
// 这个时候应该为10
System.out.println("子类中调用super之后的Father" + super.value);
System.out.println("Child'value is" + value);
}
}

客户端:

public class Client {
public static void main(String[] args) {
Child child = new Child();
child.dirValue();
}
}

输出结果:

分析:

当客户端创建子类的时,堆栈中的存储结构是这样的~

执行new child实例的时候:

    栈                 堆

   child  ——》 Child对象(包含Father对象)

                       Child本身包含一个value的成员变量

         Child中的Father对象也含有一个value的成员变量

当程序执行到child.dirValue()的时候:

先给value成员变量赋值,这个时候是给自己对象中的value赋值。

super.value,这个是指向这个child中Father对象的value,因为没有给其赋值,编译器会自动给其初始化为0。

调用Father的中的方法,方法打印还有给Father对象value赋值。

最后为了检验对父类的操作没有影响到子类的value值。

总结:

this:

this是指向当前的对象,其本质就是一个指针了。

this可以用于当成员变量的名称和参数相冲突的时候用this.成员变量来指定。

this可以用于构造函数之中,用来引用其他的构造函数。(必须是第一行)

super:

super是指向当前对象里的父类的对象。(super在Java中是个关键词)

子类构造方法用了super指的是调用父类中的构造方法。

   

Java this与super的仇与恨的更多相关文章

  1. JAVA之关于super的用法

    JAVA之关于super的用法   路漫漫其修远兮,吾将上下而求索.——屈原<离骚> 昨天写this用法总结的时候,突然产生了一个问题,请教别人之后,有了自己的一点认识.还是把它写下来,为 ...

  2. Java关键字(六)——super

    在 Java关键字(五)——this 中我们说 this 关键字是表示当前对象的引用.而 Java 中的 super 关键字则是表示 父类对象的引用. 我们分析这句话“父类对象的引用”,那说明我们使用 ...

  3. java中关键字super

    super关键字的作用 java中的super关键字是一个引用变量,用于引用父类对象.关键字“super”以继承的概念出现在类中. 主要用于以下情况:1.调用父类的方法   2.调用父类的变量  3. ...

  4. Java中的super与this解析

    好了,现在开始讨论this&super这两个关键字的意义和用法. 在Java中,this通常指当前对象,super则指父类的.当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象 ...

  5. Java基础(51):Super与this的区别

    1.     子类的构造函数如果要引用super的话,必须把super放在函数的首位. class Base { Base() { System.out.println("Base" ...

  6. Java中关键字super与this的区别

    一.super关键字 在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象.怎么去引 ...

  7. java泛型中? super T和? extends T的区别

    <? super T>表示包括T在内的任何T的父类,<? extends T>表示包括T在内的任何T的子类;请记住PECS原则:生产者(Producer)使用extends,消 ...

  8. Java中的super()使用注意

    1)super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句)2)this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句)3)super: 它引用当前对象的 ...

  9. [Java学习]面向对象-super关键字;final关键字

    super关键字 super代表的是当前子类对象中的父类型特征,可以看做是this的一部分.与this不同,不是引用,不存储对象内存地址. super可以用在什么位置 1 可以用在成员方法中.不能用在 ...

随机推荐

  1. [转]快速新建简单的koa2后端服务

    本文转自:https://blog.csdn.net/saucxs/article/details/83788259 既然前端工程化是基于NodeJS,那么选择NodeJs做前后端分离部署也是理所应当 ...

  2. [心得] SQL Server Partition(表分區) 資料分佈探討

    最近在群裡有個朋友問了個問題是這樣的 用户表有一千多万行,主键是用户ID,我做了分区.但经常查询时,其它的表根据用户ID来关联,这样跨区查询,reads非常高.有什么好的处理办法?不分区的话,索引维护 ...

  3. (摘)sql-索引的作用(超详细)

    (一)深入浅出理解索引结构 实际上,您可以把索引理解为一种特殊的目录.微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引.簇集索引)和非聚集索引(nonc ...

  4. FastReport 循环打印表格数据

    1,在UI上拖放一个表格控件 2.设置表格头部信息,需要显示的数据以及边框颜色 3.选中表格控件设置事件代码: private void Table1_ManualBuild(object sende ...

  5. JAVA_接口_默认方法&静态方法

    1.小结(注意): 1.接口中无法定义成员变量,但是可以定义常量,其值不可以改变,默认使用public static final修饰 2.接口中,没有构造方法,不能创建对象 3.接口中,没有静态代码块 ...

  6. 驰骋工作流引擎JFlow与activiti的对比之2种结构化模式

    1. 任意循环(Arbitrary Cycles) ACTIVITI : 某一个或多个活动可以反复执行. 例子:用户买了瓶汽水,拿到汽水后,中了一瓶,又去兑换了一瓶汽水,如果又中了,再去兑换一瓶汽水- ...

  7. BGP: 容易实现路由备份,不容易实现等价负载均衡。

    一.结论: 1.BGP只能建立备份路由,不能建立等价路由. 2.BGP按照下面的规则进行优选路由. BGP选择路由的策略 当到达同一目的地存在多条路由时,BGP依次对比下列属性来选择路由: 优选协议首 ...

  8. 关于Keychain

    1.Keychain 浅析 2.iOS的密码管理系统 Keychain的介绍和使用 3.iOS开发中,唯一标识的解决方案之keyChain+UUID

  9. C# MessageBox自动关闭

    本文以一个简单的小例子,介绍如何让MessageBox弹出的对话框,在几秒钟内自动关闭.特别是一些第三方插件(如:dll)弹出的对话框,最为适用.本文仅供学习分享使用,如有不足之处,还请指正. 概述 ...

  10. MySQL5.5.51启用网络远程连接

    在其它电脑主机上访问时提示host ip is not allowed to connect to this mysql 下面代码为解决该问题的方法: :\Program Files\mysql-\b ...