继承.Java

目录

1,概述

1.1继承的含义

1.2什么时候用继承

1.3继承的好处

1.4继承的特点

2,继承的格式

3,可以继承哪些内容

4,成员方法和成员变量的访问特点

5,构造方法的访问特点 

6,this,super使用总结

7,小结

8,练习 


1,概述

1.1继承的含义

继承:就是子类继承父类的属性和行为,使得子类对象可以直接具有与父类相同的属性、相同的行为(行为可重写)。子类可以直接访问父类中的非私有的属性和行为。

继承描述的是事物之间的所属关系,这种关系是:is-a 的关系。例如,兔子属于食草动物,食草动物属于动物。可见,父类更通用,子类更具体。我们通过继承,可以使多种事物之间形成一种关系体系。

  • Java提供一个关键字extends,用这个关键字,我们可以让一个类与另一个类建立联系
public class Cat extends Animal{}
  •  Cat称为子类(派生类),Animal称为父类(基类或超类)

1.2什么时候用继承

当类与类之间,存在相同(共性)的内容,并满足子类是父类的一种,就可以考虑用继承来优化代码

图一:

图二 

图一设计的继承结构正确,图二错误,因为Coder是人,Goods是物品,Coder不是Goods里面的一种

1.3继承的好处

  • 可以把多个子类中重复的代码抽取到父类中,提高代码的复用性(减少代码冗余,相同代码重复利用)。
  • 子类可以在父类的基础上,增加其他的功能,使子类更强大
  • 使类与类之间产生了关系

1.4继承的特点

  • Java只支持单继承:一个类只能继承一个直接父类
  • 不支持多继承,但支持多层继承

多层继承:子类A继承父类B,父类B可以继承父类C

2,继承的格式

通过extends关键字,可以声明一个子类继承一个父类,定义格式如下:

class 父类{

       .....
}
class 子类  extends  父类{
       .....
}

 需要注意:Java是单继承的,一个类只能继承一个直接父类,跟现实世界很像,相当于一个儿子只能有一个父亲,但是Java中的子类是更加强大的。

例子

package extendsKey;

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

        //创建对象
        Ragdoll rd=new Ragdoll();
        rd.eat();
        rd.drink();//间接继承
        rd.mouse();//直接继承
        System.out.println("-----------------");
        Huskey hs=new Huskey();
        hs.eat();
        hs.drink();//间接继承
        hs.lookHome();//直接继承
        hs.catchHome();//本类中的行为

        //子类只能访问父类中非私有的成员
    }
}

class Animal {
    public void eat(){
        System.out.println("动物在吃饭");
    }
    public void drink(){
        System.out.println("动物在喝水");
    }
}

class Cat extends Animal{

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

class Dog extends Animal{
    public void lookHome(){
        System.out.println("狗在看家");
    }
}

class Huskey extends Dog{

    public void catchHome(){
        System.out.println("哈士奇在拆家");
    }
}

class Ragdoll extends Cat{

}
结果

3,可以继承哪些内容

  • 构造方法不能被继承
  • 成员变量都能被继承,但私有的不能使用
  • 成员方法非私有能,私有不能

4,成员方法和成员变量的访问特点

就近原则:谁离我近,我就用谁

  • 重名怎么办

System.out.println(name); 从局部位置开始往上找
System.out.println(this.name);从本类成员位置开始往上找,如果本类中没有,就找从父类继承下来的
System.out.println(super.name);从父类成员位置开始往上找

package extendsKey;

public class Fu {
    String name="Fu";
}
class Zi extends Fu{
    String name="Zi";
    public void Zishow(){
        String name="zishow";
        System.out.println(name);
        System.out.println(this.name);
        System.out.println(super.name);
    }
}
class Tester{
    public static void main(String[] args) {
        Zi per=new Zi();
        per.Zishow();
    }
}

结果 

4.1成员方法的重写

(1)重写是什么?

  • 子类可以继承父类方法,但有时从父类继承的方法在子类中必须进行修改以适应新类的需要,这种对父类方法进行改写或改造的现象称为方法重写或方法覆盖。父类方法在子类中重写使继承更加灵活。

(2)语法规则:

  •  在子类中定义;
  • 方法名、参数类型、顺序、个数(不包括参数名,对参数名没有要求)都要与父类继承的方法相同;

  • 当子类重写父类方法后,子类对象调用的是重写后的方法。

  • Java中用@Override标注重写后的方法,如果重写不成功,标注会报错

5,构造方法的访问特点 

  • 父类中的构造方法不会被子类继承
  • 子类中所有的构造方法默认先访问父类中的无参构造,再执行自己

为什么?

  • 子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据
  • 子类在初始化之前,一定要调用父类构造方法先完成父类数据空间的初始化
  • 父类中的属性都是共性的内容,而且都是可以被子类继承下来的,而父类中的空参构造就是给父类中的属性一个默认初始化,如果没有这一步,子类在使用父类的属性是就没有值了

怎么调用父类构造方法的?

