Java学习教程,从入门到精通,Java中super关键字的语法知识点及案例(31)

news2024/11/17 5:38:58

Java中super关键字的语法知识点及案例

1. 定义

super是Java中的一个关键字,主要用于引用当前对象的父类或超类。通过super,可以在子类中访问父类的成员变量、方法和构造函数。

2. 主要用途
  • 访问父类的成员变量:当子类与父类有同名的成员变量时,可以使用super关键字来明确访问父类的成员变量。
  • 调用父类的构造方法:在子类的构造方法中,可以使用super关键字来调用父类的构造方法,以初始化父类的成员变量或执行父类构造函数的逻辑。
  • 调用父类的方法:在子类中,可以通过super关键字调用父类的方法,特别是在子类重写了父类的方法时,仍然可以通过super来调用父类的方法。
3. 使用场景与注意事项
  • 构造方法中的使用:super()只能出现在子类构造方法的第一行,用于调用父类的构造方法。如果子类构造方法中没有显式调用super()或this(),系统会默认调用父类的无参数构造方法。
  • 不能用于静态方法:super关键字不能用于静态方法中。
  • this()和super()不能共存:在构造方法中,this()和super()不能同时出现,它们都是只能出现在构造方法的第一行。
4. 案例代码

案例一:访问父类的成员变量

class Parent {
    int x = 10;
}

class Child extends Parent {
    int x = 20;
    void display() {
        System.out.println(super.x); // 访问父类的x变量,输出10
        System.out.println(this.x);  // 访问子类的x变量,输出20
    }
}

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

案例二:调用父类的构造方法

class Parent {
    int x;
    Parent(int x) {
        this.x = x;
    }
}

class Child extends Parent {
    int y;
    Child(int x, int y) {
        super(x); // 调用父类构造函数,将x赋值
        this.y = y;
    }

    @Override
    public String toString() {
        return "Child{" + "y=" + y + ", x=" + x + '}';
    }
}

public class Main {
    public static void main(String[] args) {
        Child child = new Child(10, 20);
        System.out.println(child.toString());
    }
}

案例三:调用父类的方法

class Parent {
    void print() {
        System.out.println("Parent's print method");
    }
}

class Child extends Parent {
    @Override
    void print() {
        super.print(); // 调用父类的print方法
        System.out.println("Child's print method");
    }
}

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

案例四:子类与父类有同名的成员变量

class Animal {
    String name = "Animal";
}

class Dog extends Animal {
    String name = "Dog";

    void printNames() {
        System.out.println(super.name); // 输出父类Animal的name
        System.out.println(this.name);  // 输出子类Dog的name
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.printNames();
    }
}

案例五:子类构造方法调用父类构造方法并初始化成员变量

class Animal {
    String name;

    public Animal(String name) {
        this.name = name;
    }

    public void eat() {
        System.out.println(name + " is eating");
    }
}

class Dog extends Animal {
    String breed;

    public Dog(String name, String breed) {
        super(name); // 调用父类Animal的构造方法
        this.breed = breed;
    }

    public void bark() {
        System.out.println(name + " is barking");
    }

    @Override
    public void eat() {
        super.eat(); // 调用父类Animal的eat方法
        System.out.println(name + " is eating bones");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog("Rex", "Labrador");
        dog.eat(); // 调用子类Dog的eat方法
        dog.bark(); // 调用子类Dog的bark方法
    }
}

通过以上案例代码,可以更清晰地理解super关键字在Java中的使用方法和场景。

当然可以,以下是一些额外的关于super关键字的例子,这些例子将展示super在不同情境下的应用。

例子一:在多重继承链中使用super

虽然Java不支持多重继承(即一个类不能同时继承多个类),但可以通过继承的传递性(一个类继承自另一个已经继承自其他类的类)来模拟多重继承的效果。在这种情况下,super可以用来引用直接父类或更远的祖先类。

class Grandparent {
    void display() {
        System.out.println("Grandparent display()");
    }
}

class Parent extends Grandparent {
    @Override
    void display() {
        System.out.println("Parent display()");
    }
}

