文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

【Java基础篇 | 面向对象】—— 继承

2023-10-11 18:19

关注

个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【JavaSE_primary
本专栏旨在分享学习JavaSE的一点学习心得,欢迎大家在评论区讨论💌
在这里插入图片描述

继承允许一个类继承另一个类的属性和方法,并且可以在其中添加或修改行为。Java引入继承的目的是为了促进代码重用和构建更加模块化和可扩展的软件系统

目录

一、什么是继承

继承:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特 性的基础上进行扩展,增加新功能,这样产生新的类,称派生类

请看代码:

class Animal{    public String name;    public int age;    public void eat(){        System.out.println(name+"正在吃饭");    }}class Dog extends Animal{    public void barks(){        System.out.println(name+"汪汪叫"+"年龄:"+age);    }}class Cat extends Animal{    public void catchMouse(){        System.out.println(name+"正在抓老鼠");    }}

上述代码中:我们把Animal称为父类/基类,把Cat、Dog称为子类/派生类

子类继承父类后,会把父类的属性和方法全部继承。所以我们可以把继承理解为共性的抽取,从而达到代码的复用。

注意:

二、父类成员访问

在继承体系中,子类将父类中的方法和字段继承下来了,下面来看看子类是如何直接访问父类中继承下来的成员的。

2.1子类中如何访问父类的成员变量和成员方法

请看代码演示:

class Base{    int a;    int b;}public class Derived extends Base{    int a;    int c;    public void method(){        int a = 10; //这里访问的是子类的a        int b = 20;        int c = 20;        System.out.println(super.a);        System.out.println(a);        System.out.println(b);        System.out.println(c);    }public void methodB(){System.out.println("Derived中的methodB()方法");}public void methodC(){methodB(); // 访问子类自己的methodB()methodA(); // 访问父类继承的methodA()// methodD(); // 编译失败,在整个继承体系中没有发现方法methodD()}    public static void main(String[] args) {        Derived derived = new Derived();        derived.method();    }}

运行结果如下:
在这里插入图片描述

2.2小总结

在子类方法中或者通过子类对象访问成员时,遵循如下规则:

总之,成员变量的访问遵循就近原则,自己有则优先用自己的,否则就去父类中去找。成员方法没有同名时,在子类方法中或者通过子类对象访问方法时,则优先访问自己的,自己没有时
再到父类中找,如果父类中也没有则报错。

现在,如果子类中存在与父类中相同的成员时,那如何在子类中访问父类相同名称的成员呢?下面线

三、super关键字

由于某些场景的需要,子类和父类有时会出现相同名称的成员,此时如果我们想要在子类方法中去直接访问父类相同名称的成员是做不到的。所以,java提供了super关键字,以便我们能够访问父类相同成员。

请看下面代码的举例:

class Base{    int a;    int b;    public void print(){        System.out.println(a);        System.out.println(b);    }    public static void staticfunc(){        System.out.println("Base::staticfunc");    }}public class Derived extends Base{    int a = 30;    int b = 40;    public void print(){        System.out.println(a);        System.out.println(b);    }    public void method(){        int a = 10; // 为子类中的成员变量a赋值        int b = 20; // 为子类中的成员变量b赋值        System.out.println(super.a); // 这里访问的是父类中的成员变量a        System.out.println(a);       // 这里访问的就是子类中的成员变量a        super.print(); // 子类方法中调用父类的print函数        print();       // 子类方法中调用子类的print函数    }        public static void main(String[] args) {        Derived derived = new Derived();        derived.method();    }}

运行结果如下:
在这里插入图片描述

super关键字主要有三种用法:

super注意事项

第一点:使用类名去访问静态成员

这里我们需要要强调的是,如果我们想要访问父类的静态成员函数的话,我们直接用类名去访问父类中的父类成员方法即可。不建议使用super等引用去访问父类中静态成员函数。
在这里插入图片描述

第二点:super、this关键字只能在非静态成员方法中使用。

在这里插入图片描述
所有的静态成员都是不依赖于对象存在的,因为静态成员在类加载的时候就已经存在,并且在整个程序运行期间都可以被访问和使用。

四、子类构造方法

子类在创建对象时,优先调用父类的构造方法,最后再执行子类的构造方法(我们可以理解为现有父,后有子)。

首先,我们要知道,对象属性(成员变量)的初始化一定要调用构造函数。在子类对象构造完成之前会先帮助父类完成初始化。

我们直接看代码举例,请看:

class person{    public String name;    int age;    // 父类构造    public person(String name, int age) {        System.out.println("person(String name, int age)");        this.name = name;        this.age = age;    }}public class Student extends person{    int ID;    int record;    //子类构造    public Student(String name,int age,int ID,int record){        super(name,age); // 先完成父类成员变量的初始化        // 完成父类成员变量后再完成子类成员变量的初始化        this.ID = ID;        this.record = record;        System.out.println("Student(int ID,int record)");    }    public static void main(String[] args) {        Student st1 = new Student("Daming",18,123456,100);    }}

运行结果如下:
在这里插入图片描述

请请看下面这张图:

在这里插入图片描述

注意,父类构造函数调用结束后并没有完成父类对象的构造,这里帮助子类完成从父类那里继承过来的属性的初始化。

小总结

在子类构造方法中,并没有写任何关于基类构造的代码,但是在构造子类对象时,先执行基类的构造方法,然后执行子类的构造方法,因为:子类对象中成员是有两部分组成的,基类继承下来的以及子类新增加的部分 。肯定是先有父再有子,所以在构造子类对象时候 ,先要调用基类的构造方法,将从基类继承下来的成员构造完整,然后再调用子类自己的构造方法,将子类自己新增加的成员初始化完整。

注意点:

五、super和this

super和this都可以在成员方法中访问成员变量和其它成员函数,同时都可以作为构造函数的第一条语句且不可以同时存在。

相同点:

不同点:

六、再谈初始化

我们来看一下下面代码块在继承关系上的执行顺序:

class Person{    public String name;    int age;    static{        System.out.println("Person::static{}");    }    {        System.out.println("Person::{}");    }    // 父类构造    public Person(String name, int age) {        System.out.println("person(String name, int age)");        this.name = name;        this.age = age;    }}public class Student extends Person{    int ID;    int record;    static{        System.out.println("Student::static{}");    }        {        System.out.println("Student::{}");    }    //子类构造    public Student(String name,int age,int ID,int record){        super(name,age); // 先完成父类成员变量的初始化        // 完成父类成员变量后再完成子类成员变量的初始化        this.ID = ID;        this.record = record;        System.out.println("Student(int ID,int record)");    }    public static void main(String[] args) {        Student st1 = new Student("Daming",18,123456,100);        System.out.println("==========");        Student st2 = new Student("Daming",21,456789,150);    }}

执行结果如下:

在这里插入图片描述

通过上述代码我们可以得到一些结论:

好了,以上就是本文的全部内容。就到这里,再见啦友友们!!!

来源地址:https://blog.csdn.net/m0_74352571/article/details/132767447

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