首页 > 其他分享 >01-继承

01-继承

时间:2023-07-11 17:36:26浏览次数:58  
标签:01 String 继承 子类 private JavaStudent 父类 public

一、引入

相同特征产生代码冗余,有如下俩个类(Java学生类和UI学生类)

// JavaStudent.java
public class JavaStudent {
    private String number;   // 学号
    private String name;   // 姓名
    private int age;   // 年龄
    private String classes;   // 班级
    private String project;   // 项目

    // 考试
    public void exam(){
        System.out.println("学员考试");
    }

    // 登录
    public boolean login(String stuNo, String pwd){
        System.out.println("使用学号和密码登录");
        return true;
    }

    //...
}

// UIStudent.java 
public class UIStudent {
    private String number;   // 学号
    private String name;   // 姓名
    private int age;   // 年龄
    private String classes;   // 班级
    private String opus;   // 作品

    // 考试
    public void exam(){
        System.out.println("学员考试");
    }

    // 登录
    public boolean login(String stuNo, String pwd){
        System.out.println("使用学号和密码登录");
        return true;
    }

    //...
}

经过观察俩个类可以发现,它们都有一些相同特征(相同的属性、相同的方法),比如相同的属性有学号、姓名、年龄、班级;相同的方法有考试和登录。

针对上述发现问题,就有如下解决方案,就是把相同的属性和行为抽取出来,就可以降低重复代码的书写。抽取出来的共性代码单独封装到一个类中

二、概述

  1. 继承是将多个类的相同属性和行为抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承单独的这个类即可使用这些属性和行为
  2. 多个称为子类(派生类),单独的这个类称为父类(基类、超类)

三、使用方式

当多个类中有相同的代码(属性、行为)时,把相同的代码抽取出来,封装到了一个单独的类中,这样做的好处就是提高代码的复用性,但是这样做就面临一个问题,就是单独封装出来的类和之前被抽取代码的类,怎么建立联系(允许使用单独封装类中的成员)。接下来就解决这个问题

  • 使用继承需要在2个或者多个类之间

  • Java使用关键字extends表示继承

  • 语法格式

    public class 子类名 extends 父类名{
        
    }
    
  • 原则

    在类与类之间建立继承关系时,必须符合 is a(是一个...)

    要符合现实生活中的认知

    比如

    • Java学生是一个学生
    • 猫是一个动物
    • 冰箱是一个电器

    如果是如下就不符合了

    • Java学生是一个电器

四、使用继承改造代码

新增一个Student类,把JavaStudent类和UIStudent类中的相同特征进行抽取,如下

Student.java

// Student.java
public class Student {
    private String number;   // 学号
    private String name;   // 姓名
    private int age;   // 年龄
    private String classes;   // 班级

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    // ...(其他属性get、set方法;Student空参构造方法、有参构造方法)

    // 考试
    public void exam(){
        System.out.println("考试");
    }

    // 登录
    public boolean login(String stuNo, String pwd){
        System.out.println("登录");
        return true;
    }
}

JavaStudent.java

public class JavaStudent extends Student{
    private String project;   // 项目
    //...(project属性get、set方法、JavaStudent空参构造方法、有参构造方法)
}

UIStudent.java

public class UIStudent extends Student{
    private String opus;   // 作品
  //...(opts属性get、set方法、UIStudent空参构造方法、有参构造方法)
}

上述代码JavaStudent类和UIStudent类就继承了Student类,抽取完相同特征后,JavaStudent类和UIStudent类只保留了一些特有的特征,子类就可以访问父类的非私有成员。虽然此时JavaStudent类和UIStudent类不能直接访问父类的私有属性,但可以通过getset方法进行访问,建立一个测试类验证

public class Test {
    public static void main(String[] args) {
        JavaStudent javaStu = new JavaStudent("阿里云盘");
        javaStu.setNumber("10010");
        javaStu.setName("张三");
        javaStu.setAge(27);
        javaStu.setClasses("302");

        System.out.println(javaStu.getName() + "---" + javaStu.getProject());   // 张三---阿里云盘
        javaStu.exam();   // 使用父类的方法打印——考试
    }
}

五、使用规范

工作中对于继承应该遵循如下规范

  1. 多个类相同特征(共性属性、共性方法)放在父类中定义
  2. 子类扩展的属性和方法应该定义在本子类中

六、父子类的对比

  1. 子类和父类相比,子类的功能更强大
  2. 子类和父类相比,父类的范围表示更广

七、继承后子类对象的内存原理

基于上述代码,当你在测试类Test.javanew一个子类JavaStudent.java的时候,系统就会在堆内存中开辟一块新的空间,这个空间就属于javaStu这个对象,此时,这个空间一分为二,一块叫做父类成员空间super,一块叫做子类成员空间this,当我们使用考试方法时javaStu.exam(),会首先进入子类成员空间进行查找,结果是没有找到,接着会进入父类成员空间查找,结果找到了,就调用

总结如下:

子类对象在创建时,在堆内存中开辟的空间包含了两部分内容

  • super空间:存储父类的相关成员
  • this空间:存储了子类自身的相关成员

子类对象在访问成员时:

  • 优先使用子类自己的成员,当子类没有该成员时,去super空间中使用父类的成员,如果父类也没有,会一直向上查找,如果直至Object类都没有的话,会报错。