class Child extends Parent {
    @Override
    void display() {
        super.display(); // 调用直接父类Parent的display()
        // 如果想调用Grandparent的display(),可以使用以下方式(但不直接通过super)
        // ((Grandparent)this).display(); // 强制类型转换,不推荐这样做,因为它破坏了封装性
        // 一个更好的做法是在Parent类中调用Grandparent的display()
    }

    void callGrandparentDisplay() {
        // 在这里,我们假设Parent类已经正确地调用了Grandparent的display()
        super.display(); // 这将调用Parent的display(),而Parent可以进一步调用Grandparent的
    }
}

// 注意:在Child类中直接调用Grandparent的display()通常不是最佳实践。
// 更好的做法是在Parent类中处理这种调用,或者在Child类中通过其他方式(如方法参数、组合等)来实现。

public class Main {
    public static void main(String[] args) {
        Child child = new Child();
        child.display(); // 输出:Parent display()
        // child.callGrandparentDisplay(); // 这将仍然输出:Parent display(),因为Parent没有调用Grandparent的
    }
}

// 为了完整性,我们可以修改Parent类来正确调用Grandparent的display()
class ParentExtended extends Grandparent {
    @Override
    void display() {
        super.display(); // 现在Parent调用了Grandparent的display()
        System.out.println("Parent display() after calling Grandparent");
    }
}

// 然后让Child继承ParentExtended而不是Parent
// class ChildExtended extends ParentExtended { ... }

// 注意:上面的代码示例是为了说明目的而编写的,并没有完整地展示多重继承链中super的使用。
// 在实际编程中,你应该避免直接操作远祖类的方法,而是通过设计良好的继承层次结构来间接实现。

注意:上面的代码示例中关于直接调用Grandparentdisplay()方法的注释部分并不是最佳实践。在实际编程中,你应该避免在子类中直接调用远祖类的方法,因为这可能会破坏封装性和代码的可维护性。相反,你应该通过设计良好的继承层次结构来间接实现这一功能,比如让Parent类调用Grandparent类的方法,并在Child类中通过super来调用Parent类的方法。

例子二:在方法覆盖中使用super来保持父类行为

当子类覆盖父类的方法时,如果仍然想保留父类方法的行为,可以在子类方法内部调用super来实现。

class Animal {
    void makeSound() {
        System.out.println("Some generic animal sound");
    }
}

class Dog extends Animal {
    @Override
    void makeSound() {
        super.makeSound(); // 调用父类的makeSound()方法
        System.out.println("Woof! Woof!"); // 添加子类特有的行为
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.makeSound(); // 输出:Some generic animal sound\nWoof! Woof!
    }
}

在这个例子中,Dog类覆盖了Animal类的makeSound()方法,但在覆盖的方法中仍然调用了父类的makeSound()方法,以保留父类的行为,并添加了子类特有的行为。

这些例子应该能帮助你更好地理解super关键字在Java中的使用。

super关键字在Java编程中有多个重要的应用场景,以下是其主要应用场景的归纳:

1. 调用父类构造方法

  • 在子类的构造方法中,可以使用super()来调用父类的构造方法。这是确保父类属性被正确初始化的关键步骤。
  • super()调用必须在子类构造方法的第一行,且一个构造方法中只能有一个super()调用。

2. 访问父类成员变量

  • 当子类中定义了一个与父类同名的成员变量时,可以使用super关键字来引用父类的成员变量。
  • 这有助于在子类中区分和访问父类与子类的同名变量。

3. 调用父类方法

  • 如果子类覆盖了父类的方法,但仍然想调用父类的方法,可以使用super.method_name()语法。
  • 这在保留父类行为的同时,允许子类添加或修改特定的行为。

4. 表示父类类型的引用

  • 在子类的实例方法中,super可以作为一个引用变量来使用,它引用了当前对象的父类类型。
  • 这使得子类可以像操作父类实例一样调用其方法或访问其属性。

