类的继承性(Java)

news2024/11/19 17:43:32

本篇学习面向对象语言的第二特性——继承性。

1 .为什么需要继承

我们来举个例子:我们知道动物有很多种,是一个比较大的概念。在动物的种类中,我们熟悉的有猫(Cat)、狗(Dog)等动物,它们都有动物的一般特征(比如能够吃东西,能够发出声音),不过又在细节上有区别(不同动物的吃的不同,叫声不一样)。在Java语言中实现Cat和Dog等类的时候,就需要继承Animal这个类。继承之后Cat、Dog等具体动物类就是子类,Animal类就是父类。

 使用继承不仅大大的减少了代码量,也使得代码结构更加清晰可见,增加代码的复用性。 

  

2.继承的概念

继承表示两个类之间的一种关系,是已有类创建新类的机制。子类不仅可以从父类中继承成员变量和方法,还可以重新定义他们以及扩充新的内容。子类也叫派生类,父类也叫基类或者超类。继承主要解决的问题是共性的抽取,实现代码的复用。

3. 继承的语法 

  修饰符 class 子类 extends 父类 {

     }

代码示例:

class Animal {
    String name;
    int age;
    public void eat() {
        System.out.println("正在吃饭");
    }
}

class Dog extends Animal {
    void bark() {
        System.out.println(name + "汪汪汪~");
    }
}

public class Test {
    public static void main(String[] args) {
        Dog dog = new Dog();
        System.out.println(dog.name+dog.age);
//Dog类中并没有定义任何成员变量,name和age属性肯定是从父类Animal中继承而来的
        dog.bark();
        dog.eat();
//Dog访问的eat()和sleep()方法也是从Animal中继承而来的
    }
}

 注意:
1. 子类会将父类中的成员变量或者成员方法继承到子类中了
2. 子类继承父类之后,必须要新添加自己特有的成员,体现出与基类的不同,否则就没有必要继承了

4 .父类成员访问

在继承体系中,子类将父类中的方法和字段继承下来了,那在子类中能否直接访问父类中继承下来的成员呢?

4.1 子类中访问父类的成员变量

在子类方法中或者通过子类对象访问成员时:
(1)如果访问的成员变量子类中有,优先访问子类的成员变量。
(2)如果访问的成员变量子类中无,则访问父类继承下来的,如果父类也没有定义,则编译报错。
(3)如果访问的成员变量与父类中成员变量同名,则优先访问自己的。
成员变量访问遵循就近原则,自己有优先自己的,如果没有则向父类中找。 

4.2 子类中访问父类的成员方法

(1)通过子类对象访问父类与子类中不同名方法时,优先在子类中找,找到则访问,否则在父类中找,找到则访问,否则编译报错。
(2)通过派生类对象访问父类与子类同名方法时,如果父类和子类同名方法的参数列表不同(重载),根据调用方法适传递的参数选择合适的方法访问,如果没有则报错; 

问题:如果子类中存在与父类中相同的成员时,那如何在子类中访问父类相同名称的成员呢?

5、final关键字 

final关键字可以用来修饰变量、成员方法及类。

1、修饰变量或字段,表示常量(不能被修改)。

2、修饰类,表示此类不能被继承。

3、修饰方法,表示不能被重写。

6、super关键字  

Java提供了super关键字,该关键字主要作用:在子类方法中访问父类的成员。 

class Animal {
    String name="父类";
    int age=99;
    public void eat() {
        System.out.println("父类eat方法");
    }
}

class Dog extends Animal {
    String name="子类";
    public void eat() {
        System.out.println("子类eat方法");
    }
    public void  method(){
       super.eat();
    }
}

【注意事项】
1. 只能在非静态方法中使用
2. 在子类方法中,
访问父类的成员变量和方法。 

 7、构造方法的继承

遵行原则:

1、子类未定义构造方法时,创建对象时将无条件的无参调用父类构造方法。

2、对于父类的含参构造方法,子类需要在自己构造方法中使用关键字super来调用它,语法:super(参数)  。但是,super关键字必须在子类构造方法中的第一个可执行语句。

3、若没有使用super关键字,那么在创建对象时,则先执行父类的无参构造方法,再执行子类自己定义的构造方法。

4、super(...)只能在子类构造方法中出现一次,并且不能和this同时出现。

8、super和this的比较

super和this都可以在成员方法中用来访问:成员变量和调用其他的成员函数,都可以作为构造方法的第一条语句,那他们之间有什么区别呢?

