• super关键字


    1、super

    (1)super是一个关键字。

    (2)super和this很类似,我们对比着学习。

    2、先复习一下this关键字的使用。

    (1)this能出现在实例方法和构造方法中;
    (2)this的语法是“this.”和“this()”;
    (3)this不能出现在静态方法中;
    (4)this大部分情况下是可以省略的;
    (5)this.什么时候不能省略呢?

    1. Public void setName(String name){
    2. this.name = name;
    3. }
    4. // 在区分局部变量和实例变量时this不能省略

    (6)this()只能出现在构造方法的第一行,通过当前的构造方法去调用“本类”中其他构造方法,目的是:代码复用。

    3、super关键字:

    (1)super能出现在实例方法和构造方法中。

    (2)super的语法是“super.”和“super()”。

    (3) super不能出现在静态方法中。

    (4) super大部分情况下是可以省略的。

    (5)super.什么时候不能省略呢?

    当在子类对象中,子类想访问父类的东西,可以使用“super.”的方式访问。例如:方法覆盖后,子类内部虽然重写了父类的方法,但子类也想使用一下父类的被覆盖的方法,此时可以使用“super.”的方式。当子类中出现和父类一样的属性或者方法,此时,你要想去调用父类的那个属性或者方法,此时“super.”不能省略。
    (5)super()只能出现在构造方法的第一行,通过当前的构造方法去调用“父类”中的对应的构造方法,目的是:创建子类对象时,先初始化父类型特征。

    4.当子类的构造方法内第一行没有super()与this()时,系统会默认给它加上无参数的super()去调用父类的无参数构造,所以建议无参构造手动写出来

    1. public class Super {
    2. public static void main(String[] args) {
    3. // 创建子类对象
    4. new B();
    5. // 这是A类的无参构造
    6. // 这是B类的无参构造
    7. }
    8. }
    9. class A{
    10. public A(){
    11. System.out.println("这是A类的无参构造");
    12. }
    13. }
    14. class B extends A{
    15. public B(){
    16. //省略super()与this()默认有super()
    17. System.out.println("这是B类的无参构造");
    18. }
    19. }

    5.this与super不能共存(因为他们都只能出现在第一行)

    1. class A{
    2. public A(){
    3. System.out.println("这是A类的无参构造");
    4. }
    5. }
    6. class B extends A{
    7. public B(){
    8. this("wy");
    9. super();//Error:(18, 14) java: 对super的调用必须是构造器中的第一个语句
    10. System.out.println("这是B类的无参构造");
    11. }
    12. public B(String name){
    13. System.out.println("这是B类的有参构造");
    14. }
    15. }

    6.子类创建对象时父类的构造方法一定会执行且先执行,模拟的现实生活中有子必先有父

    1. public class Super {
    2. public static void main(String[] args) {
    3. //创建子类对象
    4. new B();
    5. //输出结果:
    6. // 这是A类的无参构造
    7. // 这是B类的有参构造
    8. // 这是B类的无参构造
    9. }
    10. }
    11. class A{
    12. public A(){
    13. System.out.println("这是A类的无参构造");
    14. }
    15. }
    16. class B extends A{
    17. public B(){
    18. this("wy");//这里调用本类的有参构造
    19. System.out.println("这是B类的无参构造");
    20. }
    21. public B(String name){
    22. //默认调用父类的无参构造
    23. System.out.println("这是B类的有参构造");
    24. }
    25. }

    7.super()的使用

    子类对象调用父类的属性可以用get与set方法进行访问与赋值,但是如果需要在创建对象时候就要赋值就要用到我们的有参构造

    1. class A{
    2. private String name;
    3. private int age;
    4. //构造方法
    5. public A(){
    6. }
    7. public A(String name, int age) {
    8. this.name = name;
    9. this.age = age;
    10. }
    11. //set、get方法
    12. public String getName() {
    13. return name;
    14. }
    15. public void setName(String name) {
    16. this.name = name;
    17. }
    18. public int getAge() {
    19. return age;
    20. }
    21. public void setAge(int age) {
    22. this.age = age;
    23. }
    24. }
    25. class B extends A{
    26. private String sex;
    27. public B(){
    28. }
    29. public B(String sex,String name,int age){
    30. super(name,age);//调用父类的有参构造
    31. this.sex=sex;
    32. }
    33. //get、set方法
    34. public String getSex() {
    35. return sex;
    36. }
    37. public void setSex(String sex) {
    38. this.sex = sex;
    39. }
    40. }
    41. public class text {
    42. public static void main(String[] args) {
    43. B b=new B("男","张三丰",20);
    44. //重点看B类的有参构造
    45. }
    46. }

    8.super.的使用

    使用super.访问父类被覆盖的方法:

    因为方法被覆盖,子类对象无法直接访问父类覆盖的方法,但是可以通过子类独有的方法访问父类被覆盖的方法
    1. class Animal{
    2. public void move(){
    3. System.out.println("Animal move");
    4. }
    5. }
    6. class Cat extends Animal{
    7. public void move(){
    8. System.out.println("Cat move");
    9. }
    10. //访问父类被覆盖的方法:因为方法被覆盖,子类对象不能直接访问父类覆盖的方法,但是可以通过子类独有的方法访问父类被覆盖的方法
    11. public void some(){
    12. super.move();
    13. }
    14. }
    15. public class text {
    16. public static void main(String[] args) {
    17. Cat cat=new Cat();
    18. cat.move();//Cat move
    19. cat.some();///Animal move
    20. }
    21. }

    使用super.访问与父类重名的属性:

     注意:父类重名的属性不可以封装

    1. class Animal{
    2. String name;
    3. public Animal(){
    4. }
    5. public Animal(String name){
    6. this.name=name;
    7. }
    8. }
    9. class Cat extends Animal{
    10. private String name;
    11. public Cat(){
    12. }
    13. public Cat(String name){
    14. super(name);
    15. //this.name=name;
    16. }
    17. public void some(){
    18. System.out.println(this.name);//因为子类的有参构造将参数传给了父类,所以子类这里是null
    19. System.out.println(super.name);
    20. }
    21. }
    22. public class text {
    23. public static void main(String[] args) {
    24. Cat cat=new Cat("狸花猫");
    25. cat.some();
    26. }
    27. }
    28. //输出结果:
    29. //null
    30. //狸花猫

  • 相关阅读:
    场景应用:利用Redis实现分布式Session
    【LinuxC语言】手撕Http之处理POST请求
    双目标定之张正友标定法数学原理详解matlab版
    【原创】CPU性能优化小记
    22-数据结构-内部排序-选择排序
    npm i 的时候--save 与 --save-dev
    【LeetCode每日一题】——540.有序数组中的单一元素
    《统计学习方法》 第十六章 主成分分析PCA
    Unity常用模块设计 : Unity游戏排行榜的制作与优化
    110. 平衡二叉树
  • 原文地址:https://blog.csdn.net/m0_71673753/article/details/128098385