java第二十四课 —— super 关键字 | 方法重写

news2024/12/23 15:25:24

super 关键字

基本介绍

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

基本语法

  1. 访问父类的属性,但不能访问父类的 private 属性。
    super.属性名;

  2. 访问父类的方法,不能访问父类的 private 方法。

    super.方法名(参数列表);

  3. 访问父类的构造器:

    super(参数列表); 只能放在构造器的第一句,只能出现一句!

super 给编程带来的便利/细节

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

  2. 当子类中有和父类中的成员(属性和方法)重名时,为了访问父类的成员,必须通过 super。如果没有重名使用 super、this、直接访问是一样的效果!

  3. super 的访问不限于直接父类,如果爷爷类和本类中有同名的成员,也可以使用 super 去访问爷爷类的成员;如果多个基类(上级类)中都有同名的成员,使用 super 访问遵循就近原则。Base->A->B 。

    例子:

    Super01.java:

    package com.hspedu.super_;
    
    public class Super01 {
        public static void main(String[] args) {
            B b = new B();
            //b.sum();
            b.test();
        }
    }
    

    Base.java:

    package com.hspedu.super_;
    
    public class Base {
        public int n1 = 1000;
        public void cal(){
            System.out.println("Base类的cal()方法...");
        }
        public void eat(){
            System.out.println("Base类的eat()方法...");
        }
    
    }
    

    A.java:

    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 A(){
    
            }
            public A(String name){
    
            }
            public A(String name, int age){
    
            }
    //        public void cal(){
    //            System.out.println("A类的cal()方法...");
    //        }
            public void test100(){};
            protected void test200(){};
            void test300(){};
            private void test400(){};
    
    }
    

    B.java:

    package com.hspedu.super_;
    
    public class B extends A {
        public int n1 = 888;
        public void hi(){
            System.out.println(super.n1 + " " + super.n2 + " "
                                + super.n3 ); //访问父类的属性,但不能访问父类的 private 属性
        }
        public void test(){//super遵循就近原则去父类查找
            System.out.println("super.n1 = " + super.n1);
            super.cal();
        }
    
        public void cal(){
            System.out.println("B类的cal()方法...");
        }
        public void sum(){
            System.out.println("B类的sum()方法...");
            //调用父类A的cal方法,有三种方法:
            cal();//第一种
            this.cal();//第二种
            //第一二种方法,找cal方法时,顺序是,
            //1.先找本类,如果有,并且可以调用,则调用,
            //2.如果没有,则找父类(如果有,并可以调用,则调用)
            //3.如果父类没有,则继续找父类的父类,直到Object类
            //提示:如果查找方法的过程中,找到了,但是不能访问(private),则报错
            //如果没有找到,则提示方法不存在
            super.cal();//第三种找cal方法顺序是直接查找父类,其他的规则一样
            //调用父类A的n1属性,有三种方法,规则同上:
            System.out.println(n1);
            System.out.println(this.n1);
            System.out.println(super.n1);
        }
        public void ok(){
            super.test100();
            super.test200();
            super.test300();
            //super.test400();//访问父类的方法,不能访问父类的 private 方法。
        }
        public B(){
            //super();
            //super("Jack");
            super("Jack", 18);
        }
    
    }
    

    super 和 this 的比较

在这里插入图片描述

方法重写/覆盖(override)

基本介绍

简单的说:方法覆盖(重写)就是子类有一个方法,和父类的某个方法的名称、返回类型、参数一样,那么我们就说子类的这个方法覆盖了父类的那个方法。

例子:

Override01.java:

package com.hspedu.override_;

public class Override01 {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.cry();
    }
}

Animal.java:

package com.hspedu.override_;

public class Animal {
    public void cry(){
        System.out.println("动物叫唤...");
    }

}

Dog.java:

package com.hspedu.override_;

public class Dog extends Animal{
    //1.因为 Dog 是 Animal 子类
    //2.Dog 的 cry方法和 Animal 的 cry定义形式一样(名称、返回类型、参数)
    //3.这时我们就说 Dog 的 cry 方法,重写了 Animal 的 cry 方法
    public void cry(){
        System.out.println("小狗汪汪叫...");
    }
}

