• 【JAVA】继承


    1.啥是继承

    2.父类成员访问

    3.super关键字(VS this)

    4.父类构造方法

    什么是继承?

    继承在生活中有很多情况,比如继承了你爹的遗产,或者是你遗传了你爸爸的基因,简单来说你就拥有了你爸爸的一部分,而代码中的继承也大同小异,

    比如,写两个类,分别是狗类和鸟类

    1. class Dog{
    2. public String name;
    3. public int age;
    4. public Dog(String name, int age) {
    5. this.name = name;
    6. this.age = age;
    7. }
    8. public void eat(){
    9. System.out.println(name + " 正在吃狗粮");
    10. }
    11. public void swim(){
    12. System.out.println(name + " 正在狗刨游泳");
    13. }
    14. }
    15. class Bird{
    16. public String name;
    17. public int age;
    18. public Bird(String name, int age) {
    19. this.name = name;
    20. this.age = age;
    21. }
    22. public void eat(){
    23. System.out.println(name + " 正在吃虫子");
    24. }
    25. public void fly(){
    26. System.out.println(name + " 正在飞");
    27. }
    28. }

    狗和鸟都是动物,从两个类来看,它们都有名字name,年龄age,并且都会eat吃这个方法,name,age,eat这些都是它们的共性,所以我们可以把它们的共性抽取出来放在Animals类里面,Animals是动物,而鸟和狗从属于Animals,这就出现了包含关系,所以Animals中的eat吃可以被鸟和狗继承,而在代码中的表现就是,鸟和狗继承了Animals后,就拥有了Animals里的eat,而不用再单独给猫狗类分别写eat,当然,Animals中的成员变量也可以被继承

    实现继承关系后(相对而言)

    Animals类被称为父类/超类/基类

    Dog类和Bird类被称为子类/派生类

    我们用extends关键字来继承

    1. class Animals{
    2. public String name;
    3. public int age;
    4. public void eat(){
    5. System.out.println(name + "正在吃饭");
    6. }
    7. }
    8. class Dog extends Animals{
    9. public Dog(String name, int age) {
    10. this.name = name;
    11. this.age = age;
    12. }
    13. public void swim(){
    14. System.out.println(name + " 正在狗刨游泳");
    15. }
    16. }
    17. class Bird extends Animals{
    18. public Bird(String name, int age) {
    19. this.name = name;
    20. this.age = age;
    21. }
    22. public void fly(){
    23. System.out.println(name + " 正在飞");
    24. }
    25. }
    26. public class Demo1 {
    27. public static void main(String[] args) {
    28. Dog dog = new Dog("狗子",3);
    29. Bird bird = new Bird("小鸟",2);
    30. dog.eat();
    31. bird.eat();
    32. }
    33. }

    从代码来看,狗和鸟继承Animals类后,不需要再写父类里有的成员(name,age,eat)

    继承的本质就是:共性的抽取,实现对代码的复用


    访问父类的成员

            1.在子类中访问父类的成员变量

    (1).父类变量与子类变量不重名

    (2).父类和子类变量重名

     父类和子类中如果出现重名变量,则会优先访问子类的变量

    那要是非要在重名的情况下访问父类的变量,则用super关键字来进行访问

     用super就可以访问到父类的重名变量

            总结:成员变量访问遵循就近原则,自己有优先自己的,如果没有则向父类中找。如果访问的变量父类与子类都没有,则编译错误


            2.在子类中访问父类的成员方法

    (1).子类方法与父类方法不重名

    1. class Base{
    2. public void methodA(){
    3. System.out.println("父类方法");
    4. }
    5. }
    6. class Derived extends Base{
    7. public void methodB(){
    8. System.out.println("子类方法");
    9. }
    10. public void methodC(){
    11. methodA();
    12. methodB();
    13. }
    14. }
    15. public class Demo2 {
    16. public static void main(String[] args) {
    17. Derived derived = new Derived();
    18. derived.methodC();
    19. }
    20. }

    总结:成员方法没有同名时,在子类方法中或者通过子类对象访问方法时,则优先访问自己的,自己没有时再到父类中找,如果父类中也没有则报错。

    (2).子类方法与父类方法重名

     与访问重名的父类变量一样,会优先访问子类里的重名方法

    子类方法可以与父类方法实现方法重载,代码会根据重载方法的参数来实现对应方法

     同样的,如果我们非要访问父类的重名方法也同样是调用super关键字来访问

     

             总结:

    通过子类对象访问父类与子类中不同名方法时,优先在子类中找,找到则访问,否则在父类中找,找到则访问,否则编译报错。

    通过派生类对象访问父类与子类同名方法时,如果父类和子类同名方法的参数列表不同(重载),根据调用方法适传递的参数选择合适的方法访问,如果没有则报错;

    不能在非静态的方法里访问静态的成员方法,如果访问的方法是静态的,子类方法,得先创建子类对象,调用对象来访问,而访问静态的父类方法,可以用类名来访问

     


    super关键字

    super关键字,该关键字主要作用:在子类方法中访问父类的成员。

    【注意事项】

    1. 只能在非静态方法中使用

    2. 在子类方法中,访问父类的成员变量和方法。

     在上面的代码调用过super作为示例,这里不过多介绍


    父类构造方法

    父子父子,先有父再有子,即:子类对象构造时,需要先调用基类构造方法,然后执行子类的构造方法。

    1. class A{
    2. int a;
    3. int b;
    4. public A(int a, int b) {
    5. this.a = a;
    6. this.b = b;
    7. }
    8. public void methodA(){
    9. System.out.println("这是父类的成员方法");
    10. }
    11. }
    12. class B extends A{
    13. public B(int a, int b) {
    14. super(a, b);
    15. }
    16. int c;
    17. int d;
    18. public void methodB(){
    19. System.out.println("这是子类的成员方法");
    20. }
    21. }

  • 相关阅读:
    从实战出发带你搞懂AXI4 (一、AXI4协议解析)
    英语——分享篇——每日200词——2201-2400
    python项目在麒麟V10上无法启动rabbitmq的问题记录
    【华为OD机试真题 python】数据分类【2022 Q4 | 200分】
    操作系统的“冷板凳”要坐多久?万字长文解读16年开源老兵的坚持
    字节一面,面试官问我Vue3源码,我说……
    Hive DML常见操作
    ROS1云课→09功能包小定制(CLI命令行接口)
    基于springboot的ShardingSphere5.2.1的分库分表的解决方案之复合分片算法的实现之分库分表的实现(四)
    Linux进程概念
  • 原文地址:https://blog.csdn.net/qq_61862008/article/details/126846756