  • 子类构造方法的第一行默认语句都是:super(),不写也存在,且必须在第一行
  • 如果想要调用父类的有参构造,必须手动写super进行调用,因为默认的只能调用空参

代码实现

6,this,super使用总结

  • this:理解为一个变量,表示当前方法调用者的地址值
  • super:代表父类存储空间
关键字访问成员变量访问成员方法访问构造方法
this

this.成员变量

访问本类成员变量

this.成员方法(...)

访问本类成员方法

this(...)

访问本类其他构造方法

super

super.成员变量

访问父类成员变量

super.成员方法(...)

访问父类成员方法

super(...)

访问父类构造方法

this(...)访问本类其他构造方法:

  • 什么时候用到:给一些数据做默认值的时候就会用到

结果 

7,小结

  1. 继承实际上是子类相同的属性和行为可以定义在父类中,子类特有的属性和行为由自己定义,这样就实现了相同属性和行为的重复利用,从而提高了代码复用。
  2. 子类继承父类,就可以直接得到父类的成员变量和方法

8,练习 

  • 带有继承结构的标准javabean类(成员变量私有化,用set,get方法获取)

1,经理

成员变量:工号,姓名,工资,管理奖金

成员方法:工作(管理其他人),吃饭(吃米饭)

2,厨师

成员变量:工号,姓名,工资

成员方法:工作(炒菜),吃饭(吃米饭)

  • 父类
package extendsKey;

public class Employee {
    //1.见名知意
    //2.所有成员变量都要私有化
    //3.构造方法(空参  带全部参数的构造)
    //4。get/set方法
    private String id;
    private String name;
    private double salary;

    public Employee() {
    }

    public Employee(String id, String name, double salary) {
        this.id = id;
        this.name = name;
        this.salary = salary;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    public void work(){
        System.out.println("在工作");
    }
    public void eat(){
        System.out.println("在吃米饭");
    }
}
  • 子类
package extendsKey;

public class Manager extends Employee{
    private double bonus;

    //空参构造
    public Manager() {

    }
    //带全部参数的构造  父类+子类
    public Manager(String id, String name, double salary, double bonus) {
        super(id, name, salary);
        this.bonus = bonus;
    }

    public double getBonus() {
        return bonus;
    }

    public void setBonus(double bonus) {
        this.bonus = bonus;
    }

    @Override
    public void work(){
        System.out.println("管理其他人");
    }
}
package extendsKey;

public class Cook extends Employee{

    public Cook() {
    }

    public Cook(String id, String name, double salary) {
        super(id, name, salary);
    }