注意事项和使用细节

  1. 子类方法的形参列表,方法名称,要和父类方法的形参列表,方法名称完全一样。

  2. 子类方法的返回类型和父类方法的返回类型一样,或者是父类返回类型的子类。

    比如:父类返回类型是 Object,子类方法返回类型是 String,也可以。
    public object getInfo(){}

    public string getInfo(){}

  3. 子类方法不能缩小父类方法的访问权限,可以扩大权限
    void sayok(){}
    public void sayok(){}这里是可以的。

方法的重写和重载比较

在这里插入图片描述

练习题

题目要求:

  • 编写一个 Person 类,包括属性/private(name、age),构造器、方法 say(返回自我介绍的字符串)。
  • 编写一个 Student 类,继承 Person 类,增加 id、score 属性 /private,以及构造器,定义 say 方法(返回自我介绍的信息)。
  • 在 main 中,分别创建 Person和 Student 对象,调用 say 方法输出自我介绍

OverrideExercise.java:

package com.hspedu.override_.Exercise;

public class OverrideExercise {
    public static void main(String[] args) {
        Person person = new Person("Jack", 18);
        Student student = new Student("Tom",18, "123456",120);
        System.out.println(person.Say());
        System.out.println(student.Say());
    }
}

Person.java:

package com.hspedu.override_.Exercise;

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String Say(){
        return ("我的名字是:" + name + " 我的年龄是:" + age);
    }
}

Student.java:

package com.hspedu.override_.Exercise;

public class Student extends Person{
    private String id;
    private int score;

    public Student(String name, int age, String id, int score) {
        super(name, age);
        this.id = id;
        this.score = score;
    }
    public String Say(){
        return (super.Say() + " id 是:" + id + " 成绩是:" + score);
    }
}

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

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

相关文章

每天五分钟深度学习框架pytorch:多维tensor向量在某一维度的拼接和分割

本文重点 在深度学习中,我们常常需要完成多个向量拼接,同时也要完成向量的分割,在pytorch中已经有封装好的库,我们可以直接调用完成这部分任务。 Cat拼接 c=torch.cat([a,b],dim=0)表示将a和b按0维度进行拼接,需要注意再非dim维度,两个矩阵的维度必须是一致的,不然会拼…

01 飞行器设计 —— 一门独立的学科

01 飞行器设计 —— 一门独立的学科 01 引言02 飞机设计概述2-1 什么是飞机设计?2-1 飞机设计是从哪里开始的?2-2 如何成为一名飞机设计师?2-4 本书的组织 参考文献 说明:关于Raymer的《Aircraft Design》的读书笔记; …

【数字化转型,从BI开始】论BI在数字化转型的作用

引言:在新的市场和用户需求、传统经济增长缓慢、疫情黑天鹅事件等多重因素的影响下,企业遭遇了集体性的困境,而数字化转型就是各领域企业寻找出的应对方式。数字化转型包含的三维度之一数据力,就包含数据治理和数据分析&#xff0…

第 4 章:从 Spring Framework 到 Spring Boot

通过前面几个章节的介绍,相信大家已经对 Spring Framework 有了一个基本的认识,相比早期那些没有 Spring Framework 加持的项目而言,它让生产力产生了质的飞跃。但人们的追求是无止境的,这也驱动着技术的发展。开发者认为 Spring …

浅谈配置元件之Java默认请求

浅谈配置元件之Java默认请求 1.简介 “Java默认请求”(虽然直接名为"Java Request"更常见)是一个高级配置元件,它允许用户通过Java代码自定义请求逻辑,为测试提供了极高的灵活性和扩展性。 2.Java请求组件概述 在JM…

MYSQL、ORACLE、PostgreSQL数据库对象层次及权限管理对比

文章目录 前言一、PostgreSQL二、MySQL三、Oracle 前言 本文为出于自己扩展、比较、图形化的思维路径自行总结归纳,可能有些细节不太准确,欢迎指正。 MySQL、Oracle、PostgreSQL关系型数据库都有管理员用户、用户、权限管理、表函数索引等数据库对象&am…

Python学习笔记10:入门知识(十)

函数 什么是函数 简单来说就是具备某些特定功能的带有名称的代码块。比如之前我们讲过的列表的增删改查函数,排序函数等等。 函数的作用 代码复用。函数作为具备某些特定功能的代码块,当你的程序需要多次使用同一段业务逻辑的时候,使用函…

KT-H6测距模块标品,测距范围1500m,demo报价1000RMB,批量报价500RMB

