Java学习 (六) 面向对象--this、继承、方法重写、super

一、this 关键字

1、this  演示

vi Person.java

public class Person {
    String name;
    int age;


    //显示声明构造器
    public Person(String s , int i){
        name = s;
        age = i;
    }

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

}

vi PersonTest.java

public class PersonTest {
    public static void main(String[] args) {

        Person p1  = new Person("jack",20);
        p1.setAge(11);
        System.out.println(p1.name + p1.age);
    }
}

我们上面写了一段代码,看起来没什么问题,但是是有坑的。  我们先执行一下test文件

jack20

可以看到和我们的预期的jack11是不相符的, p1.setAge(11) 没有生效,相关的逻辑如下

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

我们给形参定义的名称age,和成员属性是一样的,直接这么用谁也不知道那个是那个,在这里就可以通过this.age 来声明这个age是当前类下面的age,不是当前方法下的age

vi Person.java

public class Person {
    String name;
    int age;


    //显示声明构造器
    public Person(String s , int i){
        name = s;
        age = i;
    }

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

}

2、多个构造器

有一种情况,我们可能根据传入的参数数量或者类型不同,会进行不同类型的形参接受来区分不同的后续逻辑

 vi Person.java

public class Person {
    String name;
    int age;


    //显示声明构造器
    public Person(){
       System.out.println("111");
    }

    public Person(String s ){
        System.out.println("111");
        name = s;

    }

    public Person(String s , int i){
        System.out.println("111");
        name = s;
        age = i;
    }

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

}

vi PersonTest.java

public class PersonTest {
    public static void main(String[] args) {

        Person p1  = new Person();

        Person p2  = new Person("jack");

        Person p3  = new Person("jack",20);

    }
}

返回

111
111
111

我们上面定义了3个构造器,可以通过传参不同自动识别到不同逻辑的构造器中,像这种在构造器中重复的代码,也是可以通过this继承的

vi Person.java

public class Person {
    String name;
    int age;


    //显示声明构造器
    public Person(){
       System.out.println("111");
    }
    public Person(String s){
        this();   //添加 直接用this 会去找Person() 形参为空的构造器
        name = s;
        System.out.println("构造器2  (String s )");
    }
    public Person(String s , int i){
        this(s);   //添加 Person(s)  会找形参变量名称为s 的变量
        name = s;
        age = i;
    }

    public void setAge(int age){

        this.age = age;
    }

}

我们在构造器2和构造器3中分别添加了一个this() 和this(s)的操作,他的含义是,第二个构造器会继承形参为空的同名构造器,继承的时候会在初始化时自动执行对应下面的属性, 第三个构造器会去继承同名构造器的形参为s的操作 ,同理,如果我们单独去调用构造器3,那么他会执行第二个构造器,第二个构造器又会继承形参为空的构造器,执行效果如下

vi PersonTest.java

public class PersonTest {
    public static void main(String[] args) {


        Person p3  = new Person("jack",20);

    }
}

3、this小结

二、继承

1、继承案例

vi Person.java

class Person {
    public String name;
    public int age;

    public String zex;

}
class Student {
    public String name;
    public int age;

    public String zex;

    public String school;
}

 我上面写了两个类,但他们存在大量重复的属性,当遇到这种冗余代码,我们可以通过继承来简化代码,继承的关键字是extends,写在子类定义的后面,如下

vi Person.ava

class Person {
    public String name;
    public int age;

    public String zex;

}
class Student extends Person {

    public String school;
}

 Student 类会继承Person的所有属性和方法,并且增加一个自身的school的属性

2、继承使用的逻辑

在java中,如果没有声明继承的类,那么会默认继承java.lang.object

三、方法的重写

我们上面说了继承,被继承的类称为父类,继承的类称为子类,当子类不想使用父类中继承的某个方法时,子类可以重写定义继承的方法

vi person.java

class Person {
    public String name;
    public int age;

    public String zex;


    //新增方法
    public Account sed(){
        System.out.println("123");
        return null;
    }
}
class Student extends Person {

    public String school;
}

vi PersonTest.java

public class PersonTest {
    public static void main(String[] args) {


        //调用子类Student调用继承的方法
        Student s3  = new Student();
        s3.sed();

    }
}

我们在上面继承的案例上添加了一个方法sed ,但是我们想要在通过子类进行调用的时候时候使用子类自己的方法, 实际操作就是在子类下定义一个相同名称的方法

vi Person.java

class Person {
    public String name;
    public int age;

    public String zex;


