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

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变量,输出10System.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;}@Overridepublic 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 {@Overridevoid 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的nameSystem.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");}@Overridepublic 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 {@Overridevoid display() {System.out.println("Parent display()");}
}class Child extends Parent {@Overridevoid 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 {@Overridevoid 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 {@Overridevoid 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 {@Overridevoid 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.rhkb.cn/news/475388.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux移植IMX6ULL记录 一:编译源码并支持能顺利进入linux

目录 前言 一、不修改文件进行编译 二、修改设备树文件进行编译 前言 我用的开发板是100_ask_imx6ull_pro,其自带的linux内核版本linux-4.9.88,然后从linux官网下载过来的linux-4.9.88版本的arch/arm/configs/defconfig和dts设备树文件并没有对imx6ull…

安卓手机root+magisk安装证书+抓取https请求

先讲一下有这篇文章的背景吧,在使用安卓手机fiddler抓包时,即使信任了证书,并且手机也安装了证书,但是还是无法捕获https请求的问题,最开始不知道原因,后来慢慢了解到现在有的app为了防止抓包,把…

linux 常用命令指南(存储分区、存储挂载、docker迁移)

前言:由于目前机器存储空间不够,所以‘斥巨资’加了一块2T的机械硬盘,下面是对linux扩容的一系列操作,包含了磁盘空间的创建、删除;存储挂载;docker迁移;anaconda3迁移等。 一、存储分区 1.1 …

学习虚幻C++开发日志——委托(持续更新中)

委托 官方文档:Delegates and Lamba Functions in Unreal Engine | 虚幻引擎 5.5 文档 | Epic Developer Community | Epic Developer Community 简单地说,委托就像是一个“函数指针”,但它更加安全和灵活。它允许程序在运行时动态地调用不…

Git入门图文教程 -- 深入浅出 ( 保姆级 )

01、认识一下Git!—简介 Git是当前最先进、最主流的分布式版本控制系统,免费、开源!核心能力就是版本控制。再具体一点,就是面向代码文件的版本控制,代码的任何修改历史都会被记录管理起来,意味着可以恢复…

多传感器融合slam过程解析【大白话版】

SLAM(同步定位与地图构建)是自动驾驶、机器人导航和三维建模的关键技术之一。多传感器融合(激光雷达、IMU、相机)进一步提升了SLAM的鲁棒性和适应性,使其能够在复杂环境中实时构建高精度地图。本文将围绕激光雷达IMU相…

蓝桥杯每日真题 - 第18天

题目:(出差) 题目描述(13届 C&C B组E题) 解题思路: 问题分析 问题实质是一个带权图的最短路径问题,但路径的权重包含两个部分: 从当前城市到下一个城市的路程时间。 当前城市的…

每日论文23-24ESSERC 6.4-16.1Ghz混合并联-串联谐振器

《A 6.4-to-16.1GHz Hybrid Parallel-Series Resonator Mode-Switching Oscillator with 206.6dBc/Hz FoMT at 1MHz Offset in 40nm CMOS》 24ESSERC 首先这篇文章有个地方我其实没太明白,它在title和行文的时候都写的是“ hybrid parallel-series resonator mode-…

<QNAP 453D QTS-5.x> 日志记录:在 Docker 中运行的 Flask 应用安装 自签名 SSL 证书 解决 Chrome 等浏览器证书安全

原因:Chrome 不信任 ssc 证书 使启用了 HTTPS,即使有使用 自签名证书 (self-signed certificate 非由可信的证书颁发机构 【CA,Certificate Authority】签发的)。浏览器 Chrome 默认不信任自签名证书,也会报 NET::ERR_…

【再谈设计模式】适配器模式 ~接口兼容的桥梁

一、引言 在软件开发的复杂世界里,不同的组件、类或者系统往往有着各自独立的设计和接口定义。当需要将这些原本不兼容的部分整合在一起协同工作时,就像尝试将方形的榫头插入圆形的卯眼一样困难。适配器设计模式就如同一位神奇的工匠,能够巧妙…

无人机的激光雷达避障系统阐述!

一、材料 激光二极管基底材料:激光二极管是激光雷达的核心组件之一,其基底材料通常采用硅或砷化镓。硅材料成本低、易于加工,但发光效率相对较低;而砷化镓材料发光效率高,但成本较高。 光学镜片材料:激光…

一篇快速上手 Axios,一个基于 Promise 的网络请求库(涉及原理实现)

Axios 1. 介绍1.1 什么是 Axios?1.2 axios 和 ajax 的区别 2. 安装使用3. Axios 基本使用3.1 Axios 发送请求3.2 其他方式发送请求3.3 响应结构3.4 Request Config3.5 默认配置3.6 创建实例对象发送请求 3.7 拦截器3.8 取消请求 4. 模拟 Axios4.1 axios 对象创建过程…

Three.js 相机控制器Controls

在 3D 场景中,摄像机的控制尤为重要,因为它决定了用户如何观察和与场景互动。Three.js 提供了多种相机控制器,最常用的有 OrbitControls、TrackballControls、FlyControls 和 FirstPersonControls。OrbitControls 适合用于查看和检查 3D 模型…

【新人系列】Python 入门(十一):控制结构

✍ 个人博客:https://blog.csdn.net/Newin2020?typeblog 📝 专栏地址:https://blog.csdn.net/newin2020/category_12801353.html 📣 专栏定位:为 0 基础刚入门 Python 的小伙伴提供详细的讲解,也欢迎大佬们…

SELinux

一、简介 SELinux : 安全强化的Linux;在开启后,会对进程本身部署安全上下文;会对文件部署安全上下文;对法务使用端口进行限制;对程序本身的不安全功能做限制 二、工作原理 1、工作方式 通过MAC的方式来控制管理进程&#xff0…

C++小白实习日记——Day 5 gitee怎么删文件,测试文件怎么写循环

昨晚一直内耗,一个程序写了三天写不出来,主要是耗时太多了,老板一直不满意。想在VScode上跑一下,昨晚一直报错。今天来公司重新搞了一下, 主要工作有: 1,读取当前时间用tscns 2,输…

Apache Paimon】-- 6 -- 清理过期数据

目录 1、简要介绍 2、操作方式和步骤 2.1、调整快照文件过期时间 2.2、设置分区过期时间 2.2.1、举例1 2.2.2、举例2 2.3、清理废弃文件 3、参考 1、简要介绍 清理 paimon (表)过期数据可以释放存储空间,优化资源利用并提升系统运行效…

阿里云IIS虚拟主机部署ssl证书

宝塔配置SSL证书用起来是很方便的,只需要在站点里就可以配置好,但是云虚拟主机在管理的时候是没有这个权限的,只提供了简单的域名管理等信息。 此处记录下阿里云(原万网)的IIS虚拟主机如何配置部署SSL证书。 进入虚拟…

BOM的详细讲解

BOM概述 BOM简介 BOM(browser Object)即浏览器对象模型,它提供了独立于内容而与浏览器窗口进行交互的对象,其核心对象是window。 BOM由一系列的对象构成,并且每个对象都提供了很多方法与属性 BOM缺乏标准&#xff…