激光测距传感器是一种用于测量距离的模块,通常由传感器和相关电子设备组成,测距模块可以集成到各种设备和系统中,以实现准确的测距和定位功能。KT-H6系列激光测距模块,为自主研发,激光波长905nm的激光器,专为热成像、夜视仪、无人机、安防、瞄具等产品定身打造,其优点是…

msvcp120.dll丢失原因分析与解决方法分享

msvcp120.dll 是一个动态链接库(Dynamic Link Library, DLL),属于 Microsoft Visual C 2013 再发行组件包的一部分。它提供了 C 标准库的实现,使得使用 C 编写的应用程序能够在运行时动态链接到该库,从而访问其提供的函…

头歌资源库(6)汉诺塔(递归)

一、 问题描述 二、算法思想 首先定义一个函数,接收四个参数:n表示当前需要移动的盘子数量,A表示起始基座,B表示目标基座,C表示辅助基座。 在函数内部,首先判断如果n为1,即只有一个盘子需要…

父亲节 | 10位名家笔下的父亲,读懂那份孤独而深沉的父爱

Fathers Day 母爱如水,父爱如山。 相对于母爱的温柔,父亲的爱多了几分静默和深沉。 读完10位名家笔下的父亲,我们就会明白,到底亏欠了父亲多少。 不要让自己有“子欲养而亲不待”的后悔和遗憾, 多给父亲一些爱的表示&a…

项目进度和成本管理

1.如何正确标识出软件项目活动? 正确标识软件项目活动是项目管理中的一个重要步骤,它有助于确保项目的顺利进行和成功完成。以下是一些标识软件项目活动的步骤和建议: 项目范围定义:首先明确项目的目标和范围,这将帮助…

某集团数字化转型蓝图规划项目案例(94页PPT)

案例介绍: 本集团数字化转型蓝图规划项目通过确定目标,如制定集团数字化转型的整体战略和规划,明确转型方向和目标。构建数字化业务体系,实现业务流程数字化、智能化。搭建数字化管理平台,提升集团内部的管理效率和决…

c语言——扫雷游戏(简易版)

目录 前言游戏设计 前言 什么是扫雷游戏? 游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。 这个游戏对于c语言的初学者来说难度还是挺大的,那我就实现一个初学者也能快速学…

C++ 55 之 多继承

#include <iostream> #include <string> using namespace std;class Base08_1{ public:int m_a;Base08_1(){this->m_a 10;} };class Base08_2{ public:// int m_b;int m_a;Base08_2(){// this->m_b 20;this->m_a 30;} };// 多继承 继承的类型都要…

sort使用

具体使用 bool myfunction(int i, int j) { return (i < j); }class my_function { public:bool operator()(int i, int j) { return (i < j); } }; int main() {int array[] { 4,1,8,5,3,7,0,9,2,6 };// 默认按照小于比较&#xff0c;排出来结果是升序std::sort(array…

汉邦高科防监控初始化恢复方法

汉邦高科算是安防市场上的三线品牌&#xff0c;产品不算多&#xff0c;但在某些地域有一定的市场份额。下面我们看下汉邦高科安防监控格式化后如何恢复数据&#xff1a; 故障存储:ST300VM002 故障现象: 由于各种原因录像机被初始化&#xff0c;导致数据全部丢失&#xff0c;…

逻辑斯蒂回归与最大熵

知识树 感知机的缺陷 修补感知机缺陷-逻辑斯蒂回归 下面这两个值是强制给的,不是推导的 最大熵 最大熵的一个小故事 最大熵模型 我们最终目标是要求P(Y|X) 书上写的是H,但是2我们认为H(Y|X)更合适 咱们最终的目的是要用拉格朗日乘数法,所以需要约束 总结 感觉深度之眼比较模…

xinput1_3.dll怎么安装,关于xinput1_3.dll的多种修复方法分享

在电脑使用过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是“找不到xinput1_3.dll”。那么&#xff0c;xinput13.dll到底是什么&#xff1f;为什么会出现找不到的情况&#xff1f;它对电脑有什么影响&#xff1f;本文将为您详细解析xinput1_3.dll的含义…

【stm32-新建工程】

stm32-新建工程 ■ 下载相关STM32Cube官方固件包&#xff08;F1&#xff0c;F4&#xff0c;F7&#xff0c;H7&#xff09;■ 1. ST官方搜索STM32Cube■ 2. 搜索 STM32Cube■ 3. 点击获取软件■ 4. 选择对应的版本下载■ 5. 输入账号信息■ 6. 出现下载弹框&#xff0c;等待下载…