零基础Java第十三期:继承与多态(一)

目录

一、继承

1.1. 继承的目的

 1.2. 继承的概念

1.3. 继承的语法

 1.4. 父类的访问

1.5. 继承中的重载与重写

1.6. 子类的构造方法 

1.7. 再谈初始化 


一、继承

1.1. 继承的目的

     我们来定义一个Dog和Cat的类:

public class Dog {
    public int age;
    public String breed;
    public String name;

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

    public void eat(){
        System.out.println("在吃饭");
    }
}

       我们可以看到这两个类当中的成员变量是相同的,那么我们能不能把相同的成员变量抽取出来,放到同一个类中呢?面向对象思想中提出了继承的概念,专门用来进行共性抽取,实现代码复用。

public class Animal {
    public int age;
    public String breed;
    public String name;

    public void eat(){
        System.out.println("在吃饭");
    }
}

 1.2. 继承的概念

       继承机制:允许程序员在保持原有类特 性 的基础上进行扩展,增加新功能,这样产生新的类,称派生类。通俗点说,可以看成是…… is …… a 的关系。

        继承呈现了面向对象程序设计的层次结构, 体现了 由简单到复杂的认知过程。继承主要解决的问题是:共性的抽取,实现代码复用。 

1.3. 继承的语法

语法规则:

修饰符 static 子类(派生类) extends 父类(基类、超类){

public static Cat extends Animal{

public static Dog extends Animal{

 1.4. 父类的访问

(1)父类与子类的成员变量不同名时

public class Base {
    public int a = 1;
    public int b = 2;
}

public class Derived extends Base{
    public int c = 3;
    public void test(){
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
    }
    public static void main(String[] args){
        Derived num = new Derived();
        num.test();
    }
}

(2)父类与子类的成员变量同名时 

public class Base {
    public int a = 1;
    public int b = 2;
}

public class Derived extends Base{
    public int a = 10;
    public int c = 3;
    public void test(){
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
    }
    public static void main(String[] args){
        Derived num = new Derived();
        num.test();
    }
}

     此时就会优先访问子类成员变量。那如果我就想访问父类的成员变量呢?我们就可以引入一个super关键字。

​
public class Base {
    public int a = 1;
    public int b = 2;
}

public class Derived extends Base{
    public int a = 10;
    public int c = 3;
    public void test(){
        System.out.println(super.a);
        System.out.println(b);
        System.out.println(c);
    }
    public static void main(String[] args){
        Derived num = new Derived();
        num.test();
    }
}

​

 下面博主将会画图来给大家讲解一下原理:

     父类与子类的成员变量都可以通过this来进行访问,而父类中的成员变量也可以通过super来访问。所以说,我们在访问成员变量b时,也可以在前面加上super关键字,这样就能提高代码的可读性,以至于不会搞混成员变量到底是父类的还是子类的。

      我们可以总结下来就是:1、当访问不同的成员时,优先看父类有没有;2、父类有访问父类的,父类没有,看子类有没有;3、子类有,访问子类的,如果没有,就会报错。 

1.5. 继承中的重载与重写

public class Base {
    public int a = 1;
    public int b = 2;

    public void Basefunc(){
        System.out.println("base::func");
    }
}
public class Derived extends Base{
    public void Derivedfunc(){
        System.out.println("derived::func");
    }
    public void Basefunc(){
        System.out.println("base::func");
    }
    public void Basefunc(int a){
        System.out.println(a);
    }

    public void Method(){
        Derivedfunc();
        Basefunc();
        Basefunc(20);
    }

    public static void main(String[] args) {
        Derived num = new Derived();
        num.Method();
    }
}

       在上面的代码中我们可以看到父类与子类中,存在名称相同的方法。父类中的Basefunc方法与子类中的Derivedfunc方法构成了方法重写;而与子类中的Derivedfunc(a)构成了方法重载。

1.6. 子类的构造方法 

       父子父子,先有父再有子,即:子类对象构造时,需要先调用父类构造方法,然后执行子类的构造方法。 在构造子类对象时候 ,先要调用父类的构造方法,将从父类继承下来的成员构造完整 ,然后再调用子类自己的构造方法,将子类自己新增加的成员初始化完整 。

public class Animal {
    public int age;
    public String name;

    public Animal(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public void eat(){
        System.out.println("在吃饭");
   }
}
public class Cat extends Animal{
    public void sleep(){
        System.out.println("睡觉");
    }
    public Cat(String name,int age){
        super(age, name);
    }
}
public class Dog extends Animal{
    public void bark(){
        System.out.println("汪汪叫");
    }
    public void wag(){
        System.out.println("摇尾巴");
    }
    public Dog(String name,int age){
        super(age, name);
    }
}
public class TestDemo {
    public static void main(String[] args) {
        Cat cat = new Cat("小黑",5);
        cat.name = "大黄";
        cat.eat();
        System.out.println("======");
        Dog dog = new Dog("大黄",10);
        dog.name = "小黑";
        dog.bark();
    }
}

如果我们对TestDemo里的类进行调试,可以看到在父类里面进行传参和赋值。

          注意:(1)若父类显式定义无参或者默认的构造方法,在子类构造方法第一行默认有隐含的super()调用,即调用父类构造方法。 如果我们在父类里面再写一个构造方法,则子类里面就会报错。

//父类里面默认的一个构造方法

public Animal(int age, String name) {
     this.age = age;
     this.name = name;
}

 

    (2)如果父类构造方法是带有参数的,此时需要用户为子类显式定义构造方法,并在子类构造方法中选择合适的 父类构造方法调用,否则编译失败。

   (3) 在子类构造方法中,super(...)调用父类构造时,必须是子类构造函数中第一条语句。 

1.7. 再谈初始化 

继承关系上的执行顺序 

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

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    {
        System.out.println("Person:实例代码块执行");
    }
    static {
        System.out.println("Person:静态代码块执行");
    }
}
public class Student extends Person{
    public Student(String name,int age) {
        super(name,age);
        System.out.println("Student:构造方法执行");
    }
    {
        System.out.println("Student:实例代码块执行");
    }
    static {
        System.out.println("Student:静态代码块执行");
    }
}

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

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

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

相关文章

论文翻译 | Evaluating the Robustness of Discrete Prompts

摘要 离散提示已被用于调整预训练语言模型,以适应不同的NLP任务。特别是,从一小组训练实例中生成离散提示的自动方法已经报告了优越的性能。然而,仔细观察习得的提示会发现,它们包含嘈杂和反直觉的词汇结构,而这些在手…

SQL,力扣题目1549,每件商品的最新订单【窗口函数】

一、力扣链接 LeetCode_1549 二、题目描述 表: Customers ------------------------ | Column Name | Type | ------------------------ | customer_id | int | | name | varchar | ------------------------ customer_id 是该表主键. 该表包含消费者的…

mysql查表相关练习

作业要求: 单表练习: 1 . 查询出部门编号为 D2019060011 的所有员工 2 . 所有财务总监的姓名、编号和部门编号。 3 . 找出奖金高于工资的员工。 4 . 找出奖金高于工资 40% 的员工。 5 找出部门编号为 D2019090011 中所有财务总监,和…

广东网站设计提升你网站在搜索引擎中的排名

在当今网络盛行的时代,拥有一个设计优良的网站,对企业的在线发展至关重要。特别是对于广东地区的企业来说,网站设计不仅仅是美观的问题,更直接影响着搜索引擎中的排名。因此,精心策划和设计的网站,能够显著…

qt QGroupBox详解

1、概述 QGroupBox是Qt框架中的一个容器控件,主要用于组织和管理一组相关的控件(如按钮、复选框、文本框等),并为这些控件提供一个框架和标题。通过使用QGroupBox,可以创建具有逻辑分组和视觉层次结构的用户界面&…

数据库管理-第256期 Oracle DB 23.6新特性一览(20241031)

数据库管理256期 2024-10-31 数据库管理-第256期 Oracle DB 23.6新特性一览(20241031)1 AI向量搜索:新的向量距离度量2 混合向量索引3 分区:本地邻近分区向量索引4 持久邻近图向量索引5 稀疏向量6 邻居图向量索引的事务支持7 特征…

应急响应----本地环境配置,对内存马的研究分析

应急响应----本地环境配置,对内存马查杀研究分析 注:后续添加的补充内容框架型内存马 SpringController型内存马:动态注册Controller及映射路由。 SpringInterceptor型内存马:动态注册Interceptor及映射路由。 启动环境: Spring框架启动(Controller型内存马和Intercept…

JAVA 插入 JSON 对象到 PostgreSQL

博主主页:【南鸢1.0】 本文专栏:JAVA 目录 ​编辑 简介 所用: 1、 确保 PostgreSQL 数据库支持 JSON: 2、添加 PostgreSQL JDBC 驱动 3、安装和运行 PostgreSQL 4、建立数据库的连接 简介 在现代软件开发中,由于 JSON 数据…

AUTOSAR CP NVRAM Manager规范导读

一、NVRAM Manager功能概述 NVRAM Manager是AUTOSAR(AUTomotive Open System ARchitecture)框架中的一个模块,负责管理非易失性随机访问存储器(NVRAM)。它提供了一组服务和API,用于在汽车环境中存储、维护和恢复NV数据。以下是NVRAM Manager的一些关键功能: 数据存储和…

机器学习:我们能用机器学习来建立投资模型吗

机器学习模型能解决什么投资问题? 利用机器学习解决投资问题的思路,其实和在互联网领域解决推荐、广告问题的思路是一样的,只不过利用的特征完全变了。推荐、广告模型利用的是用户的年龄、性别,物品的类别、价格等特征&#xff0c…

FBX福币交易所国际油价突然大涨!美伊针锋相对

11月4日早上,国际原油大幅高开。WTI原油一度涨超2%。 消息面上,主要产油国宣布延长自愿减产措施至12月底 FBX福币凭借用户友好的界面和对透明度的承诺,迅速在加密货币市场中崭露头角,成为广大用户信赖的平台。 石油输出国组织(欧佩克)发表声明说,8个欧佩克和非欧佩克产油国决…

Flarum:简洁而强大的开源论坛软件

Flarum简介 Flarum是一款开源论坛软件,以其简洁、快速和易用性而闻名。它继承了esoTalk和FluxBB的优良传统,旨在提供一个不复杂、不臃肿的论坛体验。Flarum的核心优势在于: 快速、简单: Flarum使用PHP构建,易于部署&…

独立开发的个人品牌打造:个人IP与独立开发的结合

引言 个人品牌程序员也需要打造。在当今的创意经济中,个人IP与独立开发的结合成为了一种趋势,为个体带来了前所未有的机会和可能性。本文将探讨如何通过打造个人IP来增强独立开发的影响力,并探索这种结合为个人带来的潜在价值。 个人IP的重…

细说STM32单片机USART中断收发RTC实时时间并改善其鲁棒性的方法

目录 一、工程目的 1、 目标 2、通讯协议及应对错误指令的处理目标 二、工程设置 三、程序改进 四、下载与调试 1、合规的指令 2、 proBuffer[0]不是# 3、proBuffer[4]不是; 4、指令长度小于5 5、指令长度大于5 6、proBuffer[2]或proBuffer[3]不是数字 7、;位于p…

AI助力医疗:未来的医生会是机器人吗?

内容概要 在这一场医疗科技的新浪潮中,AI医疗正以前所未有的速度渗透到各个角落。随着技术的飞速进步,人工智能成为了推动医疗领域革新的重要力量。从精准诊断到个性化治疗,AI正在帮助医生们更快速、准确地分析患者的病情,提高了…

数据结构 ——— 向上调整建堆和向下调整建堆的区别

目录 前言 向下调整算法(默认小堆) 利用向下调整算法对数组建堆 向上调整建堆和向下调整建堆的区别​编辑 向下调整建堆的时间复杂度: 向上调整建堆的时间复杂度: 结论 前言 在上一章讲解到了利用向上调整算法对数组进行…

图数据库 2 | 大数据的演进和数据库的进阶——从数据到大数据、快数据,再到深数据

时至今日,大数据已无处不在,所有行业都在经受大数据的洗礼。但同时我们也发现,不同于传统关系型数据库的表模型,现实世界是非常丰富、高维且相互关联的。此外,我们一旦理解了大数据的演进历程以及对数据库进阶的强需求…

java版询价采购系统 招投标询价竞标投标系统 招投标公告系统源码

在数字化时代,企业需要借助先进的数字化技术来提高工程管理效率和质量。招投标管理系统作为企业内部业务项目管理的重要应用平台,涵盖了门户管理、立项管理、采购项目管理、采购公告管理、考核管理、报表管理、评审管理、企业管理、采购管理和系统管理等…

golang通用后台管理系统02(RSA加密解密,登录密码加密解密)

参考:https://blog.csdn.net/lady_killer9/article/details/118026802 1.加密解密工具类PasswordUtil.go package utilimport ("crypto/rand""crypto/rsa""crypto/x509""encoding/pem""fmt""log"&qu…

性能小钢炮,核显玩3A,最值得买的 8745HS 迷你主机『零刻SER8』,2099的价格是真的香

性能小钢炮,核显玩3A,最值得买的 8745HS 迷你主机『零刻SER8』,2099的价格是真的香 哈喽小伙伴们好,我是Stark-C~ 前一个多月的时候我评测了零刻最新最强大的迷你主机『零刻 SER9』的时候,评论区很多小伙伴都说贵。 …