深入分析java中的关键字super

简介: super在平时编程和面试的时候经常会被使用到,这篇文章就仔细来分析一下他的用法,并和this关键字做一个对比分析。

1、概念


它是一个指代变量,用于在子类中指代父类对象。


2、应用范围


super的三种使用情况:

  • 访问父类的方法。
  • 调用父类构造方法。
  • 访问父类中的隐藏成员变量。


3、使用


(1)访问父类中的方法


第一步:定义father类

public class Father {
    private String father_a;
    public Father() {
        father_a="父亲:曹操";
        System.out.println("我是,"+father_a);
    }
    void dosomething(){
        System.out.println("曹操:挟天子以令诸侯");
    }   
}

第二步:定义son类

public class Son extends Father {
    private  String son_a;
    public Son() {
        super();
        son_a="儿子:曹冲";
        System.out.println("我是,"+son_a);
    }
    @Override
    void dosomething() {
        //访问父类中的方法
        super.dosomething();
    }
}

第三步:测试一下

public class Test {
    public static void main(String[] args) {
        Son son=new Son();
        son.dosomething();
    }
}
//output:
//我是,父亲:曹操
//我是,儿子:曹冲
//曹操:挟天子以令诸侯

我们会发现调用了super.dosomething();就会执行父类的dosomething方法。


(2)重写父类变量


我们还拿上面的例子来说明一下:

第一步:定义父类

public class Father {
    protected String father_a="我是父亲曹操的变量";
    void dosomething(){
        System.out.println("曹操:挟天子以令诸侯");
    }   
}

第二步:定义子类

public class Son extends Father {
    private  String son_a="我是儿子曹冲的变量";
    @Override
    void dosomething() {
        //super.father_a可以调用父类的变量(public和protected)
        System.out.println(super.father_a);
        System.out.println(son_a);
    }
}

第三步:测试一下

public class Test {
    public static void main(String[] args) {
        Son son=new Son();
        son.dosomething();
    }
}
//output
//我是父亲曹操的变量
//我是儿子曹冲的变量


(3)子类构造方法调用


第一步:定义父类

public class Father {
    protected String father_a="我是父亲曹操的变量";
    //无参构造器
    public Father() {
        System.out.println("无参构造器:"+father_a);
    }
    //有参构造器
    public Father(String father_a) {
        this.father_a = father_a;
        System.out.println("有参构造器:"+father_a);
    }
}

第二步:定义子类

public class Son extends Father {
    public Son() {
        //在子类中调用父类构造器
        //第一种:super(执行父类中的无参构造器,默认可以不写)
        //super();
        //第二种:执行父类中的有参构造器,参数写到super中就可以了
        super("子类传给父类的");
        System.out.println("子类的构造方法");
    }
}

第三步:测试

public class Test {
    public static void main(String[] args) {
        Son son=new Son();
    }
}
//output
//有参构造器:子类传给父类的
//子类的构造方法

从上面我们可以看到,其实是有两种情况


第一种:直接调用super()会执行父类的无参构造方法,可以默认不写。

第二种:使用super(“父类参数”),调用父类有参构造方法,把参数传递进来就好。


这两种情况还是比较简单的,不过还有几种比较特殊的情况需要我们去注意,网上的大神也都提到了,你可以试着去了解一下。


注意问题一:父类只有带参构造器(无参构造器没有),子类必须有相同参数的构造方法


我们还是使用代码去测试一下

首先我们定义一个父类:只有一个带参构造器

public class Father {
    protected String father_a="我是父亲曹操的变量";
    //有参构造器
    public Father(String father_a) {
        this.father_a = father_a;
        System.out.println("有参构造器:"+father_a);
    }
}

下面我们看看在子类中,如果什么都没有会出现什么

v2-fd1fff0764909ebe145c12a4b9f3a447_1440w.jpg

意思已经很明确了,我们的子类必须要有一个显示的构造方法去匹配父类。


注意问题二:子类必须有相同参数的构造方法,并且还需要调用super(参数)


在注意问题一种我们知道,在子类中需要定义一个构造方法去匹配父类构造方法,现在我们在子类中去定义一下不就解决了嘛,但随之而来由出来了个问题,我们看看。

v2-7e56666750922d6a3a9a084ec538689a_1440w.png

为什么会出现犯错误呢?其实我们只是定义了Son类的无参构造器,其默认调用super(),他只是调用了父类的无参构造器,并没有调用有参构造器,因此需要我们再去调用一下有参的。我们把son类中的构造方法中加上一句话就好了。

v2-d2ee71c45ced66ad282d7bb100564a18_1440w.jpg

super关键字我们只需要知道在三种情况下的使用就好,在构造方法中,还要注意两个问题。面试的时候游刃有余。OK,今天的文章就先讲到这。如有问题,还请批评指正。

相关文章
|
1天前
|
Java 关系型数据库 MySQL
【Java Spring开源项目】新蜂(NeeBee)商城项目运行、分析、总结
【Java Spring开源项目】新蜂(NeeBee)商城项目运行、分析、总结
12 4
|
1天前
|
算法 Java 数据安全/隐私保护
【Java开发指南 | 第二篇】标识符、Java关键字及注释
【Java开发指南 | 第二篇】标识符、Java关键字及注释
13 5
|
1天前
|
安全 算法 Java
Java一分钟:线程同步:synchronized关键字
【5月更文挑战第11天】Java中的`synchronized`关键字用于线程同步,防止竞态条件,确保数据一致性。本文介绍了其工作原理、常见问题及避免策略。同步方法和同步代码块是两种使用形式,需注意避免死锁、过度使用导致的性能影响以及理解锁的可重入性和升级降级机制。示例展示了同步方法和代码块的运用,以及如何避免死锁。正确使用`synchronized`是编写多线程安全代码的核心。
57 2
|
1天前
|
小程序 Java 容器
03|Java基础语法:讲解标识符、关键字、变量、数据类型、运算符、控制语句(条件分支、循环)
03|Java基础语法:讲解标识符、关键字、变量、数据类型、运算符、控制语句(条件分支、循环)
9 0
|
1天前
|
Java
深入浅出Java基础语法:标识符、关键字、变量、数据类型、运算符与控制语句
深入浅出Java基础语法:标识符、关键字、变量、数据类型、运算符与控制语句
7 0
|
1天前
|
Java
【Java多线程】分析线程加锁导致的死锁问题以及解决方案
【Java多线程】分析线程加锁导致的死锁问题以及解决方案
22 1
|
1天前
|
存储 安全 Java
【亮剑】Java并发编程涉及`ThreadLocal`、`Volatile`、`Synchronized`和`Atomic`四个关键机制
【4月更文挑战第30天】Java并发编程涉及`ThreadLocal`、`Volatile`、`Synchronized`和`Atomic`四个关键机制。`ThreadLocal`为每个线程提供独立变量副本;`Volatile`确保变量可见性,但不保证原子性;`Synchronized`实现同步锁,保证单线程执行;`Atomic`类利用CAS实现无锁并发控制。理解其原理有助于编写高效线程安全代码。根据业务场景选择合适机制至关重要。
|
1天前
|
Java 编译器
【Java探索之旅】this 关键字 解决你的成员变量困惑
【Java探索之旅】this 关键字 解决你的成员变量困惑
20 0
|
1天前
|
Java
【Java探索之旅】我与Java的初相识(完):注释,标识符,关键字
【Java探索之旅】我与Java的初相识(完):注释,标识符,关键字
8 0
|
1天前
|
Java
JAVA循环结构分析与设计
JAVA循环结构分析与设计
20 1