5. 在多重继承模拟中的使用(虽然不是直接多重继承)

  • 虽然Java不支持多重继承,但可以通过类的层次结构来模拟多重继承的效果。
  • 在这种情况下,super可以用来引用直接父类,而父类可以进一步引用其祖先类。
  • 然而,直接操作远祖类的方法通常不是最佳实践,更好的做法是通过设计良好的继承层次结构来间接实现。

示例代码

以下是一些示例代码,展示了super关键字在不同应用场景中的使用:

// 示例1:调用父类构造方法
class Parent {
    int number;
    Parent(int number) {
        this.number = number;
    }
}

class Child extends Parent {
    String name;
    Child(int number, String name) {
        super(number); // 调用父类的构造方法
        this.name = name;
    }
}

// 示例2:访问父类方法
class Animal {
    void makeSound() {
        System.out.println("Some generic animal sound");
    }
}

class Dog extends Animal {
    @Override
    void makeSound() {
        super.makeSound(); // 调用父类的方法
        System.out.println("Woof! Woof!");
    }
}

// 示例3:访问父类变量
class ParentClass {
    int value = 10;
}

class ChildClass extends ParentClass {
    int value = 20;
    void printValues() {
        System.out.println("Parent's value: " + super.value); // 访问父类的变量
        System.out.println("Child's value: " + this.value);
    }
}

综上所述,super关键字在Java编程中扮演着重要角色,它允许子类直接访问和操作父类的成员,有助于实现代码的重用和多态性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2241962.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

控制器ThinkPHP6

