详解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日

相关文章

  • mybatis批量删除多态sql 构建in语句

    Mybatis批量删除多态SQL:构建IN语句 在进行批量删除操作时,使用IN语句可以大大减少SQL语句的编写时间和复杂度。本文将介绍使用Mybatis构建IN语句进行批量删除的方法。 构建实体类 我们假设需要删除的实体类名为User,它的主键ID为id。则我们需要在实体类中添加一个名为ids的属性,用于承载将要被删除的ID集合。 public class …

    其他 2023年3月28日
    00
  • Android如何给按钮添加点击音效

    下面给您详细讲解如何给Android按钮添加点击音效的完整攻略。 步骤一:添加音频文件 首先,在项目的资源目录中添加需要使用的音频文件。可以在res/raw目录下放置自己的音频文件,或者使用Android自带的音频文件。这里我们假设项目中已经有了需要使用的音频文件,名称为click_sound.mp3。 步骤二:创建MediaPlayer对象 在按钮点击事件…

    other 2023年6月27日
    00
  • Windows系统中的文件系统NTFS及权限设置介绍

    Windows系统中的文件系统NTFS及权限设置介绍 NTFS是Windows系统中常用的文件系统,它的功能比FAT32更为强大,支持许多特性,包括文件权限设置、磁盘配额、加密等等。本文将从以下几个方面详细介绍NTFS及权限设置。 NTFS工作原理 NTFS(New Technology File System)是一种文件系统格式,它是Windows操作系统…

    other 2023年6月27日
    00
  • 详解iOS开发中UIPickerView控件的使用方法

    详解iOS开发中UIPickerView控件的使用方法 简介 UIPickerView是iOS中常用的一种UI控件,用于显示一组可选的数据,并让用户从中选择一个。它通常是作为表单中的一部分,用于选择日期、时间、地址、性别等选项。本篇文章将详细介绍UIPickerView的使用方法。 基本用法 1. 创建UIPickerView对象 可以通过代码或xib/st…

    other 2023年6月20日
    00
  • C语言创建数组实现函数init,empty,reverse

    学习C语言的过程中,数组是非常常见的一种数据类型。除了我们常见的定义静态数组以外,我们也可以在函数内部动态地创建数组,以满足不同的需求。为了更好地理解如何创建数组并使用相关的函数,下面将介绍如何创建数组实现init,empty,reverse函数。 创建数组 在C语言中,我们可以使用动态内存分配函数malloc来动态地创建数组。示例代码如下: int* cr…

    other 2023年6月25日
    00
  • 从汇编看c++的默认析构函数的使用详解

    下面就来详细讲解“从汇编看c++的默认析构函数的使用详解”的完整攻略。 一、C++的默认析构函数简介 在C++中,如果我们没有显式地为类定义析构函数,那么编译器会自动生成一个默认的析构函数,用于释放对象占用的内存。这样的析构函数不需要我们手动去写,像这样: class MyClass{ //… }; 如果在程序中我们创建了MyClass的对象,那么当这个…

    other 2023年6月26日
    00
  • biginteger用法

    BigInteger用法攻略 BigInteger是Java中的一个类,用于处理大整数运算。它可以处理超过long类型范围的整数,支持加、减、乘、除、取等运算。本攻略将介绍BigInteger的用法,包括创建、运算、转换等。 1. 创建BigInteger对象 可以使用以下方法创建BigInteger对象: 1.1 使用字符串 BigInteger bigI…

    other 2023年5月7日
    00
  • 详解Spring 参数验证@Validated和@Valid的区别

    详解Spring 参数验证@Validated和@Valid的区别 在Spring框架中,参数验证是一项重要的功能,用于确保传递给方法的参数满足特定的条件。Spring提供了两个注解来实现参数验证:@Validated和@Valid。尽管它们的名称相似,但它们在使用和功能上有一些区别。 @Validated注解 @Validated注解是Spring框架提供…

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