Java中super关键字的用法

Java中super关键字的三种用法详解:访问父类成员、方法与构造器 本文深入探讨了Java中super关键字的三种主要用法:访问父类成员变量、调用父类方法以及调用父类构造器。通过代码示例和对比分析,详细说明了super在解决变量遮蔽、方法重写和构造器链问题中的作用。文章还总结了super的使用场景、常见错误及解决方案,并指出super只能访问直接父类成员,无法直接访问更高层级的祖先类。开发者应合理使用super,避免不必要的耦合,同时确保代码的可维护性和扩展性。 阅读详情
AI摘要

本文围绕Java中用于处理继承的关键字展开。介绍了其基本用法,如访问父类字段、调用方法和构造器;阐述了实际应用,包括避免方法遮蔽、初始化父类属性和实现多态性;还提及使用的限制与注意事项,合理使用可提升代码质量。

一、super关键字的基本用法

super关键字的主要作用是用于访问和调用父类的成员(字段和方法),并调用父类的构造器。以下是super关键字的几个基本用法:

  1. 访问父类的字段
  2. 调用父类的方法
  3. 调用父类的构造器
1. 访问父类的字段

当子类和父类具有相同名称的成员变量时,super关键字可以用来区分并访问父类中的变量。没有super关键字时,默认访问的是子类的变量。

class Parent {
    String name = "Parent";

    void displayName() {
        System.out.println("Name in Parent: " + name);
    }
}

class Child extends Parent {
    String name = "Child";

    void displayName() {
        System.out.println("Name in Child: " + name);
        System.out.println("Name in Parent: " + super.name);  // 使用super访问父类的name
    }
}

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

输出结果:

Name in Child: Child
Name in Parent: Parent

在这个例子中,super.name用于访问父类Parent中的name字段,而不是子类Child中的name字段。

2. 调用父类的方法

super关键字可以用来调用父类中的方法,这在子类重写了父类的方法时特别有用。使用super,子类可以调用父类的版本,同时在子类中添加或修改行为。

class Parent {
    void displayMessage() {
        System.out.println("Message from Parent");
    }
}

class Child extends Parent {
    void displayMessage() {
        super.displayMessage();  // 调用父类的displayMessage方法
        System.out.println("Message from Child");
    }
}

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

输出结果:

Message from Parent
Message from Child

在这个例子中,super.displayMessage()调用了父类Parent中的displayMessage方法,然后子类Child中的displayMessage方法继续执行并打印自己的消息。

3. 调用父类的构造器

在Java中,子类的构造器在执行前必须调用父类的构造器。super()可以显式地调用父类的构造器。如果不显式调用,Java会在子类构造器中自动调用父类的无参构造器。如果父类没有无参构造器,那么子类必须显式调用父类的某个构造器。

class Parent {
    int value;

    Parent(int value) {
        this.value = value;
        System.out.println("Parent Constructor Called, Value: " + value);
    }
}

class Child extends Parent {
    Child(int value) {
        super(value);  // 调用父类的构造器
        System.out.println("Child Constructor Called");
    }
}

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

输出结果:

Parent Constructor Called, Value: 10
Child Constructor Called

在这个例子中,super(value)用于调用父类Parent的构造器,并传递一个参数value。这确保了父类的构造器在子类的构造器执行之前正确初始化了父类的部分。

二、super关键字的实际应用

super关键字在继承结构中有着广泛的应用,尤其是在处理复杂的继承链和覆盖方法时。以下是一些常见的场景:

1. 使用super来避免方法的遮蔽

在Java中,当子类的方法与父类的方法具有相同的名称和参数时,子类的方法会覆盖(override)父类的方法。通过super,子类可以在覆盖父类方法的同时,保留对父类方法的访问。

class Animal {
    void sound() {
        System.out.println("Animal makes a sound");
    }
}

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

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

在这个例子中,Dog类覆盖了Animal类的sound方法,但通过super.sound(),它仍然可以访问并调用父类的sound方法。

2. 使用super来初始化父类的属性

当子类需要在构造过程中初始化从父类继承的属性时,可以使用super关键字调用父类的构造器。这样可以确保父类的属性按照预期进行初始化,而子类也可以进一步进行自己的初始化。

class Vehicle {
    int speed;

    Vehicle(int speed) {
        this.speed = speed;
        System.out.println("Vehicle speed: " + speed);
    }
}

