Java学习之super关键字

news2024/11/26 2:56:54

目录

一、super的作用

二、基本语法

第一条

第二条

第三条

 三、super便利/细节

第一条

第二条

第一种:直接调用

 第二种:this

第三种:super

 第三条

四、this和super的比较


一、super的作用

super 代表父类的引用, 用于访问父类的属性、 方法、 构造器

二、基本语法

第一条

访问父类的属性,但不能访问父类的private属性

例子:

父类

package com.hspedu.super_;

public class A {
    public int n1 = 100;
    protected int n2 = 200;
    int n3 = 300;
    private int n4 = 400;


    //访问父类的属性,但不能访问父类的private属性
    public void test100(){

    }
    protected void test200(){

    }
    void test300(){

    }
    private void test400(){

    }
}

子类

package com.hspedu.super_;

public class B extends A{
    //访问父类的属性,但不能访问父类的private属性
    public void hi() {
        System.out.println(super.n1 + " " + super.n2 + " " + super.n3 + " " + super.n4);
    }
}

在IDEA中super.n4会变成红色报错

 'n4' has private access in 'com.hspedu.super_.A'

原因:n4在父类A类中是private属性

第二条

访问父类的方法,但不能访问父类的private方法

 同属性一样,private方法也会报错

'test400()' has private access in 'com.hspedu.super_.A'

第三条

访问父类的构造器,super(参数列表):只能放在构造器的第一句,只能出现第一句

在父类中创建三个构造器

package com.hspedu.super_;

public class A {
    public int n1 = 100;
    protected int n2 = 200;
    int n3 = 300;
    private int n4 = 400;
    //默认无参构造器
    public A() {

    }
    //一个参数的有参构造器
    public A(String name) {

    }
    //两个参数的有参构造器
    public A(String name, int age) {

    }

    //访问父类的属性,但不能访问父类的private属性
    public void test100(){

    }
    protected void test200(){

    }
    void test300(){

    }
    private void test400(){

    }
}

在子类的构造器中访问(只能在构造器中访问,普通方法不能访问),因为必须在第一句,所以只能用一次

 报错原因

三个只能用一个 

 三、super便利/细节

第一条

调用父类的构造器的好处 (分工明确,父类属性由父类初始化,子类的属性由子类初始化)

第二条

当子类中有和父类中的成员(属性和方法)重名时,为了访问父类的成员必须使用super

如果没有重名,super、this、直接访问是一样的效果(举例说明)

例子:在父类-A类中创建cal方法

public void cal(){
    System.out.println("A类的cal()方法");
}

在子类-B类的sum方法中访问

此时有三种方法可以直接访问

第一种:直接调用

public void sum() {
        System.out.println("B类的sum()");
        
        cal();
 }

访问顺序是:

1)先找本类,如果有,则调用(本类不受访问修饰符限制)
2)如果没有,则找父类,如果有且可以调用则调用
3)如果父类没有,则继续找父类的父类,规则同上,直到Object类
tips:如果查找方法的过程中找到了,但是不能访问,则报private access
如果直到Object类都没找到,则提示方法不存在(无法解析)

创建新对象测试

package com.hspedu.super_;

public class Super01 {
    public static void main(String[] args) {
        B b = new B();
        b.sum();
    }
}

运行结果

 如果把A类中的cal方法改成private方法,B类会报错,并给出以下提示

如果把A类中的cal方法注销,B类会提示:Cannot resolve method 'cal' in 'B' ,无法解析“B”中的方法“cal”(找不到这个方法)

 第二种:this

this.cal()的逻辑完全等价于直接访问

第三种:super

super.cal();直接查找父类,除此之外,其他逻辑同直接调用和this

演示:在子类-B类内创建一个cal()方法

package com.hspedu.super_;

public class B extends A{
    //访问父类的属性,但不能访问父类的private属性
    public void hi() {
        System.out.println(super.n1 + " " + super.n2 + " " + super.n3);
    }
    //访问父类的方法,但不能访问父类的private方法
    public void hello() {
        super.test100();
        super.test200();
        super.test300();
        //super.test400();
    }
    //访问父类的构造器,super(参数列表):只能放在构造器的第一句,只能出现第一句
    public void ok(){
        //super();//只能在构造器中使用
    }

    public B() {
        //super();
        //super("jack");
        super("jack",34);
    }
    public void cal() {
        System.out.println("B类的cal()方法");
    }
    public void sum() {
        System.out.println("B类的sum()"); 
        super.cal();//直接查找父类,除此之外,其他逻辑同直接调用和this
    }
}
package com.hspedu.super_;

public class Super01 {
    public static void main(String[] args) {
        B b = new B();
        b.sum();
    }
}

结果:不会调用子类-B类的cal()方法 

如果是直接调用和this则会调用B类的cal 

package com.hspedu.super_;

public class B extends A{
    //访问父类的属性,但不能访问父类的private属性
    public void hi() {
        System.out.println(super.n1 + " " + super.n2 + " " + super.n3);
    }
    //访问父类的方法,但不能访问父类的private方法
    public void hello() {
        super.test100();
        super.test200();
        super.test300();
        //super.test400();
    }
    //访问父类的构造器,super(参数列表):只能放在构造器的第一句,只能出现第一句
    public void ok(){
        //super();//只能在构造器中使用
    }