八、特点

  1. 单继承,只支持单继承,不支持多继承
  2. 一个父类可以有多个子类
  3. 多层继承,子类C继承父类B,父类B可以继承父类A,如果一个类没有直接继承关系,默认继承Object,因此,所有类都是Object类的子类

九、访问特点

  • 变量访问

    在子类方法中访问一个变量,满足就近原则

    1. 先子类局部范围找
    2. 然后子类成员范围找
    3. 然后父类成员范围找,如果父类范围内还没有找到则报错
    4. 父类中私有的成员子类不能直接访问

    如果局部变量、本类成员变量、父类成员变量重名,应该按照如下进行区分

    1. 局部变量直接访问
    2. 本类成员变量,使用this访问
    3. 父类成员变量,使用super访问
    4. 使用this访问时,如果子类没有找到,也会去父类进行查找
  • 方法访问

    通过子类对象访问一个方法也满足就近原则

    1. 子类成员范围找
    2. 父类成员范围找
    3. 不能直接访问父类中私有成员

    如果父类中出现同名参数的访问,先优先使用子类的,要访问父类相同方法可以使用super关键字

标签:01,String,继承,子类,private,JavaStudent,父类,public
From: https://www.cnblogs.com/xulinjun/p/17545383.html

相关文章

  • 01.法律笔记
    基础概念:网络安全,是指通过采取必要措施,防范对网络的攻击、侵入、干扰、破坏和非法使用以及意外事故,使网络处于稳定可靠运行的状态,以及保障网络数据的完整性、保密性、可用性的能力。---《中华人民共和国网络安全法》网络运营者,是指网络的所有者、管理者和网络服务提供者。---......
  • 80.继承机制中对象之间如何转换?指针和引用之间如何转换?
    80.继承机制中对象之间如何转换?指针和引用之间如何转换?1.向上类型转换将派生类指针或引用转换为基类的指针或引用被称为向上类型转换,向上类型转换会自动进行,而且向上类型转换是安全的。2.向下类型转换将基类指针或引用转换为派生类指针或引用被称为向下类型转换,向下类型转换不......
  • 81.知道C++中的组合吗?它与继承相比有什么优缺点吗?
    81.知道C++中的组合吗?它与继承相比有什么优缺点吗?1.继承继承是Isa的关系,比如说Student继承Person,则说明StudentisaPerson。继承的优点是子类可以重写父类的方法来方便地实现对父类的扩展。继承的缺点有以下几点:①父类的内部细节对子类是可见的。②子类从父类继承的方法......
  • VUE基础01-响应式
    SFC(Single-FileComponent,缩写为SFC)SFC是一种可复用的代码组织形式,它将从属于同一个组件的HTML、CSS和JavaScript封装在使用.vue后缀的文件中。响应式reactive()reactive()只适用于对象(包括数组和内置类型,如Map和Set)。import{reactive}from'vue'const......
  • Metasploit Pro 4.22.1-2023070501 (Linux, Windows) - 渗透测试框架
    MetasploitPro4.22.1-2023070501(Linux,Windows)-渗透测试框架Rapid7Penetrationtesting请访问原文链接:https://sysin.org/blog/metasploit-pro-4/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org世界上最广泛使用的渗透测试框架知识就是力量,尤其是当它被......
  • P2024 [NOI2001] 食物链 || #576. 食物链【NOI2001】 (并查集)
    空降锣鼓空降OJ题解:#include<bits/stdc++.h>usingnamespacestd;intn,k;intd,x,y;intans;intfa[500050];intfind(intx){//找爸爸 if(fa[x]==x) returnfa[x]; returnfind(fa[x]);}intmain(){ cin>>n>>k; for(inti=1;i<=n*3;i++)//开三个并查集风......
  • LOJ10010 糖果传递
    经典问题,环形均分纸牌设每个人的糖果数量为\(a[1]\)~\(a[n]\)设\(b[i]\)表示第\(i\)个人传递给第\(i+1\)个人的糖果数量(正负有意义),其中\(b[n]\)表示第\(n\)个人传递给第\(1\)个人的糖果数量根据题意不难列出\(n\)个方程,看似\(n\)个未知数,只有唯一解,但其实只有\(n-1\)个方程,因为......
  • CODE FESTIVAL 2017 Final J 题解
    problem&blog。萌萌点分治,积累个trick/qq。对于完全图\((V,E)\),将\(E\)分成\(E_1,E_2,\cdots,E_k\)(\(E_1\cupE_2\cup\cdots\cupE_k=E\))。对每个边集求MST,得到新边集\(E_1^{'},E_2^{'},\cdots,E_k^{'}\),再求MST。最终剩下的边集,等同于原边集的MST。......
  • 2013年湖南省对口高考真题
    一、选择题1、下列选项中正确的C语言变量定义是__________。A.chara1='A',a2=A;                  B.unsignedlonga=1000;C.floata1=a2=10.0;                   D.doublea=0.618,a=3.14; 2、假设有:floata=5,b=a+5/2;则执行语句pri......
  • P4016题解
    本题是一个比较经典的问题(环形均分纸牌问题),我也不知道为什么它在网络流24题里面出现。但是作为一道比较典的排序算法的题,还是放出来讲一下。solution假设\(a_1\)给\(a_n\)了\(x_1\)张纸牌,\(a_2\)给\(a_1\)了\(x_2\)张纸牌......(\(x_i\)可正可负)。因此操作数量为......