java语言进阶篇4——继承

1、继承的概念

  • 面向对象三大特征:封装性,继承性,多态性。继承是多态的前提,没有继承就没有多态。
  • 继承主要解决的问题:共性抽取
  • 继承关系当中的特点:①子类可以拥有父类的“内容”;②子类还可以拥有自己的内容。
  • 在继承关系中,“子类就是一个父类”。也就是说,子类可以被当做父类来看,如父类是员工,子类是讲师,那么,“讲师就是员工”。
    继承

2、继承的格式

  • 定义父类(一个普通的类定义):
    public class 父类名{}
  • 定义子类:
    public class 子类名 extends 父类名{}
public class Employee { //父类
    public void method(){
        System.out.println("父类方法执行");
    }
}
public class Teacher extends Employee{ //子类1
    //什么也没有
}
public class Assistant extends Employee{ //子类2
    //什么也没有
}
public class DemoJicheng {
    public static void main(String[] args) {
        Teacher teacher = new Teacher();
        teacher.method(); //父类方法执行  子类可以拥有父类的内容
        Assistant assistant = new Assistant();
        assistant.method();  //父类方法执行
    }
}

3、继承中成员变量的访问特点

  • 在父子类的继承关系中,如果成员变量重名,则创建子类对象时,访问有两种方式:
  1. 直接通过子类对象访问成员变量:等号左边是谁,就优先用谁,没有则向上找;
  2. 间接通过成员方法访问成员变量:该方法属于谁,就优先用谁,没有则向上找。
  • 区分子类方法中重名的三种变量:
  1. 局部变量:直接写成员变量名;
  2. 本类的成员变量:this.成员变量名
  3. 父类的成员变量:super.成员变量名
public class Fu { //父类
    int num =10; //父类成员变量
}
public class Zi extends Fu {  //子类
    int num = 20; //本类的成员变量
    public void method(){
        int num = 30; //局部变量
        System.out.println(num);  //30  局部变量
        System.out.println(this.num); //20  本类的成员变量
        System.out.println(super.num);  //10  父类的成员变量
    }
}
public class DemoThisSuper {
    public static void main(String[] args) {
        Zi zi = new Zi();
        zi.method();  //30 20 10
    }
}

4、继承中成员方法的访问特点

  • 在父子类的继承关系中,创建子类对象,访问重名成员方法的规则:创建的对象是谁,就优先用谁,如没有,则向上找。
  • 无论是成员方法还是成员变量,如果没有都是向上找父类,绝不会向下找子类。

5、继承中方法的覆盖重写

  • 重写(Override):在继承关系中,方法的名称一样,参数列表也一样。
  • 重载(Overloa):方法名称一样,参数列表不一样。
  • 方法覆盖重写的特点:创建的是子类对象,则优先用子类方法。

6、方法重写的注意事项

  • 覆盖重写必须方法名称一样参数列表也一样,在子类重写方法前写上@Override可以用来检测是否是有效正确的覆盖重写。(也可省略,推荐写上)
  • 子类方法的返回值必须小于等于父类方法的返回值类型。
  • 子类方法的权限必须大于等于分类方法的权限修饰符。(public>protected>不写>private)
  • 什用时候用:对于已经投入使用的类,尽量不要进行修改,推荐定义一个新的类,来重复利用其中共性的内容,并添加改动新的内容——继承、重写

7、继承中构造方法的访问特点

  • 子类构造方法中有一个默认隐含的“super()”调用,所以一定是先调用的父类构造,后执行子类的构造。
  • 子类构造可以通过super关键字来调用父类重载构造。
  • super的父类构造调用,必须是子类构造方法的第一个语句,不能一个子类构造调用多次super构造。
  • 所以,子类必须调用父类构造方法,不写则赠送super(),写了则用写的指定的super调用,super只能有一个,且必须是第一个语句

8、super关键字的用法

  • 在子类的成员方法中,访问父类的成员变量。
  • 在子类的成员方法中,访问父类的成员方法。
  • 在子类的成员方法中,访问父类的构造方法。
