java关键字super的骚操作详解

 更新时间:2023年09月08日 15:08:20   作者:独爱竹子的功夫熊猫  
关键字super在Java中用于引用当前类的父类(即超类)的构造方法、访问父类的成员变量和方法,它提供了一种方便的方式来处理继承关系中的父类操作,下面我们就来看看它有哪些骚操作吧

一、super的语法

关键字super在Java中用于引用当前类的父类(即超类)的构造方法、访问父类的成员变量和方法。它提供了一种方便的方式来处理继承关系中的父类操作。

它可以用于以下几种情况:

1、调用父类的构造方法

在子类的构造方法中,可以使用super关键字来调用父类的构造方法。这通常用于在子类构造方法中执行父类的初始化操作。

public class ChildClass extends ParentClass {
    public ChildClass() {
        super(); // 调用父类的无参构造方法
    }
}
//如果父类没有无参构造方法,也可以使用`super`关键字调用带参数的父类构造方法。
public class ChildClass extends ParentClass {
    public ChildClass(int value) {
        super(value); // 调用父类的带参数构造方法
    }
}

2、调用父类的成员变量和方法

使用super关键字可以在子类中访问父类的成员变量和方法。这在子类中存在与父类同名的成员变量或方法时特别有用。

public class ParentClass {
    protected int value;
    public void printValue() {
        System.out.println("Value: " + value);
    }
}
public class ChildClass extends ParentClass {
    private int value;
    public ChildClass(int value) {
        super(); // 调用父类的无参构造方法
        this.value = value; // 子类的value隐藏了父类的value
    }
    public void printValue() {
        super.printValue(); // 调用父类的printValue方法
        System.out.println("Child Value: " + value);
    }
}

在上面的例子中,使用super.printValue()调用了父类的printValue()方法,而不是子类中的同名方法。

二、super关键字只能在子类中使用吗

实际上,super关键字并不仅限于子类中的使用,它可以在子类中使用,也可以在子类的内部类、实例初始化块中使用。

下面我将详细介绍这些情况:

  • 子类中使用super关键字:在子类的构造方法、实例方法中,可以使用super关键字来引用父类的成员。
  • 子类的内部类中使用super关键字:如果子类中定义了内部类,那么在内部类的方法中,可以使用super关键字来引用外部子类的父类。
  • 实例初始化块中使用super关键字:实例初始化块是在类的实例被创建时执行的代码块。在实例初始化块中,可以使用super关键字来调用父类的构造方法。
public class ParentClass {
    protected int value;
    public ParentClass(int value) {
        this.value = value;
    }
}
public class ChildClass extends ParentClass {
    private int childValue;
    public ChildClass(int value, int childValue) {
        super(value); // 在子类构造方法中使用super调用父类构造方法
        this.childValue = childValue;
    }
    public void method() {
        super.value = 10; // 在子类方法中使用super引用父类的成员变量
    }
    class InnerClass {
        public void innerMethod() {
            super.value = 20; // 在子类的内部类中使用super引用外部子类的父类
        }
    }
    {
        super.value = 30; // 在实例初始化块中使用super引用父类的成员变量
    }
    static {
        // 注意:在静态初始化块中不能使用super
    }
}

三、super关键字可以在子类的静态方法中使用吗

在Java中,super关键字==不能在子类的静态方法中使用==。super关键字用于引用当前类的父类的成员,但静态方法是与类相关而不是实例相关的,因此无法使用super关键字引用父类的成员。

静态方法是通过类名直接调用的,不需要创建类的实例。而super关键字是用于实例级别的操作,用于在子类中引用父类的成员。由于在静态方法中没有实例,无法使用super关键字引用父类的成员变量或方法。

==如果需要在子类的静态方法中引用父类的成员,可以直接通过父类名来访问==。例如,可以使用父类的名称来调用父类的静态方法或访问父类的静态成员变量。

以下是一个示例代码,展示了在子类的静态方法中访问父类的静态成员的方式:

public class ParentClass {
    public static int staticValue = 10;
    public static void staticMethod() {
        System.out.println("Parent static method");
    }
}
public class ChildClass extends ParentClass {
    public static void staticMethod() {
        int value = ParentClass.staticValue; // 直接通过父类名访问父类的静态成员变量
        ParentClass.staticMethod(); // 直接通过父类名调用父类的静态方法
        System.out.println("Child static method");
    }
}

四、super关键字可以在子类的静态初始化块中使用吗?

在Java中,super关键字不能在子类的静态初始化块中使用。静态初始化块是在类被加载时执行的代码块,而super关键字是用于实例级别的操作,用于在子类中引用父类的成员。

由于静态初始化块是与类相关而不是实例相关的,无法使用super关键字引用父类的成员变量或方法。super关键字需要在实例上下文中使用,而静态初始化块没有实例上下文。

以下是一个示例代码,展示了在子类的静态初始化块中无法使用super关键字的情况:

public class ParentClass {
    public static int staticValue;
    static {
        staticValue = 10;
    }
}
public class ChildClass extends ParentClass {
    static {
        // 以下代码会导致编译错误,无法在静态初始化块中使用super关键字
        // super.staticValue = 20;
    }
}

到此这篇关于java关键字super的骚操作详解的文章就介绍到这了,更多相关java super内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Cloud Gateway使用Token验证详解

    Spring Cloud Gateway使用Token验证详解

    这篇文章主要介绍了Spring Cloud Gateway使用Token验证详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • Java设计模式之java策略模式详解

    Java设计模式之java策略模式详解

    这篇文章主要介绍了Java经典设计模式之策略模式,简单说明了策略模式的概念、原理并结合实例形式分析了java策略模式的具有用法与相关注意事项,需要的朋友可以参考下
    2021-09-09
  • java防盗链在报表中的应用实例(推荐)

    java防盗链在报表中的应用实例(推荐)

    下面小编就为大家带来一篇java防盗链在报表中的应用实例(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • Java Web Axios实现前后端数据异步交互实例代码

    Java Web Axios实现前后端数据异步交互实例代码

    Axios作为一个流行的前端 HTTP 通信库,可以极大地简化前端与后端之间的数据交互,这篇文章主要介绍了Java Web Axios实现前后端数据异步交互的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-09-09
  • Java 序列化和反序列化实例详解

    Java 序列化和反序列化实例详解

    这篇文章主要介绍了Java 序列化和反序列化实例详解的相关资料,需要的朋友可以参考下
    2017-03-03
  • springboot2.x解决运行顺序及Bean对象注入顺序的问题

    springboot2.x解决运行顺序及Bean对象注入顺序的问题

    这篇文章主要介绍了springboot2.x解决运行顺序及Bean对象注入顺序的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • java+vue实现添加单选题、多选题到题库功能

    java+vue实现添加单选题、多选题到题库功能

    这篇文章主要为大家详细介绍了java+vue实现添加单选题、多选题到题库功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • java中tomcat的80端口被占用问题解决

    java中tomcat的80端口被占用问题解决

    java中tomcat的80端口被占用问题解决,需要的朋友可以参考一下
    2013-03-03
  • java8中parallelStream性能测试及结果分析

    java8中parallelStream性能测试及结果分析

    本篇文章给大家用代码实例做了segmentfaultjava8中parallelStream性能测试,并对测试结果做了说明,需要的朋友学习下吧。
    2018-01-01
  • Java selenium上传文件的实现

    Java selenium上传文件的实现

    本文主要介绍了Java selenium上传文件的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04

最新评论