【Java】继承性-super关键字的使用【主线学习笔记】

文章目录


前言

Java是一门功能强大且广泛应用的编程语言,具有跨平台性和高效的执行速度,广受开发者喜爱。在接下来的学习过程中,我将记录学习过程中的基础语法、框架和实践技巧等,分享学习心得,对自己学习过程进行整理和总结,也希望能为其他学习Java的朋友提供一些帮助和参考。


super关键字的使用

继承性是面向对象编程(OOP)的核心特性之一,指的是一个类可以继承另一个类的属性和方法,从而在已有类的基础上创建新的类。继承使得子类可以复用父类的代码,同时也可以根据需要对父类的行为进行扩展或修改。

1、为什么需要super?

super关键字是Java中的一个特殊关键字,用于在子类中引用其直接父类的成员(如属性和方法)或构造函数。

有了super关键字以后就能够:

  • 访问父类的成员变量 (例如可以调用父类中与子类重名的属性)
  • 调用父类的方法 (例如可以调用父类中被重写的方法)
  • 调用父类的构造函数

关于super的几个常见的使用场景可见另一篇文章->

2、super的调用

super可以调用的结构有:属性、方法、构造器

super调用属性、方法(满足封装性的前提下)

如果子类和父类有相同名字的属性,为了区分子类中访问的是父类的成员变量还是子类的成员变量,可以使用super来显式访问父类的属性。

示例

java 复制代码
class Parent {
    int x = 10;
}

class Child extends Parent {
    int x = 20;

    void printX() {
        System.out.println("Child x = " + x); // 访问子类的x,20
        System.out.println("Parent x = " + super.x); // 访问父类的x,10
    }
}

在子类中重写了父类的方法后,如果仍然需要在某些情况下调用父类的原始方法,可以使用super来调用被重写的父类方法,示例:

java 复制代码
class Parent {
   // 父类方法
   void display() {
       System.out.println("Display from Parent");
   }
}

class Child extends Parent {
   // 重写父类方法
   @Override
   void display() {
       System.out.println("Display from Child");
   }

   void callParentDisplay() {
       // 在子类中调用父类的display方法
       super.display();
   }
}

public class Main {
   public static void main(String[] args) {
       Child child = new Child();

       // 调用子类的display方法
       child.display();//Display from Child

       // 调用子类中的独立方法,该方法调用了父类的display方法
       child.callParentDisplay();//Display from Parent
   }
}

特别说明

避免在子父类的成员变量之间采用完全相同的命名,使可读性降低

super调用构造器

  • 子类在继承父类时,不会继承父类的构造器,只能通过super(形参列表)的方式调用父类指定的构造器。
  • super(形参列表)必须声明在构造器的首行。
  • 在Java中,this 和 super 关键字不能同时出现在同一个构造器的同一行中:

this 和 super 的区别

this:用于调用同一类中的另一个构造器。this() 调用必须是构造器的第一行。

super:用于调用父类的构造器。super() 调用必须是构造器的第一行。

  • 如果在子类构造器首行既没有显示调用this(形参列表),也没有显示调用super(形参列表),那么子列的这个构造器就会默认调用super(),调用父类中空参的构造器。
  • 因此子类的任何一个构造器中,要么会调用本类中重载的构造器,要么会调用父类的构造器,只有这两种情况。

我们在调用子类构造器创建对象的时候,一定会在调用其构造器的过程中,直接或间接的调用父类构造器。由此,才会将父类中声明的属性或方法调用到内存中,供子类对象使用。


相关推荐
_Kayo_2 小时前
VUE2 学习笔记6 vue数据监测原理
vue.js·笔记·学习
YuTaoShao2 小时前
【LeetCode 热题 100】131. 分割回文串——回溯
java·算法·leetcode·深度优先
chenchihwen3 小时前
大模型应用班-第2课 DeepSeek使用与提示词工程课程重点 学习ollama 安装 用deepseek-r1:1.5b 分析PDF 内容
人工智能·学习
源码_V_saaskw3 小时前
JAVA图文短视频交友+自营商城系统源码支持小程序+Android+IOS+H5
java·微信小程序·小程序·uni-app·音视频·交友
超浪的晨3 小时前
Java UDP 通信详解:从基础到实战,彻底掌握无连接网络编程
java·开发语言·后端·学习·个人开发
双力臂4044 小时前
Spring Boot 单元测试进阶:JUnit5 + Mock测试与切片测试实战及覆盖率报告生成
java·spring boot·后端·单元测试
Edingbrugh.南空4 小时前
Aerospike与Redis深度对比:从架构到性能的全方位解析
java·开发语言·spring
QQ_4376643145 小时前
C++11 右值引用 Lambda 表达式
java·开发语言·c++
永卿0015 小时前
设计模式-迭代器模式
java·设计模式·迭代器模式
使二颗心免于哀伤5 小时前
《设计模式之禅》笔记摘录 - 10.装饰模式
笔记·设计模式