class Car extends Vehicle {
    int gear;

    Car(int speed, int gear) {
        super(speed);  // 调用父类的构造器
        this.gear = gear;
        System.out.println("Car gear: " + gear);
    }
}

public class Test {
    public static void main(String[] args) {
        Car car = new Car(100, 5);
    }
}

输出结果:

Vehicle speed: 100
Car gear: 5

在这个例子中,Car类通过super(speed)调用了Vehicle类的构造器,确保speed属性在父类中正确初始化。

3. 使用super调用父类的方法来实现多态性

在多态性中,子类可以重写父类的方法,并且可以选择性地通过super调用父类的方法。这样,子类可以扩展或修改父类的方法行为,但在需要时仍然保留对原始方法的访问。

class Shape {
    void draw() {
        System.out.println("Drawing a shape");
    }
}

class Circle extends Shape {
    @Override
    void draw() {
        super.draw();  // 调用父类的draw方法
        System.out.println("Drawing a circle");
    }
}

public class Test {
    public static void main(String[] args) {
        Shape shape = new Circle();
        shape.draw();
    }
}

输出结果:

Drawing a shape
Drawing a circle

在这个例子中,Circle类扩展了Shape类的draw方法,通过super.draw()先调用父类的方法,然后添加了自己的行为。

三、super的限制与注意事项

虽然super关键字非常有用,但在使用时也需要注意一些限制和最佳实践:

  1. 构造器中的super()调用:super()调用必须是构造器中的第一条语句。这意味着在子类构造器中,不能在调用父类构造器之前进行任何其他操作。如果父类没有无参构造器,则子类必须显式调用带参数的父类构造器。

  2. 在静态上下文中无法使用super:super关键字只能用于实例方法或构造器中,不能在静态方法或静态代码块中使用。因为静态方法是属于类的,而super用于引用实例的父类部分。

  3. 避免滥用super:虽然super允许子类访问父类的方法和属性,但滥用super可能导致代码的复杂性增加,难以维护。尤其是在复杂的继承链中,频繁使用super可能使代码逻辑变得混乱。因此,在设计类和继承关系时,尽量减少子类对父类实现细节的依赖。

结论

super关键字是Java中处理继承的重要工具,它使得子类能够正确且安全地访问和操作父类的成员、方法和构造器。通过合理使用super,开发者可以实现更好的代码复用、增强代码的可维护性,并在继承层次结构中保持灵活性。然而,在使用super时,也需要遵循一些最佳实践,以避免复杂性和维护性问题。理解并掌握super关键字的各种用法,有助于开发者编写更清晰、可扩展的面向对象程序。

Java 常识(013):Java中的super关键字 文章目录1、Java 中 super 是什么2、为什么要用 super 关键字3、Java 中 super 的用法3.1、使用 super 调用父类的构造方法3.2、引用父类实例变量3.3、调用父类方法4、super 关键字与 this 关键字的区别 1、Java 中 super 是什么 java中的super关键字是一个引用变量,用于引用直接父类对象。 每当创建子类的实例时,父类的实例被隐式创建... 阅读详情

相关推荐

Java面向对象(进阶)-- super关键字的使用与子类对象实例化全过程

Java面向对象(进阶)-- super关键字的使用与子类对象实例化全过程

人生得意须尽欢 2169

详解super()函数

详解super()函数 super()函数用于访问和调用一个对象上的父对象上的函数。 前言 super.prop 和 super[expr]表达式在类和对象字面量任何方法定义中都是有效的。 一、语法? super([arguments]) //调用 父对象/父类 的构造函数 super.functionOnParent([arguments]); //调用 父对象/父类 上的方法 二、描述 在构造函数中使用时,super关键字将单独出现,并且必须在使用this关键字之前使用。 super关键字也可以调用父

qq_41986353的博客 2万+

Java中super关键字详解与实战用法

本文还有配套的精品资源,点击获取 简介:在Java面向对象编程中, 关键字用于引用当前对象的父类成员,尤其在处理继承关系时非常关键。它可用于调用父类构造函数、访问被重写的方法和同名字段。本文通过多个代码示例详细讲解 在构造函数、方法调用和字段访问中的实际应用,帮助开发者掌握其核心用法,提升代码的可读性和可维护性。 在Java面向对象编程中, 关键字是一个非常重要的保留关键字,用于引用当前对象的父类实例。它在继承

