Java this与super的仇与恨
刚开始学习面向对象的时候,看到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的仇与恨的更多相关文章
- JAVA之关于super的用法
JAVA之关于super的用法 路漫漫其修远兮,吾将上下而求索.——屈原<离骚> 昨天写this用法总结的时候,突然产生了一个问题,请教别人之后,有了自己的一点认识.还是把它写下来,为 ...
- Java关键字(六)——super
在 Java关键字(五)——this 中我们说 this 关键字是表示当前对象的引用.而 Java 中的 super 关键字则是表示 父类对象的引用. 我们分析这句话“父类对象的引用”,那说明我们使用 ...
- java中关键字super
super关键字的作用 java中的super关键字是一个引用变量,用于引用父类对象.关键字“super”以继承的概念出现在类中. 主要用于以下情况:1.调用父类的方法 2.调用父类的变量 3. ...
- Java中的super与this解析
好了,现在开始讨论this&super这两个关键字的意义和用法. 在Java中,this通常指当前对象,super则指父类的.当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象 ...
- Java基础(51):Super与this的区别
1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位. class Base { Base() { System.out.println("Base" ...
- Java中关键字super与this的区别
一.super关键字 在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象.怎么去引 ...
- java泛型中? super T和? extends T的区别
<? super T>表示包括T在内的任何T的父类,<? extends T>表示包括T在内的任何T的子类;请记住PECS原则:生产者(Producer)使用extends,消 ...
- Java中的super()使用注意
1)super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句)2)this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句)3)super: 它引用当前对象的 ...
- [Java学习]面向对象-super关键字;final关键字
super关键字 super代表的是当前子类对象中的父类型特征,可以看做是this的一部分.与this不同,不是引用,不存储对象内存地址. super可以用在什么位置 1 可以用在成员方法中.不能用在 ...
随机推荐
- 【深度学习系列】卷积神经网络CNN原理详解(一)——基本原理
上篇文章我们给出了用paddlepaddle来做手写数字识别的示例,并对网络结构进行到了调整,提高了识别的精度.有的同学表示不是很理解原理,为什么传统的机器学习算法,简单的神经网络(如多层感知机)都可 ...
- Odd-e CSD Course Day 4
今天有一部分是透過 Code Review 來引發我們對於下面幾個方向的想法 Good Unit Tests 在今天的 Code Review 裡,Stanly 翻出了一個我們寫的 Unit Test ...
- Oracle游标的使用示例
此文是使用Oracle游标的几种方式,for...in会自动打开游标,fetch...into需要手动打开游标,游标类似于一个只会往前移动的指针,每次指向数据集中的一行数据,通过游标可以打开数据集,也 ...
- Aspose.Word邮件合并之自定义数据源
Aspose.Word在进行邮件合并时,默认的几个重载方法对Database支持比较友好,但是也可以通过自定义数据源来实现从集合或者对象中返回数据进行邮件合并. 自定义数据源主要是通过实现IMailM ...
- JavaScript 条件语句
if语句 有些代码块只能在一定条件下运行,通过if.if else.else代码块,可以让你的代码按条件执行. // 控制流 var foo = true; var bar = false; ...
- 设计模式之代理模式(Proxy)(2)
代理模式是为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用,其特征是代理类与委托类有同样的接口. ...
- charles抓包出现乱码 SSL Proxying not enabled for this host:enable in Proxy Setting,SSL locations
1.情景:抓包的域名下 全部是unknown,右侧出现了乱码 2.查看unknown的notes里面:SSL Proxying not enabled for this host:enable in ...
- vue项目利用apicloud打包成apk过程
最近公司要求我们用apicloud做一个app,正好利用这个机会学习下app的制作过程~ 页面的开发过程跟我们平时开发一样,利用vue把页面全部完成,最后进行npm run build将项目打包. 接 ...
- float与double
对数值类型的细节了解在大学里就是一带而过,自己始终也没好好看过.这是在csdn上看到的一篇文章,挺好的,记录下来. https://blog.csdn.net/Demon__Hunter/articl ...
- 利用自定义View实现扫雷游戏
游戏规则: 简单版的扫雷事实上就是一个9×9的矩阵,其中有十个点是雷,非雷方块的数字代表该方块周围八个方块中雷的个数.通过长按某一方块(方块会变红)认定该方块为玩家认为的雷,通过短按某一方块来“展开” ...