当前位置: 首页 > news >正文

面向对象特征二:继承

 继承的概述

生活中的继承
  • 财产继承:

绿化:前人栽树,后人乘凉

 

“绿水青山,就是金山银山”

  • 样貌:

 

继承之外,是不是还可以"进化":

 

继承有延续(下一代延续上一代的基因、财富)、扩展(下一代和上一代又有所不同)的意思。

 Java中的继承

角度一:从上而下

为描述和处理个人信息,定义类Person:

 

为描述和处理学生信息,定义类Student:

 

通过继承,简化Student类的定义:

 

说明:Student类继承了父类Person的所有属性和方法,并增加了一个属性school。Person中的属性和方法,Student都可以使用。

角度二:从下而上

 

多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类中无需再定义这些属性和行为,只需要和抽取出来的类构成继承关系。如图所示:

 

再举例:

 

 继承的好处
  • 继承的出现减少了代码冗余,提高了代码的复用性。

  • 继承的出现,更有利于功能的扩展。

  • 继承的出现让类与类之间产生了is-a的关系,为多态的使用提供了前提。

    • 继承描述事物之间的所属关系,这种关系是:is-a 的关系。可见,父类更通用、更一般,子类更具体。

注意:不要仅为了获取其他类中某个功能而去继承!

 继承的语法

继承中的语法格式

通过 extends 关键字,可以声明一个类B继承另外一个类A,定义格式如下

[修饰符] class 类A {
    ...
}

[修饰符] class 类B extends 类A {
    ...
}

 

 继承中的基本概念

类B,称为子类、派生类(derived class)、SubClass

类A,称为父类、超类、基类(base class)、SuperClass

 代码举例

1、父类

package com.atguigu.inherited.grammar;

/*
 * 定义动物类Animal,做为父类
 */
public class Animal {
    // 定义name属性
    String name;
    // 定义age属性
    int age;

    // 定义动物的吃东西方法
    public void eat() {
        System.out.println(age + "岁的"
                + name + "在吃东西");
    }
}

2、子类

package com.atguigu.inherited.grammar;

/*
 * 定义猫类Cat 继承 动物类Animal
 */
public class Cat extends Animal {
    int count;//记录每只猫抓的老鼠数量

    // 定义一个猫抓老鼠的方法catchMouse
    public void catchMouse() {
        count++;
        System.out.println("抓老鼠,已经抓了"
                + count + "只老鼠");
    }
}

3、测试类

package com.atguigu.inherited.grammar;

public class TestCat {
    public static void main(String[] args) {
        // 创建一个猫类对象
        Cat cat = new Cat();
        // 为该猫类对象的name属性进行赋值
        cat.name = "Tom";
        // 为该猫类对象的age属性进行赋值
        cat.age = 2;
        // 调用该猫继承来的eat()方法
        cat.eat();
        // 调用该猫的catchMouse()方法
        cat.catchMouse();
        cat.catchMouse();
        cat.catchMouse();
    }
}

 

 继承性的细节说明

子类会继承父类所有的实例变量和实例方法

从类的定义来看,类是一类具有相同特性的事物的抽象描述。父类是所有子类共同特征的抽象描述。而实例变量和实例方法就是事物的特征,那么父类中声明的实例变量和实例方法代表子类事物也有这个特征。

  • 当子类对象被创建时,在堆中给对象申请内存时,就要看子类和父类都声明了什么实例变量,这些实例变量都要分配内存。

  • 当子类对象调用方法时,编译器会先在子类模板中看该类是否有这个方法,如果没找到,会看它的父类甚至父类的父类是否声明了这个方法,遵循从下往上找的顺序,找到了就停止,一直到根父类都没有找到,就会报编译错误。

所以继承意味着子类的对象除了看子类的类模板还要看父类的类模板。

2、子类不能直接访问父类中私有的(private)的成员变量和方法

子类虽会继承父类私有(private)的成员变量,但子类不能对继承的私有成员变量直接进行访问,可通过继承的get/set方法进行访问。如图所示:

 

3、在Java 中,继承的关键字用的是“extends”,即子类不是父类的子集,而是对父类的“扩展”

子类在继承父类以后,还可以定义自己特有的方法,这就可以看做是对父类功能上的扩展。

4、Java支持多层继承(继承体系)

 

 

class A{}
class B extends A{}
class C extends B{} 

说明:

  • 子类和父类是一种相对的概念

  • 顶层父类是Object类。所有的类默认继承Object,作为父类。

5、一个父类可以同时拥有多个子类

class A{}
class B extends A{}
class D extends A{}
class E extends A{} 

6、Java只支持单继承,不支持多重继承  

 

 

public class A{}
class B extends A{}

//一个类只能有一个父类,不可以有多个直接父类。
class C extends B{}     //ok
class C extends A,B...    //error

 练习

练习1:定义一个学生类Student,它继承自Person类

 

练习2:

(1)定义一个ManKind类,包括

  • 成员变量int sex和int salary;

  • 方法void manOrWoman():根据sex的值显示“man”(sex==1)或者“woman”(sex==0);

  • 方法void employeed():根据salary的值显示“no job”(salary==0)或者“ job”(salary!=0)。

(2)定义类Kids继承ManKind,并包括

  • 成员变量int yearsOld;

  • 方法printAge()打印yearsOld的值。

(3)定义类KidsTest,在类的main方法中实例化Kids的对象someKid,用该对象访问其父类的成员变量及方法。

练习3:根据下图实现类。在CylinderTest类中创建Cylinder类的对象,设置圆柱的底面半径和高,并输出圆柱的体积。

 

http://www.lryc.cn/news/328626.html

相关文章:

  • 宝塔面板CentOS Stream 8 x86 下如何安装openlitespeed
  • LeetCode 2952.需要添加的硬币的最小数量:贪心(排序)
  • 基于SpringBoot + Vue实现的在线装修管理系统设计与实现+毕业论文
  • 阿里云安全产品简介,Web应用防火墙与云防火墙产品各自作用介绍
  • 作业 二维数组-定位问题
  • 通过Jmeter准备压测数据-mysql示例
  • 如何系统的自学python?
  • 记录一个写自定义Flume拦截器遇到的错误
  • Codeforces Round 934 (Div. 2) D. Non-Palindromic Substring
  • 如何避免公网IP安全风险
  • 探究 HTTPS 的工作过程
  • 算法学习——LeetCode力扣图论篇1
  • Stable Diffusion 模型下载:epiCPhotoGasm(真实、照片)
  • WPF 路由事件 数据驱动 、Window 事件驱动
  • 【UI框架】——保姆式使用教程
  • 第10讲:操作符详解
  • 数据可视化Grafana Windows 安装使用教程(中文版)
  • 【No.21】蓝桥杯组合数学|数位排序|加法计数原理|乘法计数原理|排列数|组合数|抽屉原理|小蓝吃糖果|二项式定理|杨辉三角|归并排序(C++)
  • 主流公链 - Monero
  • C#中让字典、列表、数组作为只读的方法参考
  • 深入理解 React 中的 children props 和 render props
  • 前端日期组件layui使用,月模式
  • Rust编程(四)PackageCrateModule
  • 命名空间【C++】(超详细)
  • OceanBase OBCA 数据库认证专员考证视频
  • 卷积神经网络(CNN)——基础知识整理
  • 2024四川省赛“信息安全管理与评估“--网络事件响应--应急响应(高职组)
  • Java类与对象:从概念到实践的全景解析!
  • MySQL与SQLite区别
  • 【社会救助管理系统】主要设计及拟采用的技术方案