    //新增方法
    public Account sed(){
        System.out.println("123");
        return null;
    }
}
class Student extends Person {

    public String school;

    //新增子类独立方法
    public Account sed(){
        System.out.println("456");
        return null;
    }
}

重写和重载的区别

四、super 关键字

我们虽然在子类中定义了重写方法,但是我们依旧可以对父类中被重写的方法进行调用

 1、子类调用父类方法

说白了,现在就是想要在子类里面直接去调用父类的方法

vi Person.java

class Person {
    public String name;
    public int age;

    public String zex;


    //新增方法
    public Account sed(){
        System.out.println("123");
        return null;
    }
}
class Student extends Person {

    public String school;
    public Account sed(){
        System.out.println("456");
        return null;
    }

    public Account test1(){
        //子类调用父类方法
        super.sed();

        return null;
    }

}

vi PersonTest.java

public class PersonTest {
    public static void main(String[] args) {


        Student s3  = new Student();
        s3.test1();

    }
}

上面我们是继承了父类的子类需要加super,如果不继承的话,子类能直接调用父类方法,sed(); 或者this.sed();   这里加不加this.都是调用父类的方法,因为子类没有重写

如果子类和父类中都有定义相同名称的变量,那么就近原则,子类变量优先,子类没有该变量,才会去找父类的值

2、super调用方法

3、调用父类的构造器

我们在子类的构造器中,使用super()的时候会去调用父类的空参构造器,如果要调用带参数的构造器,那么需要在super(参数),super()调用构造器,必须在第一行

4、super调用构造器的过程

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FuTalk设计周刊-Vol.063

#AI漫谈 热点捕手 1.设计师必看!GPTs让你的创意飞起来! 我们将深入探讨什么是GPTs、其强大功能和独特优势,以及一些值得推荐的GPT应用和获取途径。 链接https://mp.weixin.qq.com/s/EtVxF9XYvCu6ANFfotortA 2.Figma Config 2024 大会内容回…

考研生活day2--王道课后习题2.3.1、2.3.2、2.3.3

2.3.1 题目描述: 这题和曾经做过的LeetCode203.移除元素一模一样,所以我们就使用LeetCode进行书写,题目链接203. 移除链表元素 - 力扣(LeetCode) 解题思路 大家的第一反应肯定是根据书上所学的书写方法一样书写&…

为什么这几年参加PMP考试的人越来越多

参加PMP认证的人越来越多的原因我认为和社会发展、职场竞争、个人提升等等方面有着不小的关系。国际认证与国内认证的性质、发展途径会有一些区别,PMP引进到中国二十余年,报考人数持增长状态也是正常的。 具体可以从下面这几个点来展开论述。 市场竞争…

【技术追踪】SegGuidedDiff:基于分割引导扩散模型实现解剖学可控的医学图像生成(MICCAI-2024)

它来了它来了,它带着 mask 做生成了~ SegGuidedDiff:提出一种用于解剖学可控医学图像生成的扩散模型,在每个采样步骤都遵循多类解剖分割掩码并结合了随机掩码消融训练算法,可助力乳房 MRI 和 腹部/颈部到骨盆 CT 等任务涨点。 论文…

python中的包和模块

目录 一、包与模块 二、第三方包的安装 2.1 pip install 2.2使用 curl 管道 2.3其他安装方法 三、导入单元的构成 3.1pip的使用 四、模块的缓存 一、包与模块 Python 中除了函数库以外,还有非常多且优秀的第三方库、包、模块。 模块Module:以…

LangChain 开发智能Agent,你学会了吗?

Prompt Enginnering 是打开LLM宝库的一把金钥匙,如果prompt得法,并能将其技巧与某项工作深度结合,那必将大大增效。今天我们来聊聊如何优化Prompt设计、Prompt Template管理等技术和体力活,并赋能老喻干货店的营销活动。 LLM Pro…

基于机器学习的零售商品销售数据预测系统

1 项目介绍 1.1 研究目的和意义 在电子商务日益繁荣的今天,精准预测商品销售数据成为商家提升运营效率、优化库存管理以及制定营销策略的关键。为此,开发了一个基于深度学习的商品销售数据预测系统,该系统利用Python编程语言与Django框架&a…

Java服务器代码远程调试(IDEA版)

Java服务器代码远程调试 配置启动脚本参数配置IDEA远程调试工具操作步骤 注意:远程调试的代码需要与本地代码一致,远程调试目的是解决本地环境无法支持调试的情况下,解决线上(测试)环境调试问题。 配置启动脚本参数 n…