weixin_35459464的博客 922

教妹学Java(三十三):super 关键字的用法

super 关键字有哪些用法?

沉默王二 1万+

yakit 验证码识别 进行webfuzzer

在渗透测试的过程中,我们可能需要对管理员密码进行枚举,或者密码喷洒的时候,遇到验证码就很烦。有没有自动化识别验证码的办法呢?有的,兄弟,有的。验证码的识别率很低,captcha-killer-modified对算术验证码识别正确率非常低,还会识别成乱七八糟的结果,这就非常麻烦。因为你不知道到底是验证码不对,还是密码不对。这是 ddddocr 识别率的问题,如果师傅们找到准确度更高的工具,完全可以替换上去。

Arkmornings的博客 1668

ubuntu20.4源码安装最新gcc(gcc V12.2)

Ubuntu20.4自带的gcc为V9.4.0的版本,老版本的gcc存在不支持新版本C语言规范,在配置、编译、安装应用软件或工具时,可能存在不能正确安装的问题。(比如:libpqxx-7.7.4在配置时要求c++17版本的支持,但gcc V9.4.0版本不支持c++17)。因此本文介绍ubuntu20.4的系统下载最新gcc12.2版本源码,并进行本地编译、安装。本节内容包括gcc12.2的必备库安装和gcc12.2安装两部分内容组成。

q544344318的博客 1万+

Java super关键字用法

分别介绍了在构造方法和非构造方法中super关键字的四种不同的用法。

ccpat的专栏 1万+

多台树莓派(主机)通信

在做无人机实验时,有个任务需要 两台无人机 或 无人机与小车 进行通信。 由于我们飞机上用了树莓派,相当于一台电脑,索性选用Socket网络编程。 条件:树莓派、局域网(手机热点或路由器)。需要通信的两台树莓派接入同一个局域网。 如若现场没有网络,可将树莓派配置为无线路由器,发射wifi。网上很多教程,注意一点是树莓派需要先用网线接入路由器再配置。 发送数据: # -*- coding...

LNL_LNL的博客 7689

java super用法_深入分析java中的关键字super

super在平时编程和面试的时候经常会被使用到,这篇文章就仔细来分析一下他的用法,并和this关键字做一个对比分析。1、概念它是一个指代变量,用于在子类中指代父类对象。2、应用范围super的三种使用情况:访问父类的方法。调用父类构造方法。访问父类中的隐藏成员变量。3、使用(1)访问父类中的方法第一步:定义father类public 第二步:定义son类public 第三步:测试一下public ...

weixin_39603622的博客 186

S32DS 3.5.8离线包怎么用?保姆级教程教你手动安装S32K3开发环境(附资源下载)

本文详细介绍了S32DS 3.5.8离线包的安装方法,适用于S32K3开发环境的手动搭建。从资源获取、完整性验证到分步安装指南,提供了全面的离线部署解决方案,特别适合军工/车企内网开发等场景。文章还包含版本选择建议、常见问题排查及团队协作方案,帮助开发者高效完成环境配置。

weixin_30471561的博客 480

Mac新手必看:nvm安装全攻略(含常见错误解决方案)

本文为Mac开发者提供nvm安装与使用全攻略,涵盖环境准备、安装步骤、Shell配置优化及常见错误解决方案。详细讲解如何利用nvm管理多Node版本,提升开发效率,特别针对国内用户提供网络问题解决技巧,是Mac新手必备的Node版本管理指南。

weixin_28839699的博客 1617

java super关键字的作用_详解Java编程中super关键字的用法

通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程度上可以说它类似于C语言中的全局函数和全局变量。但是,并不是说有了这种便利,你便可以随处使用,如果那样的话,你便需要认真考虑一下自己是否在用面向对象的思想编程,自己的程序是否是面向对象的。 好了,现在开始讨论this&super这两个关键字的意义和用法。在Java中,this通常指当前对象,super则指父类的。当你想要...

weixin_30446557的博客 1620

精度0.01%决定续航多20km|新能源汽车研发测试:功率分析仪到底有多硬核?

