详解Java中super的几种用法并与this的区别

详解Java中super的几种用法并与this的区别

简介

在 Java 中,我们常常使用 superthis 关键字。它们分别表示父类和当前对象的引用。本文将会详细讨论 super 的几种用法,并将其与 this 关键字进行区分。

用法一:super 调用父类的构造方法

在子类的构造方法中,我们可以使用 super 调用父类的构造方法,来初始化父类的属性。这个用法需要注意以下几点:

  • 子类的构造方法的第一行必须是 super()this(),否则编译器会自动添加 super()
  • 如果父类没有默认构造方法,子类必须显式调用父类带参构造方法,否则编译器会报错。

以下是一个示例代码:

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

class Child extends Parent {
    protected int y;
    public Child(int x, int y) {
        super(x);
        this.y = y;
    }
}

Child 的构造方法中,我们使用 super(x) 调用了 Parent 的构造方法,将 x 初始化。然后,我们使用 this.y = y 初始化 Child 的属性。

用法二:super 调用父类的成员变量和方法

在子类中,我们可以使用 super 关键字调用父类的成员变量和方法。这个用法需要注意以下几点:

  • 如果父类和子类的成员变量或方法同名,则子类中的同名变量或方法会覆盖父类的同名变量或方法;
  • 在子类中,我们可以使用 super 关键字来调用父类的同名成员变量或方法。

以下是一个示例代码:

class Parent {
    protected int x;
    public Parent(int x) {
        this.x = x;
    }
    public void print() {
        System.out.println("Parent's print");
    }
}

class Child extends Parent {
    protected int x;
    public Child(int x, int y) {
        super(x);
        this.x = y;
    }
    public void print() {
        super.print();
        System.out.println("Child's print");
    }
    public void test() {
        System.out.println(super.x);
        super.print();
    }
}

Child 中,我们使用 super.print() 调用了 Parent 中的 print() 方法。另外,在 test() 方法中,我们使用 super.x 调用了 Parent 中的 x 成员变量。

与 this 关键字的区别

super 表示父类的引用,而 this 表示当前对象的引用。它们的区别在于:

  • 当子类中的成员变量和父类中的成员变量同名时,我们可以使用 this 来引用子类的成员变量,使用 super 来引用父类的成员变量;
  • 当子类中的方法和父类中的方法同名时,我们可以使用 this 来调用子类的方法,使用 super 来调用父类的方法。

以下是一个示例代码:

class Parent {
    protected int x;
    public Parent(int x) {
        this.x = x;
    }
    public void foo() {
        System.out.println("Parent's foo");
    }
}

class Child extends Parent {
    protected int x;
    public Child(int x, int y) {
        super(x);
        this.x = y;
    }
    public void foo() {
        System.out.println("Child's foo");
    }
    public void bar() {
        System.out.println(this.x);
        System.out.println(super.x);
        this.foo();
        super.foo();
    }
}

Child 中,我们使用 this.x 打印了子类的属性,使用 super.x 打印了父类的属性。另外,在 bar() 方法中,我们使用 this.foo() 调用了子类的方法,使用 super.foo() 调用了父类的方法。

总结

在 Java 中,superthis 关键字分别表示父类和当前对象的引用。super 的几种用法包括调用父类的构造方法、调用父类的成员变量和方法。与 this 的区别在于,它们分别表示父类和当前对象的引用,在同名成员变量或方法的情况下,它们的引用不同。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Java中super的几种用法并与this的区别 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • Android下拉刷新上拉加载控件(适用于所有View)

    Android下拉刷新上拉加载控件 在 Android 开发中,下拉刷新和上拉加载是一种常用的业务需求。为了方便开发者使用,有很多第三方控件可以供我们使用。本文将介绍一款适用于所有 View 的下拉刷新上拉加载控件。 控件介绍 本控件基于 Android 的 NestedScrolling 机制来实现下拉刷新和上拉加载,可以使用在 RecyclerView、…

    other 2023年6月25日
    00
  • swift中正确安全声明一个单例的方法实例

    当在Swift中声明一个单例时,我们需要确保它是线程安全的,以避免多个线程同时访问和修改单例实例。下面是一种正确安全声明一个单例的方法: 使用静态常量和dispatch_once函数(Objective-C风格): class MySingleton { static let sharedInstance = MySingleton() private in…

    other 2023年7月29日
    00
  • RecyclerView使用payload实现局部刷新

    ist) : RecyclerView.Adapter() { // … 其他方法 … override fun onBindViewHolder(holder: ViewHolder, position: Int, payloads: MutableList<Any>) { if (payloads.isEmpty()) { // pa…

    other 2023年8月23日
    00
  • 基于Qt实现SVG图片浏览器

    首先,要实现基于Qt的SVG图片浏览器,需要掌握以下技能: 使用Qt的QSvgWidget和QSvgRenderer进行SVG图片的加载和渲染; 在Qt的MainWindow中创建菜单栏、工具栏和状态栏,实现基本的界面布局; 使用Qt的QFileDialog类进行文件选择和打开; 实现图片缩放和平移的功能。 下面具体介绍实现步骤: 步骤一:新建项目和界面 在…

    other 2023年6月26日
    00
  • iphone怎么大写字母 图文教你iPhone连续输入大写字母

    iPhone连续输入大写字母攻略 在iPhone上,你可以使用连续输入的方式输入大写字母,这样可以提高输入效率。下面是详细的攻略,包含了两个示例说明。 步骤一:打开键盘 首先,确保你的iPhone处于解锁状态。然后,打开任何需要输入大写字母的应用程序,例如消息、邮件或者备忘录。 步骤二:切换到大写字母模式 在键盘的底部,你会看到一个小箭头或者一个小球形图标。…

    other 2023年8月18日
    00
  • 基于C++编写一个简单的服务器

    下面我将详细讲解基于C++编写一个简单的服务器的完整攻略。 1. 确定需求和架构 我们需要先明确实现的需求,例如:支持多个客户端连接、支持发送和接收消息等。然后确定服务器的整体架构,通常是采用客户端/服务器(client/server)模型。 2. 选择网络库 C++本身是没有网络编程的功能,我们需要选择一个网络库来实现。常用的网络库有Boost.Asio、…

    other 2023年6月27日
    00
  • 更新完Win11系统后C盘变小了怎么办? win11一更新c盘就变小解决办法

    更新完Win11系统后C盘变小了怎么办? 当你更新完Win11系统后,发现C盘的可用空间变小了,可能是由于系统更新过程中产生了一些临时文件或者备份文件,导致C盘空间被占用。下面是解决这个问题的一些方法: 方法一:清理临时文件和备份文件 打开“设置”菜单,点击“系统”选项。 在左侧导航栏中选择“存储”。 在“存储”页面中,点击“临时文件”。 在“临时文件”页面…

    other 2023年8月2日
    00
  • windows的文件系统机制引发的PHP路径爆破问题分析

    首先,我们需要了解Windows文件系统的一些基础知识。Windows的文件系统采用了盘符+路径的方式来管理文件,而路径分隔符采用“\”符号。而在PHP中,我们通常使用相对路径或绝对路径来引用文件,这些路径会在内部被转换成操作系统能够识别的路径格式。 在Windows中,如果一个路径以“\”符号开头,则它被认为是绝对路径;如果不以“\”符号开头,则被认为是相…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部