继承.Java

news2024/11/19 12:41:13

目录

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());

    }
}
  • 结果

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

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

相关文章

windows版本-idea中下载的java版本在哪

1、点击idea的file-projectStructure 进入: 通过电脑目录进入该目录 找到bin目录,copy该目录地址 copy下来之后设置到系统环境变量中

C#项目引用解决方案中其他项目dll时,出现黄色感叹号的解决方案

问题引入 今天拿着老师傅的老项目,需要做通讯调试,说测试一下,便添加了一个项目A来编写结构体,然后在窗体程序项目B中引用A,发现B一引用A,在B项目的引用下面A就多了个黄色感叹号,一编译B项目&am…

瑞_Redis_商户查询缓存

文章目录 项目介绍1 短信登录2 商户查询缓存2.1 什么是缓存2.1.1 缓存的应用场景2.1.2 为什么要使用缓存2.1.3 Web应用中缓存的作用2.1.4 Web应用中缓存的成本 2.2 添加Redis缓存2.2.1 背景2.2.2 缓存模型和思路2.2.3 代码实现2.2.4 测试附:IDEA控制台输出自动换行设…

色域(BT2020/BT709/sRGB/DCI-P3/Rec.709/NTSC)

什么是色域 色域是对一种颜色进行编码的方法,也指一个技术系统能够产生的颜色的总和。在计算机图形处理中,色域是颜色的某个完全的子集。一般来说,高端投影仪和电视都会强调色域范围和对比度,而不是唯亮度标准论。 自然界可见光…

面试算法-139-盛最多水的容器

题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明:你不能倾斜容器。…

Sybase ASE中的char(N)的坑以及与PostgreSQL的对比

1背景 昨天,一朋友向我咨询Sybase ASE中定长字符串类型的行为,说他们的客户反映,同样的char类型的数据,通过jdbc来查,Sybase库不会带空格,而PostgreSQL会带。是不是这样的?他是PostgreSQL的专业大拿,但因为他手头没有现成的Sybase ASE环境,刚好我手上有,便于一试。 …

(学习日记)2024.04.01:UCOSIII第二十九节:消息队列实验(待续)

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

LearnOpenGL_part1

创建窗口 - LearnOpenGL CN (learnopengl-cn.github.io) 最原始的黑框框&#xff1a; #include <glad/glad.h> #include <GLFW/glfw3.h> #include <iostream> int main() {glfwInit();//初始化GLFWglfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//配置G…

亚马逊AWS永久免费数据库

Amazon DynamoDB 是一项无服务器的 NoSQL 数据库服务&#xff0c;您可以通过它来开发任何规模的现代应用程序。作为无服务器数据库&#xff0c;您只需按使用量为其付费&#xff0c;DynamoDB 可以扩展到零&#xff0c;没有冷启动&#xff0c;没有版本升级&#xff0c;没有维护窗…

如何同时安全高效管理多个谷歌账号?

您的业务活动需要多个 Gmail 帐户吗&#xff1f;出海畅游&#xff0c;Gmail账号是少不了的工具之一&#xff0c;可以关联到Twitter、Facebook、Youtube、Chatgpt等等平台&#xff0c;可以说是海外网络的“万能锁”。但是大家都知道&#xff0c;以上这些平台注册多账号如果产生关…

Codeforces Round 930 (Div. 2) ---- E. Pokémon Arena ---- 题解

E. Pokmon Arena&#xff1a; 题目大意&#xff1a; 思路解析&#xff1a; 可以想到的是&#xff0c;可以用最短路来解决这个问题&#xff0c;但是如果简单的建图的话&#xff0c;时间复杂度将会达到 O(n*n*m)&#xff0c;我们考虑怎么减少图中边的个数。 我们考虑一个颜色&…

C语言中的字符与字符串:魔法般的函数探险

前言 在C语言的世界里&#xff0c;字符和字符串是两个不可或缺的元素&#xff0c;它们像是魔法般的存在&#xff0c;让文字与代码交织出无限可能。而在这个世界里&#xff0c;有一批特殊的函数&#xff0c;它们如同探险家&#xff0c;引领我们深入字符与字符串的秘境&#xff0…

探索GlassWire:网络安全与流量监控软件

名人说&#xff1a;东边日出西边雨&#xff0c;道是无晴却有晴。——刘禹锡 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、软件介绍1、GlassWire&#xff08;免费版本&#xff09;2、核心特点 二、下载安装①…

想拿高薪?云计算或许是你的跳板!

随着科技的不断进步&#xff0c;云计算作为一项重要的技术趋势&#xff0c;正引领着整个行业的快速发展。越来越多的人开始关注云计算领域&#xff0c;希望通过学习和掌握这一技能来获得更高的薪资。那么&#xff0c;为什么选择云计算作为职业发展方向&#xff1f;学习云计算又…

sharding‐jdbc之分库分表(mysql主从同步的数据库安装和使用)

水平分表 创建基础工程.. 引入sharding‐jdbc的maven依赖包 注意需要数据库连接池等依赖 <dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.0.0-RC1&l…

【pycharm】在debug循环时,如何快速debug到指定循环次数

【pycharm】在debug循环时&#xff0c;如何快速debug到指定循环次数 【先赞后看养成习惯】求关注收藏点赞&#x1f600; 在 PyCharm 中&#xff0c;可以使用条件断点来实现在特定循环次数后停止调试。这可以通过在断点处右键单击&#xff0c;然后选择 “Add Breakpoint” -&g…

ES6学习(五)-- Module 语法

文章目录 Module 语法1.1 痛点介绍(1) 异步加载(2) 私密(3) 重名(4) 依赖 1.2 解决方法(1) 解决异步加载问题(2) 解决私密问题(3) 重名解决方法(4) 解决依赖问题 1.3 模块化使用案例 Module 语法 之前js 出现的某些痛点&#xff1a; 在script 中引入的变量名不可以重复&#…

位运算-191. 位1的个数- 136. 只出现一次的数字

位1的个数 已解答 简单 相关标签 相关企业 编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中 设置位 的个数&#xff08;也被称为汉明重量&#xff09;。 示例 1&#xff1a; 输入&#xff1a;n 11 输…

gpt4.0获取方法

今天我们想要进行的一项尝试就是—— 如何从一个不知道内容的数据文件中&#xff0c;一键生成一篇像模像样的经济学"论文”。 在开始之前&#xff0c;我们要准备好必要的AI利器&#xff1a; GPT3.5镜像站&#xff08;简单问题极快回答&#xff09;&#xff1a; https:/…

python写文件怎么读出来

python中对文件的操作大概分为三步&#xff1a;打开文件、操作文件&#xff08;读、写、追加写入&#xff09;、关闭文件。 1、无论对文件做哪种操作&#xff0c;操作前首先要保证文件被打开了&#xff0c;即需要一个打开的操作。 例&#xff1a;open(XXX.txt) 打开文件的同…