新能源汽车测试、功率分析仪、电驱系统、效率MAP、谐波THD、GB/T18488、CLTC工况、三电测试、台架标定、能量流分析。中的核心作用,用公式、思维导图、实战金句与避坑指南,帮研发测试人员把准数据、提效率、降返工,看完就能落地用。点击关注,进公众号主页查看历史文章,**台架接线图、效率MAP模板、GB/T18488测试清单等。优化弱磁/调制策略,高效区占比提升5%,CLTC续航直接+8~20km。同样工况,两次数据差0.8%,报告根本没法交。结果:数据飘、定位慢、反复返工、认证不过。

优快云-新能源汽车研发测试专业博主 170

谈谈Java中super关键字的用法和细节

Java中对super关键字的深入理解,求点赞~~~

qq_46120393的博客 717

ansys license许可证问题:Ansys License Manager Release 2024 R1...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 5371

C# ScottPlot 5.0 WinForms 十字光标示例:轻松实现动态数值显示,你学会了吗?

ScottPlot是一个免费、开源的.NET交互式绘图库,能够轻松地实现大型数据集的交互式显示。它支持多种图表类型,如折线图、柱状图、饼图、散点图等。ScottPlot的性能非常出色,即使是处理千万级别的数据也游刃有余。

java专栏 2219

java super关键字的super关键字的用法有三种用法

super关键字的用法有三种 : 1.在子类的成员方法中,访问父类的成员变量 2.在子类的成员方法中,访问父类成员方法 3.在子类的构造方法中访问父类的构造方法 public class Fu { int num=50; public void method() { System.out.println("父类方法"); } public Fu() { Syste...

Q791425037的博客 566

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Java 关键字super用法介绍

Java 关键字super用法介绍内容待完成

lyc417356935的专栏 522

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java中this super关键字的用法

this关键字:引用当前对象的实例变量。调用当前对象的方法。调用当前类的构造器。super关键字:引用父类的实例变量。调用父类的方法。调用父类的构造器。

m0_37395203的博客 523

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Java中super关键字的三种用法

Java中super关键字的三种用法: 在子类的成员方法中,访问父类的成员变量。 在子类的成员方法中,访问父类的成员方法。 在子类的构造方法中,访问父类的构造方法。

qq_45054258的博客 215

Java中super关键字的两种用法

通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程度上可以说它类似于C语言中的全局函数和全局变量。   但是,并不是说有了这种便利,你便可以随处使用,如果那样的话,你便需要认真考虑一下自己是否在用面向对象的思想编程,自己的程序是否是面向对象的。   好了,现在开始讨论this&super这两个关键字的意义和用法。   在Java中,this通常指当前对象,supe...

heima201907的博客 582

Java中类关键字super的用法详解

在继承关系中,只要在子类中定义了和父类名称相同的属性,无论其类型是否相同,调用的都是子类中覆盖后的变量。 2.在子类中调用父类的方法 代码示例: 3.在子类中调用父类的构造方法 使用注意事项如下:

qq_53130059的博客 2403

JAVA中super关键字和this关键字的用法

super关键字 super关键字的用法有三种: 1.在子类的成员方法中,访问父类的成员变量。 2.在子类的成员方法中,访问父类的成员方法。 3.在子类的构造方法中,访问父类的构造方法。 public class Zi extends Fu { int num = 20; public Zi() { super(); //访问父类构造器 } p...

Milk的博客 899

java面向对象-this和super关键字的四种用法

JavaSE中的面向对象的高级内容,this关键字和super关键字的四种不同用法,你了解几种呢

m0_47671062的博客 747

结合项目理解super关键字的用法【Java基础题】

通过为创建和更新操作定义不同的DTO类,可以明确区分这两种操作的数据要求。虽然在很多情况下,创建和更新操作所需的数据字段可能大致相同,但也可能存在一些差异,例如在更新操作中可能需要一个明确的ID,而创建操作则不需要。通过使用继承,可以在保持代码整洁的同时,灵活地为不同的操作定义不同的数据要求。这样的设计允许开发者清晰地分离和管理不同操作(如创建和更新)所需的数据结构,同时通过继承机制来实现代码复用和功能扩展。

stan_ko的博客 964
上一篇: Java中static存在的主要意义
下一篇: Java中this与super的区别
Flying_Fish_Xuan
Flying_Fish_Xuan 新星创作者: 后端开发技术领域 新星创作者: 后端开发技术领域
博客等级 码龄5年 1万+粉丝 2409原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Flying_Fish_Xuan

你的鼓励将是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值