Java进阶----继承

继承

一.继承概述

继承是可以通过定义新的类,在已有类的基础上扩展属性和功能的一种技术.
案例:优化 猫、狗JavaBean类的设计

狗类:Dog
属性:名字 name,年龄 age
方法:看家 watchHome()Getter and Setter
猫类:Cat
属性:名字 name,年龄 age
方法:抓老鼠 catchMouse(),Getter and Setter

普通写法:

//猫类
public class Cat {
    private String name;
    private int age;

    public void catchMouse() {
        System.out.println("猫抓老鼠");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
//狗类
public class Dog {
    private String name;
    private int age;

    public void watchHome() {
        System.out.println("狗看家");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
相同的属性,有大量重复代码
private String name;
private int age;
相同的方法,有大量重复代码
public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

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

继承格式

继承使用 extends 关键字,让派生类扩展基类的功能。派生类也叫子类,基类也叫超类或父类

需求:使用继承优化猫狗类的设计

  • 猫和狗都属于动物的一种,它们的共有属性、功能是每种动物都具备的,可将狗和猫看成是动物的扩展;
  • 定义Animal动物类,并定义猫和狗的共有内容,作为动物的基础属性和功能
属性:姓名 name,年龄 age
方法:Getter and Setter
  • 分别定义Dog狗类和Cat猫类,使用继承技术在Animal动物类的基础功能上扩展自己的特有功能
Dog:看家 watchHome()
Cat:抓老鼠 catchMouse()

分析:
需求:使用继承技术优化Dog和Cat类
1.思考父类是什么?(将Dog和Cat中的相同内容全部放到父类中)子类是什么?子类需要继承父类什么?
2.先定义Animal动物类,作为Dog狗类和Cat猫类的父类
3.使用extends关键字让Dog和Cat继承Animal

// Animal动物类
public class Animal {
    //父类的私有内容不能直接继承(直接使用)
    private String name;
    private int age;
    
    //使用方法调用
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
//猫类 继承动物类
public class Cat extends Animal{
    public void catchMouse() {
        System.out.println("猫抓老鼠");
    }
}

//狗类 继承动物类
public class Dog extends Animal{
    public void watchHome() {
        System.out.println("狗看家");
    }
}
//测试Dog和Cat的功能是否能够正常使用
public class Demo {
    public static void main(String[] args) {
        //需求:使用继承技术优化Dog和Cat类
        Dog dog = new Dog();
        dog.watchHome();
        dog.setAge(3);
        int age = dog.getAge();
        dog.setName("小黄");
        Cat cat = new Cat();
        String name = dog.getName();
        System.out.println(name);
        System.out.println(age);
        
    }
}

小结

继承技术的作用是什么?
可以使用___extends___关键字,让子类扩展父类的属性和功能
如何使用继承技术?
在__父类_____中定义子类们的共有内容,作为基础属性和功能
让___子类_____使用 extends__ 关键字,扩展父类的属性和功能
继承技术有什么好处?
可以提高代码__复用率________,减少重复的代码

拓展

什么时候使用继承呢?

  • 子类和父类具备 is a 的关系
  • is a 的关系:

假设A和B两个类,A是B的一种,那么A类和B类就有 is a 的关系
此时:A类 extends B类,苹果类 extends 水果,猫类 extends 动物.

继承案例练习

需求:在某个宠物店的宠物资源管理系统中,存在猫、狗角色。

猫类属性(姓名,年龄),行为(喝水,抓老鼠)
狗类属性(姓名,年龄),行为(喝水,看家)

利用继承技术,定义猫类和狗类,并实现效果:

3岁的小猫杰克,每天都抓一只老鼠当晚餐
2岁的小狗大黄,每天都趴在门口看家护院

1.先定义Animal动物类,作为父类
2.分别定义Dog狗类和Cat猫类,作为子类
3.创建子类对象,调用功能

/**
 *动物类:作为父类
 */
public class Animal {
    //提取子类们共有的属性和功能:共有的属性:姓名、年龄
    private String name;
    private int age;
//针对被私有的属性,需要提供Getter and Setter方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

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

    //共有行为方法
    public void drink(){
        System.out.println("喝水");
    }
}
/**
 * 狗类:使用extends关键字,继承Animal动物类
 */
public class Dog extends Animal {

    //特有功能:看家
    public void watchHome() {
        System.out.println(getAge() + "岁的小狗" + getName() + ",每天都趴在门口看家护院");
    }
}
public class Cat extends Animal {
    //特有功能:抓老鼠
    public void catchMouse() {
        System.out.println(getAge() + "岁的小猫" + getName() + ",每天都抓一只老鼠当晚餐");
    }
}
public class Test {
    public static void main(String[] args) {
        //1.先定义Animal动物类,作为父类

        //2.分别定义Dog狗类和Cat猫类,作为子类

        //3.创建子类对象,调用功能
        Dog dog = new Dog();
        dog.setName("大黄");
        dog.setAge(2);

        Cat cat = new Cat();
        cat.setName("杰克");
        cat.setAge(2);

        dog.watchHome();
        cat.catchMouse();
    }
}

继承的注意事项

  1. 单继承: 一个子类只能有一个父类
  2. 多层继承:子类可以有父类,父类也可以有父类
  3. 继承成员子类能从父类那直接或间接获取属性和功能
  4. 祖宗类:任何一个类都直接或间接的继承Object类

分析
1.Java只能单继承(一个子类有且仅有一个父类)
需求:尝试让Son类同时继承Dad类和GrandDad类

public class GrandDad {
    public void drawing() {
        System.out.println("绘画");
    }
}
//尝试Son多继承(同时继承)Dad和GrandDaD类,代码会报错!
//public class Son extends Dad, GrandDad {
//public class Son extends Dad extends GrandDad {

2.Java虽然只能单继承,但是可以多层继承(子类继承父类,但父类也可以继续继承父类)

  • 需求:尝试让Son类继承Dad类,然后让Dad类继承GrandDad类
  • 创建子类Son的对象,去调用Dad类和GrandDad类的功能
//尝试让Son继承Dad
public class Son extends Dad{
}
//让Dad类继承GrandDad
public class Dad extends GrandDad {
    String car = "玛莎拉蒂";
    private String house = "小洋楼";

    public void swim() {
        System.out.println("游泳");
    }
}

Son son = new Son();
System.out.println(son.car);
son.swim();
son.drawing();
System.out.println("----------------------");

3.子类可以直接或间接继承父类的成员(直接或间接的使用父类的成员变量、成员方法),父类的私有成员,子类不能直接继承,但是可以间接继承(使用super关键字)

//System.out.println(son.house);
//'house' has private access in 'i_extends.d3.Dad'

4.Java中任何一个类都直接或间接的继承Object类
,Object类提供了一个hashCode方法,可以返回对象在堆内存的十进制地址值

//需求:创建GrandDad类对象,尝试调用hashCode方法
        GrandDad grandDad = new GrandDad();
        int hashCode = grandDad.hashCode();
        System.out.println(hashCode);
玛莎拉蒂
游泳
绘画
----------------------
356573597

三.继承关系下,成员的访问特点

目标:了解继承关系中,子类访问成员的特点
就近原则
1.成员(变量、方法)访问的特点:

  • 子类有,就访问子类自己的
  • 子类没有,就访问父类的
  • 子、父类都没有,代码报错!
    2.指定访问父类的成员:
  • 使用 super 访问
public class Fu {
    String str = "我是父类变量";

    public void show() {
        System.out.println("我是父类的show方法");
    }
}

public class Zi extends Fu {
    String str = "我是子类变量";

    public void show() {
        System.out.println("我是子类的show方法");
    }

    public void test() {
        //1.访问变量str
        System.out.println(str);

        //2.访问show方法
        show();

        **//3.指定访问父类的str属性和show方法**
        System.out.println(super.str);
        super.show();
    }
public class Demo {
    public static void main(String[] args) {
        //1.需求:按要求完成Zi类中的test方法
        //创建Zi类对象,调用test()方法
        Zi zi = new Zi();
        zi.test();
      }
}
//父类
public class Father {
    String field = "父类的和子类同名属性";

    public void method() {
        System.out.println("父类的和子类同名方法");
    }
}

//子类
public class Son extends Father {
    String field = "子类的和父类同名属性";
    String ziField = "子类特有属性";

    public void method() {
        System.out.println("子类的和父类同名方法...");
    }

    public void use() {
        String ziField = "子类局部变量";

        //练习:按要求完成以下需求
        //1.访问子类的field属性
        System.out.println(field);

        //2.访问父类的field属性
        System.out.println(super.field);

        //3.访问ziField属性,此时发现方法中有一个成员变量和一个成员方法同名,此时需要用 this 来表明访问的是成员变量
        System.out.println(this.ziField);

        //4.访问ziField局部变量
        System.out.println(ziField);

        //5.访问method方法
        method();

        //6.访问父类的method方法
        super.method();

    }
}

小结

  1. 在子类方法中访问父类成员变量、成员方法遵循什么原则?
    就近原则:子类有就用子类的,子类没有就用父类的,父类没有就报错
  2. 如果子、父类中出现了重名的成员变量、成员方法,如何区分?
    super.父类成员 … this.本类成员

四.方法重写

  • 子类和父类有一模一样方法声明,但方法体可能不一样,此时子类方法会覆盖父类的方法(这种格式称为方法重写)

目标:掌握方法重写的特点和使用场景

### 实例
需求:在不影响B类继承使用Fu类show功能的前提下,让A类执行自己特有的show功能:"A类特有的show方法"
1.在子类A中,写一个和父类Fu一模一样的show方法(子类A重写了父类Fu的show方法)

```java
public class Fu {
    public void show() {
        System.out.println("fu...show...");
    }
}
public class B extends Fu {

}
public class A extends Fu {
    public void show() {
        System.out.println("A类特有的show方法");
    }
}
public class Demo01 {
    public static void main(String[] args) {
        A a = new A();
        //方法重写后,遵循就近原则
        a.show();
        B b = new B();
        b.show();
    }
}

//执行结果:
//A类特有的show方法
//fu...show...

``

方法重写的注意事项

目标:了解方法重写的注意事项

  1. 重写方法的名称、形参列表必须和父类相同
  2. 子类重写的方法返回值类型,要小于等于父类方法的返回值类型(约定:父类大于子类)
  3. 子类重写父类方法时,访问权限必须大于或者等于父类 (private < 缺省 < protected < public)
  4. 父类私有方法,子类不能重写

方法重写的校验

@Override注解,标记一个方法是重写父类方法(语法检查)
需求:让SubClass类重写SuperClass类的各个方法

public class SuperClass {
    public void method1() {
        System.out.println("super...public...");
    }

    public A method2() {
        return new A();
    }

    protected void method3() {
        System.out.println("super...protected...");
    }

    void method4() {
        System.out.println("super...default...");
    }

    private void method5() {
        System.out.println("super...private...");
    }
}
public class SubClass extends SuperClass {
    //1.重写method1方法:保持方法名称、形参列表相同
    @Override
    public void method1() {
    //public void method1(int age) {
        System.out.println("子类重写的method1");
    }

    //2.重写method2方法
    @Override
    //public Fu method2() {
    //注意:子类重写父类方法,返回值类型需要小于等于父类的
    public A method2() {
        return new A();
    }

    //3.重写method3、method4、method5方法
    @Override
    protected void method3() {
        //注意:子类重写父类方法,访问权限要大于等于父类的
        //public void method3() {
        //void method3() {
        //private void method3() {
        System.out.println("子类重写的method3");
    }

    @Override
    void method4() {
        //protected void method4() {
        //public void method4() {
        //private void method4() {
        System.out.println("子类重写的method4");
    }

    //@Override
    //注意:父类私有方法,子类不能重写
    private void method5() {
        System.out.println("子类自己的method5方法");
    }

继承关系下,构造器的访问特点

目标:了解继承关系中,构造器的访问特点
特点:访问构造器时,会先默认访问父类的空参构造器
原因:在子类的构造器第一行有一句隐藏的super();
在这里插入图片描述

  • super访问父类构造器
    super(); 用来访问父类空参数构造器
    super(参数); 访问父类有参数构造器
    在这里插入图片描述
    子类继承父类后构造器的访问特点是什么样的?
    子类中所有的构造方法默认都会先访问父类中__空参数构造方法

子类构方法第一行默认有一句__super()________
如果不想访问父类空参数构造器,可以使用___super(参数)_________ 访问父类有参数构造器
访问本类的构造器格式是:this()、this(参数)_____________
补充: this(),super() 都只能写在构造器的第 条语句

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

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

相关文章

QT5.12.9 通过MinGW64 / MinGW32 cmake编译Opencv4.5.1

一、安装前准备&#xff1a; 1.安装QT,QT5.12.9官方下载链接&#xff1a;https://download.qt.io/archive/qt/5.12/5.12.9/ QT安装教程&#xff1a;https://blog.csdn.net/Mark_md/article/details/108614209 如果电脑是64位就编译器选择MinGW64&#xff0c;32位就选择MinGW…

C#描述-计算机视觉OpenCV(5):直方图算法

C#描述-计算机视觉OpenCV&#xff08;5&#xff09;&#xff1a;直方图算法 前文链接图像直方图灰度直方图的计算灰度直方图的绘制BGR三通道的直方图直方图的均衡化算法相似图像检测 前文链接 文中没提到的东西&#xff0c;很可能都在前文描述过 C#描述-计算机视觉OpenCV&…

【C++深度探索】继承机制详解(二)

hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff1a;大耳朵土土垚的博客 &#x1…

深入解析:抖音视频标题的Python爬虫提取方法

引言 随着短视频的兴起&#xff0c;抖音已经成为全球最受欢迎的社交媒体平台之一。对于数据分析师、市场研究人员以及内容创作者来说&#xff0c;能够从抖音上抓取数据是一项宝贵的技能。本文将深入解析如何使用Python编写爬虫程序来提取抖音视频的标题。 爬虫基础 在开始编…

K8S 上部署大数据相关组件

文章目录 一、前言二、Redis 一、前言 Artifact Hub 是一个专注于云原生应用的集中式搜索和发布平台。它旨在简化开发者在 CNCF&#xff08;Cloud Native Computing Foundation&#xff09;项目中寻找、安装和分享包与配置的过程。用户可以通过这个平台方便地发现、安装各类云原…

为什么需要重写equals和如何重写equals

首先先看Java中的 &#xff0c;比较的两个对象的地址值。 如果是基本数据类型&#xff0c;那么就是比较的是值。 如果是引用数据类型&#xff0c;比较的就是地址. object类中的equals方法也是用的&#xff1b; 所以要比较两个对象的大小&#xff0c;去调用默认的equals方法…

Apache Spark分布式计算框架架构介绍

目录 一、概述 二、Apache Spark架构组件栈 2.1 概述 2.2 架构图 2.3 架构分层组件说明 2.3.1 支持数据源 2.3.2 调度运行模式 2.3.3 Spark Core核心 2.3.3.1 基础设施 2.3.3.2 存储系统 2.3.3.3 调度系统 2.3.3.4 计算引擎 2.3.4 生态组件 2.3.4.1 Spark SQL 2.…

关系型数据库MySQL和时序数据库的区别?

时序数据库和关系型数据库是两种不同类型的数据库系统&#xff0c;它们在设计理念、存储结构、性能优化等方面有显著差异&#xff0c;以适应不同的应用场景和需求。具体对比如下&#xff1a; 数据存储结构 时序数据库&#xff1a;使用列式存储&#xff0c;每条记录通常包含时间…

MySQL资源组的使用方法

MySQL支持创建和管理资源组&#xff0c;并允许将服务器内运行的线程分配给特定的组&#xff0c;以便线程根据组可用的资源执行。组属性允许控制其资源&#xff0c;以启用或限制组中线程的资源消耗。DBA可以针对不同的工作负载适当地修改这些属性。 目前&#xff0c;CPU时间是一…

田地行走-美团2023笔试(codefun2000)

题目链接 田地行走-美团2023笔试(codefun2000) 题目内容 塔子哥是一个农民&#xff0c;他有一片 nm 大小的田地&#xff0c;共 n 行 m 列&#xff0c;其中行和列都用从 1 开始的整数编号&#xff0c;田地中有 k 个格子中埋有土豆。我们记第 a 行第 b 列的格子为 (a,b) 。塔子哥…

LM2596/LM2596S多路降压稳压DC-DC开关电源芯片详解(第二部分:电路设计)(12V转5V、12V转3.3V、任意电压转任意电压)

目录 一、固定电压&#xff08;3.3/5/12V&#xff09;模块设计实例 1.设计条件&#xff1a;VOUT5V&#xff0c;VIN(MAX)12V&#xff0c;ILOAD(MAX)3A 2.设计步骤&#xff1a; &#xff08;1&#xff09;电感的选择&#xff08;L1&#xff09; &#xff08;2&#xff09;输…

C++入门基础

前言 本篇博客讲解一下c得入门基础 &#x1f493; 个人主页&#xff1a;普通young man-CSDN博客 ⏩ 文章专栏&#xff1a;C_普通young man的博客-CSDN博客 ⏩ 本人giee:普通小青年 (pu-tong-young-man) - Gitee.com 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大家点赞&…

掌握计算机网络基础:从零开始的指南

计算机网络是现代信息社会的重要基石。本文将以简洁明了的方式为基础小白介绍计算机网络的基本概念、分类、以及其在信息时代中的重要作用。 计算机网络在信息时代中的作用 21世纪是以数字化、网络化、信息化为重要特征的信息时代。 计算机网络作为信息的最大载体和传输媒介&…

微信自动加好友工具

批量导入数据到后台&#xff0c;可设置添加速度、间隔时间、验证信息和自动备注等&#xff0c;任务执行时间&#xff0c;后台会自动执行操作。

ubuntu 分区情况

ubuntu系统安装与分区指南 - Philbert - 博客园 (cnblogs.com)https://www.cnblogs.com/liangxuran/p/14872811.html 详解安装Ubuntu Linux系统时硬盘分区最合理的方法-腾讯云开发者社区-腾讯云 (tencent.com)https://cloud.tencent.com/developer/article/1711884

基于flask的猫狗图像预测案例

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️如遇文章付费&#xff0c;可先看…

uni-app 封装http请求

1.引言 前面一篇文章写了使用Pinia进行全局状态管理。 这篇文章主要介绍一下封装http请求&#xff0c;发送数据请求到服务端进行数据的获取。 感谢&#xff1a; 1.yudao-mall-uniapp: 芋道商城&#xff0c;基于 Vue Uniapp 实现&#xff0c;支持分销、拼团、砍价、秒杀、优…

2024年6月总结 | 软件开发技术月度回顾(第一期)

最新技术资源&#xff08;建议收藏&#xff09; https://www.grapecity.com.cn/resources/ Hello&#xff0c;大家好啊&#xff01;随着欧洲杯和奥运会的临近&#xff0c;2024 年下半年的序幕也随之拉开。回顾 2024 年上半年的技术圈&#xff0c;我们看到了一系列令人振奋的进展…

ELfK logstash filter模块常用的插件 和ELFK部署

ELK之filter模块常用插件 logstash filter模块常用的插件&#xff1a; filter&#xff1a;表示数据处理层&#xff0c;包括对数据进行格式化处理、数据类型转换、数据过滤等&#xff0c;支持正则表达式 grok 对若干个大文本字段进行再分割成一些小字段 (?<字段名…

51单片机嵌入式开发:5、按键、矩阵按键操作及protues仿真

按键、矩阵按键操作及protues仿真 1 按键介绍1.1 按键种类1.2 按键应用场景 2 按键电路3 按键软件设计3.1 按键实现3.2 按键滤波方法3.3 矩阵按键软件设计3.4 按键Protues 仿真 4 按键操作总结 提示 1 按键介绍 1.1 按键种类 按键是一种用于控制电子设备或电路连接和断开的按…