【相同点】
1. 都是Java中的关键字
2. 只能在类的非静态方法中使用,用来访问非静态成员方法和字段
3. 在构造方法中调用时,必须是构造方法中的第一条语句,并且不能同时存在
【不同点】
1. this是当前对象的引用,当前对象即调用实例方法的对象,super相当于是子类对象中从父类继承下来部分成员的引用
2. 在非静态成员方法中,this用来访问本类的方法和属性,super用来访问父类继承下来的方法和属性
3. 在构造方法中:this(...)用于调用本类构造方法,super(...)用于调用父类构造方法,两种调用不能同时在构造方法中出现
4. 构造方法中一定会存在super(...)的调用,用户没有写编译器也会增加,但是this(...)用户不写则没有

9、继承上的执行顺序

示例代码如下:

class Animal {
    String name;
    int age;

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("父类构造方法");
    }
    {
        System.out.println("父类实例代码块");
    }
    static {
        System.out.println("父类静态代码块");
    }
}
class Dog extends Animal{
    public Dog(String name, int age) {
        super(name, age);
        System.out.println("子类构造方法");
    }
    {
        System.out.println("子类实例代码块");
    }
    static {
        System.out.println("子类静态代码块");
    }
}
public class Test {
    public static void main(String[] args) {
        Dog dog =new Dog("旺财",3);
        System.out.println("———————————————");
        Dog dog1=new Dog("小花",5);
    }
}

 

 从结果可以得出结论:继承上的执行顺序是:

1、父类静态代码块优先于子类静态代码块执行,且是最早执行
2、父类实例代码块和父类构造方法紧接着执行
3、子类的实例代码块和子类构造方法紧接着再执行
4、第二次实例化子类对象时,父类和子类的静态代码块都将不会再执行 

 本篇类的继承性学习到这里是不是收获满满呢,如果觉得文章写的不错,留下小红心再走吧。后面一篇学习多态,关注我,不要错过哦!~

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

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

相关文章

web安全渗透测试十大常规项(一):web渗透测试之XML和XXE外部实体注入

#详细点: XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。等同于JSON传输。XXE漏洞XML External Entity Injection,即xml外部实体注入漏洞,XXE漏洞发…

Prometheus告警Alertmanager部署

Prometheus告警Alertmanager部署 资源监控一般离不开预警,因为我们不可能每时每刻都盯着某个资源监控看,而且在实际的工作中当中我们搭建的解决方案涉及到的服务器是多台甚至数十台,所以更加不现实,因此资源告警是一个必不可少的…

男士内裤品牌哪个好?2024公认好穿的五款男士内裤分享

男士内裤作为大家每天都要长时间穿着的贴身衣物,它的重要性不言而喻。为了确保健康与卫生,专家和医生建议您每三个月更换一次内裤,避免细菌滋生,让身体更加清爽自在。而一款优质的内裤,不仅要有舒适的弹性,…

学生课程信息管理系统

摘 要 目前,随着科学经济的不断发展,高校规模不断扩大,所招收的学生人数越来越 多;所开设的课程也越来越多。随之而来的是高校需要管理更多的事务。对于日益增 长的学生相关专业的课程也在不断增多,高校对其管理具有一…

《无与伦比》Centos7 扩容到已有逻辑卷

命令可以查找硬盘和分区情况 fdisk -l lsblk

【会议征稿,CPS出版】第三届先进机械电子与电气工程国际学术会议(ICAMEE 2024,7月19-21)

第三届先进机械电子与电气工程国际学术会议(ICAMEE 2024)将于2024年7月19-21日在桂林隆重举行。会议主要围绕“机械电子”、“电气工程” 等研究领域展开讨论, 旨在为机械电子、电气工程等领域的专家学者、工程技术人员、技术研发人员提供一个…

项目文章 | ATAC-seq联合转录组探究牦牛肌肉的调控机制

还在苦恼没有研究方向?还在找寻开启调控表观调控大门的钥匙?拿到材料不知如何下手?两篇ATAC联合转录组的牦牛调控机制分析或许能给你一点方向。 为了研究不同牦牛品种之间以及牦牛在成熟过程中,骨骼肌的调控如何影响肉类品质&…

OpenStack快速入门

任务一 熟悉OpenStack图形界面操作 1.1 Horizon项目 •各OpenStack服务的图形界面都是由Horizon提供的。 •Horizon提供基于Web的模块化用户界面。 •Horizon为云管理员提供一个整体的视图。 •Horizon为终端用户提供一个自主服务的门户。 •Horizon由云管理员进行管理…