五、控制器中对数组值的返回 在做接口服务时,很多时候回使用数组作为返回值,那么数组如何返回成 json呢? 在 tp6 中返回json 很简单,直接使用 json 进行返回即可,例如: public function index(){$resarra…

基于Java Springboot城市交通管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数…

Ubuntu24.04挂载磁盘

一、引言 由于几块磁盘每次开机时的编号都不一样,造成了很多麻烦,所有重新挂载磁盘试一试。 参考链接: ubuntu挂载磁盘或U盘Ubuntu添加新硬盘,挂载到根目录下的某个文件中 二、挂载磁盘 1. 查看盘名 sudo fdisk -l sda 代表第…

springboot003基于springboot的图书个性化推荐系统(源码+包运行+LW+技术指导)

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

【React】状态管理之Zustand

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 状态管理之Zustand引言1. Zustand 的核心特点1.1 简单直观的 API1.2 无需 Provi…

【从零开始的LeetCode-算法】3210. 找出加密后的字符串

给你一个字符串 s 和一个整数 k。请你使用以下算法加密字符串: 对于字符串 s 中的每个字符 c,用字符串中 c 后面的第 k 个字符替换 c(以循环方式)。 返回加密后的字符串。 示例 1: 输入: s "dart&…

Vue的局部使用

文章目录 什么是Vue?局部使用Vue快速入门 常用指令v-forv-bindv-if & v-showv-onv-model Vue生命周期 Axios案例 什么是Vue? Vue是一款构建用户界面的渐进式的JavaScript框架. 局部使用Vue 快速入门常用指令声明周期 快速入门 准备: 准备html页面,并引入Vue模块(…

二分查找法(leetcode 704)

在一个数组里找一个target&#xff0c;判断这个target在不在这个数组里&#xff0c;如果在&#xff0c;返回这个数组所对应的这个元素所对应的下标&#xff0c;否则返回-1. 易错点&#xff1a; &#xff08;1&#xff09;while(left<right) vs while(left<…

Mysql-DQL条件查询

文章目录 条件查询比较运算符逻辑运算符范围like 关键字排序单列顺序组合排序 聚合函数分组基本的分组流程参数的区别 limit 语句limit 语法格式limit 的使用场景 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Mysql专栏&#xff1a;点击&#xff01; ⏰…

Linux(光速安装+centos镜像 图片+大白话)

阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 软件需要 Vmware 下载镜像 下载前需要知道DVD就是标准版 everything就是全家桶 centos8 centos7 规划 假如有一个200G的硬盘 环境配置分区1/100G分区2/boot1G分区3/data50G分区4swap2G&#xff08;内存2 这里忘2了&…

仓库管理系统设计与实现(Java+Mysql)

目 录 摘 要 目 录 第1章 绪论 1.1 研究背景 1.2目的和意义 1.3 论文研究内容 第2章 程序开发技术 2.1 MySQL数据库 2.2 Java语言 第3章 系统分析 3.1可行性分析 3.1.1技术可行性分析 3.1.2经济可行性分析 3.1.3操作可行性分析 3.2系统运行环境 3.3系统流程分…

CentOS 8 安装 chronyd 服务

操作场景 目前原生 CentOS 8 不支持安装 ntp 服务&#xff0c;因此会发生时间不准的问题&#xff0c;需使用 chronyd 来调整时间服务。CentOS 8以及 TencentOS 3.1及以上版本的实例都使用 chronyd 服务实现时钟同步。本文介绍了如何在 CentOS 8 操作系统的腾讯云服务器上安装并…

datawhale11月组队学习 模型压缩技术3:2:4结构稀疏化BERT模型

文章目录 一、 半结构化稀疏性简介二、 代码实践2.1 定义辅助函数2.2 加载模型、tokenizer和数据集2.3 测试baseline模型指标2.4 对BERT-base模型进行半结构稀疏化 《datawhale2411组队学习之模型压缩技术1&#xff1a;模型剪枝&#xff08;上&#xff09;》&#xff1a;介绍模…

大数据学习15之Scala集合与泛型

1. 概述 大部分编程语言都提供了数据结构对应的编程库&#xff0c;并称之为集合库(Collection Library)&#xff0c;Scala 也不例外&#xff0c;且它还拥有以下优点&#xff1a; 易用&#xff1a;灵活组合运用集合库提供的方法&#xff0c;可以解决大部分集合问题 简洁&#xf…

force stop和pm clear的区别

前言&#xff1a;因为工作中遇到force stop和pm clear进程后&#xff0c;进程不能再次挂起&#xff0c;谷歌系统共性问题&#xff0c;服务类应用经清缓存后当下服务就会挂掉&#xff0c;需要系统重启才能恢复。为了更好的“丢锅”&#xff0c;需要进一步学习force stop和pm cle…

SAP+Internet主题HTML样式选择

SAP目前只支持三种HTML样式选择&#xff1a; 样式一 背景色&#xff1a;深色&#xff0c;蓝 特点&#xff1a;适中型排列&#xff0c;与SAP界面排列相同&#xff0c;富含UI特征&#xff0c;整齐美观 URL地址&#xff1a;http://cn1000-sap-01.sc.com:8000/sap/bc/gui/sap/it…

VBA学习笔记:点击单元格显示指定的列

应用场景&#xff1a; 表格中列数较多&#xff0c;特定条件下隐藏一些无关的列&#xff0c;只保留相关的列&#xff0c;使表格更加清晰。 示例&#xff1a;原表格如下 点击一年级&#xff0c;只显示一年级相关的科目&#xff1a; 点击二年级&#xff0c;只显示二年级相关的科…

java版嘎嘎快充汽车单车充电系统源码系统jeecgboot

汽车使用云快充1.6 1.5协议&#xff0c;单车用的铁塔协议 前端uniapp、后端jeecgbootvue2

这些场景不适合用Selenium自动化!看看你踩过哪些坑?

Selenium是自动化测试中的一大主力工具&#xff0c;其强大的网页UI自动化能力&#xff0c;让测试人员可以轻松模拟用户操作并验证系统行为。然而&#xff0c;Selenium并非万能&#xff0c;尤其是在某些特定场景下&#xff0c;可能并不适合用来自动化测试。本文将介绍Selenium不…

qt QFrame详解

1、概述 QFrame是Qt框架中用于提供框架或边框的控件&#xff0c;主要用于在图形用户界面&#xff08;GUI&#xff09;中创建框架&#xff0c;并提供各种边框样式和功能。它是Qt中一个基础的容器类&#xff0c;也是许多基础控件的基类&#xff0c;可以被QLCDNumber、QToolBox、…