public class Fu { //父类
    int num =10; //父类成员变量
    public void method(){
        System.out.println("父类方法");
    }
}
public class Zi extends Fu {  //子类
    int num = 20; //本类的成员变量
    public Zi(){
        super();   //访问父类构造方法
    }
    public void methodZi(){
        System.out.println(super.num);  //访问父类成员变量
    }
    public void method(){
        super.method();  //访问父类成员方法
        System.out.println("子类方法");
    }
}
public class DemoThisSuper {
    public static void main(String[] args) {
        Zi zi = new Zi();
        zi.method();  //父类方法 
                      //子类方法
    }
}

9、this关键字的用法

  • 在本类的成员方法中,访问本类的成员变量。
  • 在本类的成员方法中,访问本类的另一个成员方法。
  • 在本类的成员方法中,访问本类的另一个构造方法。
  • this(…)调用也必须是构造方法的第一个语句,唯一一个
public class Fu { //父类
    int num =30; //父类成员变量
    public void method(){
        System.out.println("父类方法");
    }
}
public class Zi extends Fu {  //子类
    int num = 20; //本类的成员变量
    public Zi(){
        this(123);   //本类的无参构造调用本类的有参构造
    }
    public Zi(int n){
        this(1,2);  //调用本类中另一个构造方法
    }
    public Zi(int n,int m){  //不能再有this()
    }
    public void showNum(){
        int num = 10;
        System.out.println(this.num); //本类的成员变量 10
        System.out.println(super.num); //父类的成员变量 30
    }
    public void methodA(){
        System.out.println("AAA");  //访问父类成员变量
    }
    public void methodB(){
        this.methodA();  // 调用本类中另一个成员方法
        System.out.println("BBB");
    }
}
public class DemoThisSuper {
    public static void main(String[] args) {
        Zi zi = new Zi();
        zi.showNum();  // 20 30
        zi.methodB();  // AAA BBB
    }
}

10、super与this关键字的内存图

super与this关键字的内存图

11、java继承的三个特征

  • 一个类的直接父类只能有唯一一个。
  • java语言可以多级继承。
  • 一个子类的直接父类是唯一的,但是一个父类可以拥有很多个子类。
    java继承的三个特征
内容: 这个合成医疗保健数据集的创建是为了作为数据科学、机器学习和数据分析爱好者的宝贵资源。 灵感: 医疗保健数据通常很敏感,并受隐私法规的约束,因此难以访问以进行学习和实验。为了解决这一差距,我利用 Python 的 Faker 库生成了一个数据集,该数据集反映了医疗保健记录中常见的结构和属性。通过提供这些合成数据,我希望促进医疗保健分析领域的创新、学习和知识共享。 表格信息: 每列都提供有关患者、其入院情况和提供的医疗保健服务的特定信息,使此数据集适用于医疗保健领域的各种数据分析和建模任务。以下是数据集中每一列的简要说明 - 名字:此列表示与医疗保健记录关联的患者的姓名。 年龄:患者入院时的年龄,以年表示。 性:指示患者的性别,“男性”或“女性”。 血型:患者的血型,可以是常见的血型之一(例如,“A+”、“O-”等)。 医疗状况:此列指定了与患者相关的主要医疗状况或诊断,例如“糖尿病”、“高血压”、“哮喘”等。 入学日期:患者入住医疗机构的日期。 医生:在患者入院期间负责护理的医生的姓名。 医院:标识患者收治的医疗机构或医院。 保险提供商:此列指示患者的保险提供商,可以是多个选项之一,包括“Aetna”、“Blue Cross”、“Cigna”、“UnitedHealthcare”和“Medicare”。 账单金额:患者在入院期间为他们的医疗保健服务开具的账单金额。这表示为浮点数。 房间号:患者入院期间入住的房间号。 入场类型:指定入院类型,可以是“紧急”、“选择性”或“紧急”,以反映入院的情况。 出院日期:患者从医疗机构出院的日期,基于入院日期和实际范围内的随机天数。 药物:确定患者在入院期间开具或服用的药物。例子包括“阿司匹林”、“布洛芬”、“青霉素”、“扑热息痛”和“立普妥”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值