Java拾遗补阙 ----- Super、This关键字使用总结
一、前言:
该总结因"Java super关键字调用父类的方法疑惑"而成。
该疑惑为:
子类通过super.printA()调用父类的方法,而在父类的printA()中调用了printB(),这种情况下,调用的是子类的printB()方法。
public class SuperClass{public void printA(){System.out.print("SuperClass-printA\n");System.out.println(this.getClass().getName());printB(); //隐藏了this 可以写成this.printB()}public void printB(){System.out.print("SuperClass-printB\n");}
}
public class ChildClass extends SuperClass{public void printA(){System.out.print("ChildClass-printA\n");System.out.println(this.getClass().getName());super.printA();}public void printB(){System.out.print("ChildClass-printB\n");}public static void main(String[] args){ChildClass childClass = new ChildClass();childClass.printA();//SuperClass sc = new ChildClass();//sc.printA();}
}
运行结果为:
ChildClass-printA
com.wqc.test.ChildClass
SuperClass-printA
com.wqc.test.ChildClass
ChildClass-printB
从结果可以看出,执行super.printA()语句还是childClass对象。
疑惑原因:
困惑可能就是出在了对this关键字的理解上,此时的childClass对象的类型为ChildClass(此时this关键字指向类型为ChildClass的childClass对象),调用printA()方法首先输出ChildClass-printA,代码继续执行,遇到super.printA(),走到父类的printA()方法中,首先按照顺序执行到printB(),因为方法里有 一个隐藏的this指针,所以可以把printB()看作this.printB(),上面说过此时的this指向的是类型为ChildClass的childClass对象 所以去到ChildClass中去找printB()方法,如果有printB()就去执行,如果没有就父类中找(也就是SuperClass类中的printB()),如果SuperClass类中还没有printB()方法(当然SuperClass中一定会有,否则代码编译不过),就会继续向上找,直到Object类。 所以按照现在这样的情况,printB() 真正执行的代码是ChildClass类中的printB()方法,对应输出为ChildClass-printB。
二、this详解
1、this
this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针。
2、作用
在Java中,this关键字的作用和其词义很接近.
1)、它在方法内部使用,即这个方法所属对象的引用;(这个可以解释前言中的疑惑)
2)、普通方法中,this总是指向调用该方法的对象;
3)、它在构造器内部使用,表示该构造器正在初始化的对象;
4)、构造方法中,this总是指向正要初始化的对象;
5)、this表示当前对象,this可以用来修饰属性、方法、构造器
6)、this理解为当前对象或当前正在创建的对象。比如:this.name,this.info();
3、注意
1)、this不能用于static方法,在static方法中不可以访问非static的成员。
2)、通过this调用其它构造方法,必须位于方法第一句。
4、什么时候使用this关键字呢?
- 当在方法内需要用到调用该方法的对象时,就用this。
- 当形参与成员变量重名时,如果在方法内部需要使用成员变量,必须添加this来表明该变量是类成员
- 在任意方法内,如果使用当前类的成员变量或成员方法可以在其前面添加this,增强程序的阅读性
三、super详解
1、super
错误理解:super可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类。
2、作用
Java中的super关键字,在Java类中使用super关键字来调用父类中的指定操作:
1)、super可用于访问父类中定义的属性
2)、super可用于调用父类中定义的成员方法
3)、super可用于在子类构造方法中调用父类的构造器
3、注意
1)、尤其当子类出现同名成员时,可以用super进行区分
2)、super的追溯不仅限于直接父类,还可以是上上层父类
3)、super和this的用法相像,this代表本类对象的引用,super代表父类的内存空间的标识
4)、super不能用于static方法,在static方法中不可以访问非static的成员。
4、什么时候使用super
1)、当子类与父类中有同名的属性时,可以通过"super.属性"显示的调用父类中声明的属性
2)、若想调用子类的同名的属性,可以通过"this.属性"
3)、当子类重写父类的方法以后,在子类中若想再显示的调用父类的被重写的方法,就需要使用"super.方法"
4)、super修饰构造器:通过在子类中使用"super(形参列表)"来显示的调用父类中指定的构造器:
在构造器内部,“super(形参列表)”必须要声明在首行
在构造器内部,“this(形参列表)”或“super(形参列表)”只能出现一个
当构造器中,不显示的调用“this(形参列表)”或“super(形参列表)”其中任何一个,默认调用的是父类空参的构造器
四、this和super的区别
1、访问属性
this访问本类中的属性,如果本类没有此属性则从父类中继续查找;super访问父类中的属性
2、调用方法
this访问本类中的方法;super直接访问父类中的方法
3、调用构造器
this调用本类构造器,必须放在构造器的首行;super调用父类构造器,必须放在子类构造器的首行
4、特殊
this表示当前对象;super无此概念
5、两者都不能用于static中
五、详细说明
1、super
class Student {public int age;public void std(){ //声明Student类的方法std()age = 15;System.out.println("学生平均年龄为:"+age);}
}class ThisStudent extends Student{public int age;public void std(){super.std(); //使用super作为父类对象的引用对象来调用父类对象里面的Std()方法age = 18;System.out.println("这个学生的年龄为:"+age);System.out.println(super.age); //使用super作为父类对象的引用对象来调用父类对象中的age值System.out.println(age);}
}public class TestDif {public static void main(String[] args) {ThisStudent a = new ThisStudent();a.std();}
}
执行结果:
学生平均年龄为:15
这个学生的年龄为:18
15
18
2、分析
ThisStudent a = new ThisStudent();
程序执行到这里时,首先在栈空间里面会产生一个变量a,a里面的值是什么这不好说,总而言之,通过这个值我们可以找到new出来的ThisStudent对象。由于子类ThisStudent是从父类Student继承下来的,所以当我们new一个子类对象的时候,这个子类对象里面会包含有一个父类对象,而这个父类对象拥有他自身的属性age。这个age成员变量在Student类里面声明的时候并没有对他进行初始化,所以系统默认给它初始化为0,成员变量(在类里面声明)在声明时可以不给它初始化,编译器会自动给这个成员变量初始化,但局部变量(在方法里面声明)在声明时一定要给它初始化,因为编译器不会自动给局部变量初始化,任何变量在使用之前必须对它进行初始化。
子类在继承父类age属性的同时,自己也单独定义了一个age属性,所以当我们new出一个子类对象的时候,这个对象会有两个age属性,一个是从父类继承下来的age,另一个是自己的age。在子类里定义的成员变量age在声明时也没有给它初始化,所以编译器默认给它初始化为0。因此,执行完第一句话以后,系统内存的布局如下图所示:
a.std();
当new一个对象出来的时候,这个对象会产生一个this的引用,这个this引用指向对象自身。如果new出来的对象是一个子类对象的话,那么这个子类对象里面还会有一个super引用,这个super指向当前对象里面的父对象。所以相当于程序里面有一个this,this指向对象自己,还有一个super,super指向当前对象里面的父对象。
这里调用重写之后的std()方法,方法体内的第一句话:“super.std();”是让这个子类对象里面的父对象自己调用自己的f()方法去改变自己age属性的值,父对象通过指向他的引用super来调用自己的std()方法,所以执行完这一句以后,父对象里面的age的值变成了15。接着执行“age=18;”这里的age是子类对象自己声明的value,不是从父类继承下来的那个age。所以这句话执行完毕后,子类对象自己本身的age值变成了18。此时的内存布局如下图所示:
方法体内的最后三句话都是执行打印age值的命令,前两句打印出来的是子类对象自己的那个age值,因此打印出来的结果为18,最后一句话打印的是这个子类对象里面的父类对象自己的age值,打印出来的结果为15。
到此,整个内存分析就结束了,最终内存显示的结果如上面所示。
Java拾遗补阙 ----- Super、This关键字使用总结相关推荐
- Java中super关键字及super()的使用
Java中super关键字及super()的使用: 1.super的使用: (1)super是一个关键字. (2)super和this很类似,我们对比着学习. 2.先复习一下this关键字的使用. ( ...
- Java中super关键字详解
Java中super关键字详解 super有什么用? super什么时候不可以省略呢? super在内存图中是如何存在的呢? super使用时的注意事项 super有什么用? (1)当子类中构造方法第 ...
- Java中super关键字及其作用
Java中super关键字及其作用 super关键字及其作用 A:super关键字指代父类对象引用(super代表父类存储空间的标识) B:作用: a:访问被子类隐藏的父类同名成员变量和成员方法 : ...
- java中super关键字_java中super关键字有什么用法
Java中在执行子类的构造方法之前或者子类没有明确指定构造方法,会自动调用父类的无参构造方法. (视频教程推荐:java课程) super的三种使用情况: 访问父类方法中被覆盖的方法. 调用父类构造方 ...
- Java中的static关键字详解
** Java中的static关键字详解 ** 在一个类中定义一个方法为static,即静态的,那就是说无需本类的对象就可以调用此方法.调用一个静态方法就是 "类名.方法名" ,静 ...
- Java 中这些常用关键字,总有那么些被你遗忘的
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:2 个月的面试亲身经历告诉大家,如何进入 BAT 等大厂? 我们知道 Java 中是有保留关键字的,到目前为止大 ...
- Java基础之static关键字的用法
Java中的static关键字主要用于内存管理.我们可以应用static关键字在变量.方法.块和嵌套类中. static关键字属于类,而不是类的实例. 静态(static)可以是: 变 ...
- java继承类型的用法_详解Java中使用externds关键字继承类的用法
理解继承是理解面向对象程序设计的关键.在Java中,通过关键字extends继承一个已有的类,被继承的类称为父类(超类,基类),新的类称为子类(派生类).在Java中不允许多继承. (1)继承 cla ...
- 继承extends ,this super final 关键字,abstract抽象类,override方法重写
继承extends 私有成员不能被继承 总结:子类方法中,使用变量的原则是:就近原则 1 package review06; 2 /* 3 私有成员不能被继承 4 子类和父类有同名的成员变量:在子类 ...
- java里面super(),Java中super
Java中super 1. super代表父类?代表父类的对象?还是代表父类的引用?为什么super()在构造方法,super.fun()在方法能用?个人认为应该是super表示对象才能这么调用,可父 ...
最新文章
- Python 三十大实践、建议和技巧
- SQL Server CE學習篇
- C中堆管理—浅谈malloc,free,calloc,realloc函数之间的区别
- Cloudify — OpenStack Infrastructure Plugin V3
- java反射的性能问题
- uboot中的中断macro宏
- 第二弹:超全Python学习资源整理(进阶系列)
- STM32(三)-------流水灯(标准库函数)
- 机器学习之熵【从定义到代码】
- linux的vmstat命令,Linux中vmstat命令起什么作用呢?
- 国军标-Gjb软件设计说明书模板
- 网站百度快速排名软件系统
- java去处科学技术法,java撤销科学计数法
- 日期转毫秒,毫秒转日期
- 硬盘的修复(二)电脑引导出错的维护
- 【鼠标事件 MouseEvent】clientX clientY offsetX offsetX pageX screenX screenY
- Joint Discriminative and Generative Learning for Person Re-identification
- Linux使用vi修改、删除、保存文件
- 为什么说vivo S7才是5G轻薄旗舰的正确打开方式
- 支付宝:验签出错,建议检查签名字符串或私钥与应用公钥是否匹配,网关生成的验签字符串为...
热门文章
- 台北宇珍2021春拍捷报,美国博物馆专拍创下白手套佳绩
- 【日常】关于爬虫中iframe节点处理小结(以超星课件下载为例)
- ssh 整合TOMCAT启动遇到错误
- HDOJ 5142 NPY and FFT 水
- 2020-07-16-----web前端开发中用到的PS基础操作(PS取色、PS测量、PS切片)
- 阿涛读书之——《坏血》
- [已解决]datetime.date is coerced to a datetime. In the future pandas will not coerce, and ‘the values
- html动态生成tr标签,JS动态添加tr元素
- 关于power apps
- wps excel查找不定位_Excel查找、替换和定位