    public B() {
        //super();
        //super("jack");
        super("jack",34);
    }
    public void cal() {
        System.out.println("B类的cal()方法");
    }
    public void sum() {
        System.out.println("B类的sum()"); 
        cal();
        this.cal();
}

运行结果

 在访问属性的时候,规则同上,举例说明:在子类-B类中新建属性n1

子类:

package com.hspedu.super_;

public class B extends A{
    public int n1 = 888;
    //访问父类的属性,但不能访问父类的private属性
    public void hi() {
        System.out.println(super.n1 + " " + super.n2 + " " + super.n3);
    }
    //访问父类的方法,但不能访问父类的private方法
    public void hello() {
        super.test100();
        super.test200();
        super.test300();
        //super.test400();
    }
    //访问父类的构造器,super(参数列表):只能放在构造器的第一句,只能出现第一句
    public void ok(){
        //super();//只能在构造器中使用
    }

    public B() {
        //super();
        //super("jack");
        super("jack",34);
    }
    public void cal() {
        System.out.println("B类的cal()方法");
    }
    public void sum() {
        System.out.println("B类的sum()");
       
        super.cal();//直接查找父类,除此之外,其他逻辑同直接调用和this
        System.out.println(n1);
        System.out.println(this.n1);
        System.out.println(super.n1);
    }
}

父类-A类中也有属性n1

package com.hspedu.super_;

public class A {
    public int n1 = 100;
    protected int n2 = 200;
    int n3 = 300;
    private int n4 = 400;
    //默认无参构造器
    public A() {

    }
    //一个参数的有参构造器
    public A(String name) {

    }
    //两个参数的有参构造器
    public A(String name, int age) {

    }

    //访问父类的属性,但不能访问父类的private属性
    public void test100(){

    }
    protected void test200(){

    }
    void test300(){

    }
    private void test400(){

    }
    public void cal(){
        System.out.println("A类的cal()方法");
    }
}

运行

package com.hspedu.super_;

public class Super01 {
    public static void main(String[] args) {
        B b = new B();
        b.sum();
    }
}

结果:cal()和this.cal()访问的都是本类B类的属性n1,即999

 第三条

如果爷爷类和本类中有同名的成员,也可以使用super去访问爷爷类的成员;如果多个基类(上级类)中都有同名的成员,使用super访问遵循就近原则。A->B->C(父类—>爷爷类—>曾祖父类—>......—>Object类),当然也需要遵守访问权限的相关规则(四个访问修饰符)

创建一个新类Base

package com.hspedu.super_;

public class Base {
    public int n1 = 999;
    public int age = 111;
    public void eat(){
        System.out.println("Base类中的eat()方法...");
    }
    public void cal() {
        System.out.println("Base类的cal()方法...");
    }
}

并且让A类继承Base类

package com.hspedu.super_;

public class A extends Base{
    public int n1 = 100;
    protected int n2 = 200;
    int n3 = 300;
    private int n4 = 400;

    public int getN1() {
        return n1;
    }

    //默认无参构造器
    public A() {

    }
    //一个参数的有参构造器
    public A(String name) {

    }
    //两个参数的有参构造器
    public A(String name, int age) {

    }

    //访问父类的属性,但不能访问父类的private属性
    public void test100(){

    }
    protected void test200(){

    }
    void test300(){

    }
    private void test400(){

    }
    public void cal(){
        System.out.println("A类的cal()方法");
    }
}

在子类B类中新建方法test

package com.hspedu.super_;

public class B extends A{
    public int n1 = 888;

    public void test() {
        //就近原则
        System.out.println("super.n1=" + super.n1);
    }
}

运行:根据就近原则,此时输出的是A类中的100

package com.hspedu.super_;

public class Super01 {
    public static void main(String[] args) {
        B b = new B();
        
        b.test();
    }
}

 如果A类中没有n1,则会输出Base类中的n1,即999

 

调用方法的规则同访问属性的规则一样