Datacom HCIE实验考试通过率90%!深圳智汇云校传来5月捷报!

坚持不懈地努力,才能取得成功的果实 这是不变的真理 深圳云校传来5月捷报 在Datacom HCIE实验考试中 共有10名学员应战 其中9名学员凭借出色的表现 一次性通过了考试 展现出了扎实的技术能力 通过率高达90% (华为历年考试平均通过率约60%&#…

【Hudi】基础概念-数据写

目录 数据写写操作写流程(UPSERT)写流程(Insert)写流程(Insert Overwrite)Key生成策略删除策略 数据写 写操作 UPSERT:默认行为,数据先通过index打标,有一些启发式算法决定消息的组织以及优化文件的大小>CDC导入INSERT:跳过index,写入效…

Java历史

Java程序设计语言史 Java是一种面向对象的编程语言,由Sun Microsystems于1990年初由开发人员James Gosling、Mike Sheridan和Patrick Naughton开发。1991年,詹姆斯戈斯林和他的朋友们组成了一个名为“绿色团队”的团队,进一步致力于这个项…

如何使用nginx 将新老网站域名重定向?(亲测收藏版)

目录 1. 安装Nginx 2. 配置Nginx 3. 启用新配置 结论 最近公司需要推行海外的业务,原来公司的名字麦聪软件的官网maicongs.com暂时用不上了,想启用sqlynx.com,但因为历史流量的原因,有很多的业务是指向的maicongs.com&#xf…

小程序分页新写法

// pages/query/query.js import {request } from ../../utils/request; Page({/*** 页面的初始数据*/data: {tabClickIndex: ,page: 1,limit: 10,listData: []},/*** 生命周期函数--监听页面加载*/onLoad(options) {this.getList()},/*** 生命周期函数--监听页面初次渲染完成*…

Sylar C++高性能服务器学习记录23 【Http模块-知识储备篇】

早在19年5月就在某站上看到sylar的视频了,一直认为这是一个非常不错的视频。 由于本人一直是自学编程,基础不扎实,也没有任何人的督促,没能坚持下去。 每每想起倍感惋惜,遂提笔再续前缘。 为了能更好的看懂sylar&…

Python10 python多线程

1.什么是python多线程 Python的多线程指的是在一个Python程序中同时运行多个线程,以达到并发执行多个任务的目的。线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。 在Python中,多线程的…

C# OCCT Winform 选中模型改变状态

选中状态设置 _context new AIS_InteractiveContext(_viewer);var selectionDrawer new Prs3d_Drawer();selectionDrawer.SetColor(Colors.Selection);selectionDrawer.SetDisplayMode(1);selectionDrawer.SetTransparency(0.1f);_context.SetSelectionStyle(selectionDrawe…

【机器学习】机器学习重要方法——无监督学习:理论、算法与实践

文章目录 引言第一章 无监督学习的基本概念1.1 什么是无监督学习1.2 无监督学习的主要任务 第二章 无监督学习的核心算法2.1 聚类算法2.1.1 K均值聚类2.1.2 层次聚类2.1.3 DBSCAN聚类 2.2 降维算法2.2.1 主成分分析(PCA)2.2.2 t-SNE 2.3 异常检测算法2.3…

【Gradio】Chatbot | 如何使用 Gradio Blocks 创建自定义聊天机器人

简介 重要提示:如果您刚开始接触,我们建议使用 gr.ChatInterface 来创建聊天机器人——它是一个高级抽象,使得可以快速创建漂亮的聊天机器人应用程序,往往只需一行代码。在这里了解更多信息。 本教程将展示如何使用 Gradio 的低级…

【网络安全】简单的免杀方法(非常详细)零基础入门到精通,收藏这一篇就够了_免杀加壳工具

目录 一、免杀的概念 二、免杀系统搭建 三、免杀工具介绍 1、myccl 2、C32asm 3、OD 4、LordPE 5、ImportREC 6、VC6.0/visual studio 7、数字签名 四、关于杀软排名不分前后 1、360。 2、金山毒霸 3、江民 4、瑞星 5、安天防线 6、卡巴斯基 7、NOD32 8、诺…

【日记】被客户一顿输出该怎么办(431 字)

正文 上午有个客户在电话里对着我一顿输出,说他们没有发票财务账务没法处理怎么怎么的。话里话外满满一股 “全是你们的错” 的味道。 当时我很想笑,大姐,你对我输出有啥用啊。票是上级行开的,我们又没有开票权限,对我…