昇思25天学习打卡营第10天|linchenfengxue

基于MobileNetv2的垃圾分类 通过读取本地图像数据作为输入,对图像中的垃圾物体进行检测,并且将检测结果图片保存到文件中。 MobileNetv2模型原理介绍 MobileNet网络是由Google团队于2017年提出的专注于移动端、嵌入式或IoT设备的轻量级CNN网络&#x…

TikTok直播限流与网络的关系及解决方法

TikTok作为一款热门的社交平台,其直播功能吸引了大量用户。然而,一些用户可能会遇到TikTok直播限流的问题,例如直播过程中出现播放量低、直播画面质量差等情况。那么,TikTok直播限流与所使用的网络线路是否有关系?是否…

TypeScript Project References npm 包构建小实践

npm 包输出 es/cjs 产物 在开发一个 npm 包时,通常需要同时输出 ES 模块和 CommonJS 模块的产物供不同的构建进行使用。在只使用tsc进行产物编译的情况下,我们通常可以通过配置两个独立的 tsconfig.json 配置文件,并在一个 npm script 中 执…

typescript学习回顾(五)

今天来分享一下ts的泛型,最后来做一个练习 泛型 有时候,我们在书写某些函数的时候,会丢失一些类型信息,比如我下面有一个例子,我想提取一个数组的某个索引之前的所有数据 function getArraySomeData(newArr, n:numb…

Mouse Prealbumin ELISA Kit小鼠前白蛋白ELISA试剂盒

前白蛋白(PRE)是一种由4条相同的多肽链组成的四聚体蛋白。电泳时,它比血清白蛋白的迁移速度更快,PRE可以作为多种疾病患者营养评价的标志物。ICL的Mouse Prealbumin ELISA Kit应用双抗体夹心法测定小鼠样本中前白蛋白水平&#xf…

CentOS7源码安装nginx并编写服务脚本

华子目录 准备下载nginx源码包关闭防火墙关闭selinux安装依赖环境 解压编译安装测试编写服务脚本,通过systemctl实现服务启动与关闭测试 准备 下载nginx源码包 在源码安装前,我们得先下载nginx源码包https://nginx.org/download/这里我下载的是nginx-1…

《梦醒蝶飞:释放Excel函数与公式的力量》8.2 COUNTA函数

8.2 COUNTA函数 COUNTA函数是Excel中用于统计指定区域内所有非空单元格数量的函数。它能够统计数值、文本、错误值以及公式返回的结果,是数据分析中常用的统计工具。 8.2.1 函数简介 COUNTA函数用于统计指定区域中所有非空单元格的数量。它与COUNT函数不同&#…

transformer——多变量预测PyTorch搭建Transformer实现多变量多步长时间序列预测(负荷预测)——transformer多变量预测

写在最前: 在系统地学习了Transformer结构后,尝试使用Transformer模型对DNA序列数据实现二分类,好久前就完成了这个实验,一直拖着没有整理,今天系统的记录一下,顺便记录一下自己踩过的坑 (需要…

OpenHarmony开发实战:GPIO控制器接口

功能简介 GPIO(General-purpose input/output)即通用型输入输出。通常,GPIO控制器通过分组的方式管理所有GPIO管脚,每组GPIO有一个或多个寄存器与之关联,通过读写寄存器完成对GPIO管脚的操作。 GPIO接口定义了操作GP…

Echarts 问题集锦

最近公司集中做统计图表,新手小白,真被Echarts折腾地不轻,怕自己年老记忆衰退,特地做一些记录。以备后面查阅。 1、X轴的 数据显示不全,间或不显示 很奇葩,我发现数据里有一个值为0.0,当这条记…

液压件工厂的MES解决方案:智能生产,高效未来

一、引言 虽然我国液压件行业发展迅速,但是大多数液压件生产企业规模小、自主创新能力不足,大部分液压产品处于价值链中低端。且由于技术、工艺、设备及管理等多方面的限制,高端液压件产品研发生产水平不足,无法形成有效的供给&a…

【linux】虚拟机安装 BCLinux-R8-U4-Server-x86_64

目录 一、概述 1.1移动云Linux系统订阅服务 CLS 1.2 大云天元操作系统BC-Linux 二、安装 一、概述 1.1移动云Linux系统订阅服务 CLS 移动云Linux系统订阅服务 CLS (Cloud Linux Service)为使用BC-Linux操作系统的用户提供标准维保服务以及高级技术支…