    @Override
    public void work(){
        System.out.println("厨师正在炒菜");
    }
}
  • 测试类
package extendsKey;

public class Test3 {
    public static void main(String[] args) {
        Manager s=new Manager("001","管理小行家",99999.1,8000);
        System.out.println(s.getId()+","+s.getName()+","+s.getSalary()+","+s.getBonus());
        Cook c=new Cook();
        c.setId("002");
        c.setName("厨师高手");
        c.setSalary(9999.9);
        System.out.println(c.getId()+","+c.getName()+","+c.getSalary());

    }
}
  • 结果

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

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

相关文章

【ARM 嵌入式 C 常用数据结构系列 25 -- container_of 宏 使用介绍】

文章目录 container_of 宏container_of 宏的定义container_of 使用示例应用场景总结 container_of 宏 在Linux内核编程中,container_of宏是一个非常有用的工具,它允许开发者从指向结构体中某个成员的指针反向获得包含它的完整结构体的指针。这在实现基于…

基于深度学习的植物叶片病害识别系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)

摘要:本文深入研究了基于YOLOv8/v7/v6/v5的植物叶片病害识别系统,核心采用YOLOv8并整合了YOLOv7、YOLOv6、YOLOv5算法,进行性能指标对比;详述了国内外研究现状、数据集处理、算法原理、模型构建与训练代码,及基于Strea…

【IT运维入门(ITHW)系列】之「快速部署」第一期清单(持续更新)

ITHW是Information Technology Hello World的缩写简拼。意在提供IT领域的入门相关知识,近期给大家带来的是主流技术选型的快速部署系列,意在最大程度地简化部署过程,以便能快速体验或测试相关技术选型。 ITHW快捷部署系列(第一期&…

【服务器部署篇】关于云服务器的选择和购买

作者介绍:本人笔名姑苏老陈,从事JAVA开发工作十多年了,带过大学刚毕业的实习生,也带过技术团队。最近有个朋友的表弟,马上要大学毕业了,想从事JAVA开发工作,但不知道从何处入手。于是&#xff0…

蓝桥杯(4):python动态规划DF[1]

动态规划相当于正着想?dfs主要适用于位置的变化? 子问题!状态,状态转移方程 1 一维DP 1.1 定义 重叠子问题!转换成子问题 ,与记忆化搜索很像 1.2 例子 1.2.1 上楼梯 子问题到最终的问题只能跨一步&…

攻防世界 xff_referer 题目解析

xff_referer 一:了解xxf和Referer X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项。 一般的客户端发送HTTP请求没有X-Forwarded-For头的&#xff0…

基于springboot+vue的企业校园招聘面试管理系统【超级管理员、平台企业、学校、学生、HR】

招聘系统将为招聘者和求职者构建一个功能齐全、方便快捷的招聘平台,减少双方投入招聘活动的成本,为招聘求职双方带来便利,系统将实现如下目标: (1)针对系统内的不同角色,系统能够赋予其不同的操作权限。招聘者和求职者…

51单片机入门_江协科技_19~20_OB记录的笔记

19. 串口通讯 19.1. 串口介绍: •串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。 •单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大的…

玩转ChatGPT:Kimi测评(图片识别)

一、写在前面 ChatGPT作为一款领先的语言模型,其强大的语言理解和生成能力,让无数用户惊叹不已。然而,使用的高门槛往往让国内普通用户望而却步。 最近,一款由月之暗面科技有限公司开发的智能助手——Kimi,很火爆哦。…

大意了MySQL关键字EXPLAIN

一、问题 然后explain带了单引号、以区别其关键字 二、报错如下 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near explain, us.nickname AS user_send_nickname, ua.nickname…

【GEE实践应用】GEE下载遥感数据以及下载后在ArcGIS中的常见显示问题处理(以下载哨兵2号数据为例)

本期内容我们使用GEE进行遥感数据的下载,使用的相关代码如下所示,其中table是我们提前导入的下载遥感数据的研究区域的矢量边界数据。 var district table;var dsize district.size(); print(dsize);var district_geometry district.geometry();Map.…

力扣热题100_链表_2_两数相加

文章目录 题目链接解题思路解题代码 题目链接 2. 两数相加 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 …

四、Yocto创建静态IP和VLAN(基于raspiberrypi 4B)

Yocto创建VLAN配置 在车载域控中很多时候需要创建VLAN,本小节记录如何为yocto构建出来的image自动化创建静态IP以及VLAN。 关于各种VLAN的配置参考:VLAN 1. ubuntu系统中使用netplan创建VLAN 正常情况下我们在ubuntu系统中可以通过netplan来自动化创建…

全猎/暴漏攻击面搜索

推荐: FullHunt | Expose YourAttack Surface Discover, monitor, and secure your attack surface. FullHunt delivers the best platform in the market for attack surface security.https://fullhunt.io/

Echarts 自适应宽高,或指定宽高进行自适应

文章目录 需求分析 需求 有一个按钮实现对Echarts的指定缩放与拉长&#xff0c;形成自适应效果 拉长后效果图 该块元素缩短后效果图 分析 因为我习惯使用 ref 来获取组件的 DOM 元素&#xff0c;然后进行挂载 <div ref"echartsRef" id"myDiv" :sty…

C++核心高级编程 --- 4.类和对象

文章目录 第四章&#xff1a;4.类和对象4.1 封装4.1.1 封装的意义4.1.2 struct与class的区别 4.2 对象的初始化和清理4.2.1 构造函数和析构函数4.2.2 构造函数的分类及调用4.2.3 拷贝构造函数调用时机4.2.4 构造函数调用规则4.2.5 深拷贝与浅拷贝4.2.6 初始化列表4.2.7 类对象作…

Chat-REC: Towards Interactive and Explainable LLMs-Augmented Recommender System

1、动机 推荐系统被应用于推荐服务&#xff0c;提高人们的生活质量&#xff0c;但仍存在一些问题。缺少交互性、可解释性&#xff0c;缺乏反馈机制&#xff0c;以及冷启动和跨域推荐。 Chat-Rec 将用户画像和历史交互转换为 Prompt&#xff0c;有效地学习用户的偏好&#xff…

【漏洞复现】用友NC cloud importhttpscer 存在任意文件上传

0x01 阅读须知 “如棠安全的技术文章仅供参考&#xff0c;此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供…

STM32L4R9 的 QuadSPI Flash 通讯速率不理想

1. 引言 客户反应 STM32L4R9 同 QSPI Flash 通讯&#xff0c;测出来的读取速率为 10MB/s&#xff0c; 和理论值相差较大。 2. 问题分析 按照客户的时钟配置和 STM32L4R9 的数据手册中的数据&#xff0c;OSPI 读数速率为 10MB/s 肯定存在问题。同时我们也可以在 AN4760 应用手…

python 字符串补齐

参考文献 https://blog.csdn.net/ViatorSun/article/details/130424704 今天遇到一个格式化字符串的问题 "123".ljust(8,"0")"123".rjust(8,"0")