Java关键字 —— super 与 this 详细解释!一看就懂 有代码实例运行!

简介: 本文介绍了Java中this和super关键字的用法,包括在构造方法中使用this来区分参数和成员变量、使用super调用父类构造方法和方法,以及它们在同一个方法中同时使用的场景。

前言

大家应该经常会遇到这static、this、super、final四个关键字,甚至容易把含义搞混。

其实static、this、super、final这四个关键字互相是没有什么联系的(除了this和super有一定关系外),所以大家其实要刻意区分一下这几个对应的功能和使用场景

那么这篇博客带领大家学习一下 super 和 this 的用法

在这里大家可以简单这样理解:this表示当前类的...,super表示父类的...

下面我们来详细讲解 super 和 this 两个关键字各自的用法和区别

super关键字

super在父类、子类相关联的操作中经常被用到

super 是Java中的关键字,用于引用父类(超类)的成员变量、方法或构造函数。它有以下主要用途:

  1. 访问父类中的成员变量
  2. 调用父类中的构造方法
  3. 调用父类中的方法

在没有继承和被继承关系的类中,几乎不被使用

我个人喜欢将super理解为 “父类的”, “引用父类的”

1、访问父类的成员变量

使用 super 关键字可以在子类中访问父类中的成员变量。这对于在子类中有相同名字的成员变量时很有用,以便明确指定你想要访问的是父类的成员变量。

package com.sky.test;

class Parent {
    int x = 10;
}

class Child extends Parent {
    int x = 20;

    void display() {
        System.out.println(super.x); // 访问父类的x变量    10 
        System.out.println(this.x);    // 访问子类的x变量  20
    }
}

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

class Animal {
    String name = "Animal"; // 父类的成员变量

    void printName() {
        System.out.println(name); // 打印父类的成员变量
    }
}

class Dog extends Animal {
    String name = "Dog"; // 子类的成员变量

    void displayNames() {
        System.out.println(name);     // 打印子类的成员变量
        System.out.println(super.name); // 打印父类的成员变量
    }
}

public class Main {
    public static void main(String[] args) {
        Dog myDog = new Dog();
        myDog.printName();    // 输出:Animal(调用父类方法)
        myDog.displayNames(); // 输出:Dog(子类成员变量),Animal(父类成员变量)
    }
}

2、调用父类中的构造方法

在子类的构造函数中使用 super 关键字可以调用父类的构造函数。这通常用于初始化父类的成员变量或执行父类构造函数的逻辑。

经常用在下面这种情况,类中有些变量是子类继承父类的

利用super可调用父类的构造方法将其赋值

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;
    }

    // @Override 不理解也没事,不带上这个注解一样能正常运行
    @Override  // java中的注解 此处的意思是表明此方法是重写过的方法
    public String toString() {   // 返回带上child的成员变量值的字符串 x和y
        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());
    }
}

3、调用父类中的方法

使用 super 关键字可以在子类中显式调用父类的方法。这在子类重写父类的方法时特别有用,以便在子类中可以调用父类的版本。

class Parent {
    void print() {
        System.out.println("Parent's print method");
    }
}

class Child extends Parent {
    @Override
    void 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();
    }
}

this关键字

其实this相对来说和super还是有一定关系的,this可以简单理解为 “当前类的”,super可以理解为 “父类的”

其实只要按着上面那句话记,大部分情况都可以得心应手的使用了

下面,我们继续来讲解this(主要讲解的是用法)

众所周知,this最常用的地方是在构造方法中使用,this.属性来给对象中的属性赋值,代码如下:

public class Account {
    private String name;
    private double balance;
    private String pwd;

    //Account类的一个构造器
    public Account (String name,double balance,String pwd){
        //构造器的实现---初始化对象
        this.name = name;
        this.balance = balance;    
        this.pwd = pwd;
    }
}

很多人都会有一个疑问,直接访问属性不是也可以访问到么,为什么要this.属性来访问呢

其实大家看上面的代码,方法传过来的参数命名和类中属性命名一摸一样,像这种情况,如果写成下面这种样子是谁赋值给谁呢?

public Account (String name,double balance,String pwd){
    //构造器的实现---初始化对象
    name = name;
    balance = balance;
    pwd = pwd;
}

像上面这种写法不仅本质上错误,而且含义太过于混淆

如果这时候引入this,就能区分开,this表示当前类的:

public Account (String name,double balance,String pwd){
    //构造器的实现---初始化对象
    this.name = name;
    this.balance = balance;
    this.pwd = pwd;
}

将方法接收的参数依次赋值给当前类的参数

this和super的区别

this表示当前类的,super表示父类的

官方一点就是:

  • this用于引用当前对象
  • super用于访问父类

    他俩可以在同一个方法中同时出现,各自发挥各自的作用,互不冲突,代码如下:

class animal {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public animal(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

public class dog extends animal {
    private String color;

    public dog(String name, int age, String color) {
        super(name, age);
        this.color = color;
    }
}

在dog的构造方法中,使用了 super(name, age);调用了父类的构造方法,又使用了 this.color = color 为当前类的color赋值,作用互不冲突

🧸前路漫漫,愿星光与您相伴!

目录
相关文章
|
10天前
|
存储 Java 计算机视觉
Java二维数组的使用技巧与实例解析
本文详细介绍了Java中二维数组的使用方法
28 15
|
10天前
|
缓存 Java 开发者
Java字面量详解:概念、分类与使用实例
本文介绍了Java字面量的概念、分类及应用。
33 11
|
10天前
|
Java 编译器 开发者
Java中的this关键字详解:深入理解与应用
本文深入解析了Java中`this`关键字的多种用法
55 9
|
16天前
|
SQL Java 数据库连接
如何在 Java 代码中使用 JSqlParser 解析复杂的 SQL 语句?
大家好,我是 V 哥。JSqlParser 是一个用于解析 SQL 语句的 Java 库,可将 SQL 解析为 Java 对象树,支持多种 SQL 类型(如 `SELECT`、`INSERT` 等)。它适用于 SQL 分析、修改、生成和验证等场景。通过 Maven 或 Gradle 安装后,可以方便地在 Java 代码中使用。
137 11
|
1月前
|
存储 缓存 Java
Java 并发编程——volatile 关键字解析
本文介绍了Java线程中的`volatile`关键字及其与`synchronized`锁的区别。`volatile`保证了变量的可见性和一定的有序性,但不能保证原子性。它通过内存屏障实现,避免指令重排序,确保线程间数据一致。相比`synchronized`,`volatile`性能更优,适用于简单状态标记和某些特定场景,如单例模式中的双重检查锁定。文中还解释了Java内存模型的基本概念,包括主内存、工作内存及并发编程中的原子性、可见性和有序性。
Java 并发编程——volatile 关键字解析
|
20天前
|
JSON Java 数据挖掘
利用 Java 代码获取淘宝关键字 API 接口
在数字化商业时代,精准把握市场动态与消费者需求是企业成功的关键。淘宝作为中国最大的电商平台之一,其海量数据中蕴含丰富的商业洞察。本文介绍如何通过Java代码高效、合规地获取淘宝关键字API接口数据,帮助商家优化产品布局、制定营销策略。主要内容包括: 1. **淘宝关键字API的价值**:洞察用户需求、优化产品标题与详情、制定营销策略。 2. **获取API接口的步骤**:注册账号、申请权限、搭建Java开发环境、编写调用代码、解析响应数据。 3. **注意事项**:遵守法律法规与平台规则,处理API调用限制。 通过这些步骤,商家可以在激烈的市场竞争中脱颖而出。
|
1月前
|
缓存 安全 Java
Java volatile关键字:你真的懂了吗?
`volatile` 是 Java 中的轻量级同步机制,主要用于保证多线程环境下共享变量的可见性和防止指令重排。它确保一个线程对 `volatile` 变量的修改能立即被其他线程看到,但不能保证原子性。典型应用场景包括状态标记、双重检查锁定和安全发布对象等。`volatile` 适用于布尔型、字节型等简单类型及引用类型,不适用于 `long` 和 `double` 类型。与 `synchronized` 不同,`volatile` 不提供互斥性,因此在需要互斥的场景下不能替代 `synchronized`。
2209 3
|
1月前
|
安全 Java 编译器
深入理解Java中synchronized三种使用方式:助您写出线程安全的代码
`synchronized` 是 Java 中的关键字,用于实现线程同步,确保多个线程互斥访问共享资源。它通过内置的监视器锁机制,防止多个线程同时执行被 `synchronized` 修饰的方法或代码块。`synchronized` 可以修饰非静态方法、静态方法和代码块,分别锁定实例对象、类对象或指定的对象。其底层原理基于 JVM 的指令和对象的监视器,JDK 1.6 后引入了偏向锁、轻量级锁等优化措施,提高了性能。
61 3
|
1月前
|
前端开发 Java 测试技术
java日常开发中如何写出优雅的好维护的代码
代码可读性太差,实际是给团队后续开发中埋坑,优化在平时,没有那个团队会说我专门给你一个月来优化之前的代码,所以在日常开发中就要多注意可读性问题,不要写出几天之后自己都看不懂的代码。
71 2
|
1月前
|
Java 编译器 数据库
Java 中的注解(Annotations):代码中的 “元数据” 魔法
Java注解是代码中的“元数据”标签,不直接参与业务逻辑,但在编译或运行时提供重要信息。本文介绍了注解的基础语法、内置注解的应用场景,以及如何自定义注解和结合AOP技术实现方法执行日志记录,展示了注解在提升代码质量、简化开发流程和增强程序功能方面的强大作用。
101 5