一、前言:

该总结因"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不是一个对象的引用,不能将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的区别

从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。(这个跟第五部分有矛盾,详见第五部分中的粗体部分)

1、访问属性

this访问本类中的属性,如果本类没有此属性则从父类中继续查找;super访问父类中的属性

2、调用方法

this访问本类中的方法;super直接访问父类中的方法

3、调用构造器

this调用本类构造器,必须放在构造器的首行;super调用父类构造器,必须放在子类构造器的首行

4、特殊

this表示当前对象;super无此概念

5、两者都不能用于static中

五、详细说明

1、super

在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。怎么去引用里面的父类对象呢?使用super来引用,this指的是当前对象的引用,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关键字使用总结相关推荐

  1. Java中super关键字及super()的使用

    Java中super关键字及super()的使用: 1.super的使用: (1)super是一个关键字. (2)super和this很类似,我们对比着学习. 2.先复习一下this关键字的使用. ( ...

  2. Java中super关键字详解

    Java中super关键字详解 super有什么用? super什么时候不可以省略呢? super在内存图中是如何存在的呢? super使用时的注意事项 super有什么用? (1)当子类中构造方法第 ...

  3. Java中super关键字及其作用

    Java中super关键字及其作用 super关键字及其作用 A:super关键字指代父类对象引用(super代表父类存储空间的标识) B:作用: a:访问被子类隐藏的父类同名成员变量和成员方法 : ...

  4. java中super关键字_java中super关键字有什么用法

    Java中在执行子类的构造方法之前或者子类没有明确指定构造方法,会自动调用父类的无参构造方法. (视频教程推荐:java课程) super的三种使用情况: 访问父类方法中被覆盖的方法. 调用父类构造方 ...

  5. Java中的static关键字详解

    ** Java中的static关键字详解 ** 在一个类中定义一个方法为static,即静态的,那就是说无需本类的对象就可以调用此方法.调用一个静态方法就是 "类名.方法名" ,静 ...

  6. Java 中这些常用关键字,总有那么些被你遗忘的

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:2 个月的面试亲身经历告诉大家,如何进入 BAT 等大厂? 我们知道 Java 中是有保留关键字的,到目前为止大 ...

  7. Java基础之static关键字的用法

    Java中的static关键字主要用于内存管理.我们可以应用static关键字在变量.方法.块和嵌套类中. static关键字属于类,而不是类的实例.         静态(static)可以是: 变 ...

  8. java继承类型的用法_详解Java中使用externds关键字继承类的用法

    理解继承是理解面向对象程序设计的关键.在Java中,通过关键字extends继承一个已有的类,被继承的类称为父类(超类,基类),新的类称为子类(派生类).在Java中不允许多继承. (1)继承 cla ...

  9. 继承extends ,this super final 关键字,abstract抽象类,override方法重写

    继承extends 私有成员不能被继承  总结:子类方法中,使用变量的原则是:就近原则 1 package review06; 2 /* 3 私有成员不能被继承 4 子类和父类有同名的成员变量:在子类 ...

  10. java里面super(),Java中super

    Java中super 1. super代表父类?代表父类的对象?还是代表父类的引用?为什么super()在构造方法,super.fun()在方法能用?个人认为应该是super表示对象才能这么调用,可父 ...

最新文章

  1. Python 三十大实践、建议和技巧
  2. SQL Server CE學習篇
  3. C中堆管理—浅谈malloc,free,calloc,realloc函数之间的区别
  4. Cloudify — OpenStack Infrastructure Plugin V3
  5. java反射的性能问题
  6. uboot中的中断macro宏
  7. 第二弹:超全Python学习资源整理(进阶系列)
  8. STM32(三)-------流水灯(标准库函数)
  9. 机器学习之熵【从定义到代码】
  10. linux的vmstat命令,Linux中vmstat命令起什么作用呢?
  11. 国军标-Gjb软件设计说明书模板
  12. 网站百度快速排名软件系统
  13. java去处科学技术法,java撤销科学计数法
  14. 日期转毫秒,毫秒转日期
  15. 硬盘的修复(二)电脑引导出错的维护
  16. 【鼠标事件 MouseEvent】clientX clientY offsetX offsetX pageX screenX screenY
  17. Joint Discriminative and Generative Learning for Person Re-identification
  18. Linux使用vi修改、删除、保存文件
  19. 为什么说vivo S7才是5G轻薄旗舰的正确打开方式
  20. 支付宝:验签出错,建议检查签名字符串或私钥与应用公钥是否匹配,网关生成的验签字符串为...

热门文章

  1. 台北宇珍2021春拍捷报,美国博物馆专拍创下白手套佳绩
  2. 【日常】关于爬虫中iframe节点处理小结(以超星课件下载为例)
  3. ssh 整合TOMCAT启动遇到错误
  4. HDOJ 5142 NPY and FFT 水
  5. 2020-07-16-----web前端开发中用到的PS基础操作(PS取色、PS测量、PS切片)
  6. 阿涛读书之——《坏血》
  7. [已解决]datetime.date is coerced to a datetime. In the future pandas will not coerce, and ‘the values
  8. html动态生成tr标签,JS动态添加tr元素
  9. 关于power apps
  10. wps excel查找不定位_Excel查找、替换和定位