 会调用A类的cal方法

如果A类没有,则调用Base类

 

四、this和super的比较

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/52174.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue3表单输入绑定生命周期

官网&#xff1a;https://cn.vuejs.org/guide/essentials/forms.html#checkbox 复选框 在这个例子中&#xff0c;checkedNames 数组将始终包含所有当前被选中的框的值。 const checkedNames ref([])<div>Checked names: {{ checkedNames }}</div><input type…

docker镜像打包上传阿里云镜像仓库

阿里云镜像仓库说明&#xff1a; 将镜像推送到Registry $ docker login --usernamealiyun0398513152 rz-dt-image-server-registry.cn-shanghai.cr.aliyuncs.com $ docker tag [ImageId] rz-dt-image-server-registry.cn-shanghai.cr.aliyuncs.com/rz-dt/k8s-springboot-demo:[…

澜起科技发布业界首款DDR5第三子代寄存时钟驱动器工程样片

上海—2022年12月1日&#xff0c;澜起科技宣布在业界率先推出DDR5第三子代寄存时钟驱动器&#xff08;简称RCD或DDR5 RCD03&#xff09;工程样片&#xff0c;并已向业界主流内存厂商送样&#xff0c;该产品将用于新一代服务器内存模组。 澜起科技DDR5第三子代寄存时钟驱动器 D…

堆排序和Top-K问题(C语言实现)

文章目录&#xff1a;1.堆排序1.1向上调整和向下调整建堆对比1.2堆排序实现1.2.1升序1.2.2降序2.Top-K问题2.1解决思路2.2代码实现前面的文章讲了堆的结构和基础接口实现&#xff0c;不熟的友友们可以去看看堆&#xff08;C语言实现&#xff09;&#xff0c;点击跳转 1.堆排序 …

Jenkins pipeline stash实现文件跨节点共享

概述 stas unstash 函数允许在流水线的节点间和/或阶段间保存和获取&#xff08;分别地&#xff09;文件。它们的格式&#xff1a; stash(name: "<name>",includes: "<pattern>",excludes: "<pattern>") unstash("<…

狂神说Go语言学习笔记(四)

狂神说Go语言学习笔记&#xff08;一&#xff09; 狂神说Go语言学习笔记&#xff08;二&#xff09; 狂神说Go语言学习笔记&#xff08;三&#xff09; 一、什么是函数 func main() {//调用函数 函数名()fmt.Println(add(1, 2)) //3 }func add(a, b int) int {c : a breturn …

[附源码]JAVA毕业设计高校在线办公系统(系统+LW)

[附源码]JAVA毕业设计高校在线办公系统&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术…

【配电网重构】基于粒子群算法的配电网重构问题研究附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

Nacos config 配置相关

Nacos config 相关关于配置文件bootstrap和application异同点加载顺序优先级注意事项关于.properties和.yml比较加载顺序优先级别区别关于Nacos配置官方文档注意关于配置文件bootstrap和application SpringCloud项目中存在bootstrap和application两种配置&#xff0c;下面分别…

[附源码]计算机毕业设计springboot社区住户信息管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【正版软件】Navicat Monitor 实时数据库监控工具,一套安全、简单而且无代理的远程服务器监控工具。

简言 Navicat Monitor 是一套安全、简单而且无代理的远程服务器监控工具。它具有强大的功能使你的监控发挥最大效用。受监控的服务器包括 MySQL、MariaDB 和 SQL Server&#xff0c;并与 Amazon RDS、Amazon Aurora、Oracle Cloud、Microsoft Azure、阿里云、腾讯云和华为云等…

[附源码]Python计算机毕业设计Django高校商铺管理系统论文

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Java+JSP+MySQL基于SSM的雷锋车队管理系统的设计与实现-计算机毕业设计

项目介绍 随着我国国民经济的发展和人文素质的不断提高&#xff0c;越来越多的爱心人士出现在了社会的各种角落之中&#xff0c;其中的哥和爱心人士&#xff0c;组织了一种基于交通和车辆之间的互助的民间组织&#xff0c;这种组织叫做雷锋爱心车队&#xff0c;而且雷锋爱心车…

【lambda表达式】变量作用域和lambda 表达式的处理

变量作用域 通常&#xff0c; 你可能希望能够在 lambda 表达式中访问外围方法或类中的变量。 public static void repeatMessage(String text, int delay){ActionListener listener event ->{ System.out.println(text);Toolkit.getDefaultToolkitO.beep();}new Timer(de…

PowerShell 打开十六进制文件

1&#xff0c;打开PowerShell 2&#xff0c;进入文件所在路径 3&#xff0c;Format-Hex -Path ./bootloader.bin 4&#xff0c;效果

selenium UI使用小技巧集合

selenium这个工具就不用我多介绍了吧&#xff0c;咱们已经说过很多很多次咯&#xff0c;所以就直接上主题&#xff1a; 窗口截图 webdriver 提供了 get_screenshot_as_file()函数来截取当前窗口 from selenium import webdriver from time import sleepdriver webdriver.Ch…

超详细的Python实现MySQL数据库基本操作,今天小编给大家整理好了

一、SQL语句 (mysql 数据库中的语言) show databases;查看数据库 use "database_ name" ;进入数据库 show tables; 查看当前数据库中有哪些表 select * from "table_ name";查询数据表中的所有内容 describe "table_ name"; 查看表结构 desc &q…

外包干了2年,彻底废了...

先说一下自己的情况。大专生&#xff0c;17年通过校招进入湖南某软件公司&#xff0c;干了接近2年的点点点&#xff0c;今年年上旬&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01;而我已经在一个企业干了五年的功能测试…

【Linux】Linux下基本指令(一)

作者&#xff1a;一个喜欢猫咪的的程序员 专栏&#xff1a;《Linux》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 目录 一、浅谈操作系统&#xff1a; 1.1什么是操作系统&#xff1f;&#xff…

力扣46:全排列(Java回溯)

一、题目描述 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2&#xff1a; 输入&…