• 面向对象三大特征之一:继承


             类可以有两种重要的成员:成员变量和方法。子类的成员中有一部分是子类自己声明、定义的,另一部分是从它的父类继承的。那么,

            什么叫继承呢?所谓子类继承父类的成员变量作为自己的一个成员变量,就好像它们是在子类中直接声明一样,可以被子类中自己定义的任何实例方法操作,也就是说,一个子类继承的成员应当是这个类的完全意义的成员,如果子类中定义的实例方法不能操作父类的某个成员变量,该成员变量就没有被子类继承;所谓子类继承父类的方法作为子类中的一个方法,就像它们是在子类中直接定义了一样,可以被子类中自己定义的任何实例方法调用。

     

    使用继承

            编写父类

                    [访问修饰符] class Pet {     //公共的属性和方法 }

            编写子类,继承父类

                    [访问修饰符] class Dog extends Pet {     //子类特有的属性和方法 }

    继承是Java中实现代码重用的重要手段之一。Java中只支持单根继承,即一个类只能有一个直接父类
     

    案例:

    1. package cn.bdqn.demo04;
    2. public class Pet {
    3. private String name;
    4. private int health;
    5. private int love;
    6. // 添加构造方法
    7. public Pet() {
    8. }
    9. public Pet(String name, int health, int love) {
    10. this.name = name;
    11. this.health = health;
    12. this.love = love;
    13. }
    14. public String getName() {
    15. return name;
    16. }
    17. public void setName(String name) {
    18. this.name = name;
    19. }
    20. public int getHealth() {
    21. return health;
    22. }
    23. public void setHealth(int health) {
    24. this.health = health;
    25. }
    26. public int getLove() {
    27. return love;
    28. }
    29. public void setLove(int love) {
    30. this.love = love;
    31. }
    32. public void print() {
    33. System.out.println("宠物信息:昵称:" + this.getName() + ",健康值:"
    34. + this.getHealth() + ",亲密度:" + this.getLove());
    35. }
    36. }
    1. package cn.bdqn.demo04;
    2. public class Cat extends Pet {
    3. // 定义Cat类独有的属性
    4. private String color;
    5. public Cat() {
    6. super();// 调用父类Pet类里的无参构造方法
    7. }
    8. public Cat(String name, int health, int love, String color) {
    9. super(name, health, love);
    10. this.color = color;
    11. }
    12. public String getColor() {
    13. return color;
    14. }
    15. public void setColor(String color) {
    16. this.color = color;
    17. }
    18. }
    1. package cn.bdqn.demo04;
    2. public class Dog extends Pet {
    3. //strain属性是DOg类里独有的属性,其它类没有,所以要在Dog类里定义
    4. private String strain;
    5. public Dog() {
    6. }
    7. public Dog(String name, int health, int love, String strain) {
    8. super(name, health, love);
    9. this.strain = strain;
    10. }
    11. public String getStrain() {
    12. return strain;
    13. }
    14. public void setStrain(String strain) {
    15. this.strain = strain;
    16. }
    17. }
    1. package cn.bdqn.demo04;
    2. public class Penguin extends Pet {
    3. // 定义Penguin类里独有的属性
    4. private String sex;
    5. public Penguin() {
    6. super();// super表示父类Pet对象,所以这个地方表示调用父类的无参构造方法
    7. }
    8. public Penguin(String name, int health, int love, String sex) {
    9. super(name, health, love);// 表示调用父类Pet类的有参构造方法
    10. this.sex = sex;
    11. }
    12. public String getSex() {
    13. return sex;
    14. }
    15. public void setSex(String sex) {
    16. this.sex = sex;
    17. }
    18. }
    1. package cn.bdqn.demo04;
    2. public class Test {
    3. public static void main(String[] args) {
    4. // 创建Dog类对象
    5. Dog dog1 = new Dog("旺财", 99, 99, "金毛");
    6. //在Dog类中没有setName()方法,但是DOg类对象dog1是可以调用,因为Dog类继承了Pet类,所以dog1可以调用父类Pet类里的setName()方法
    7. dog1.setName("来福");
    8. dog1.print();
    9. //创建Penguin类对象
    10. Penguin penguin1 = new Penguin("QQ", 98, 100, "公");
    11. penguin1.setHealth(100);
    12. penguin1.print();
    13. //创建Cat类对象
    14. Cat cat1 = new Cat("Tom", 100, 80, "蓝色");
    15. cat1.print();
    16. //hashCode()在Cat里没有、在Cat的父类Pet类里也没有,hashCode()方法存在于Object类中,Object类是Pet类的默认父类,所以Cat类对象可以使用Pet类里的方法,也可以使用Pet类的父类里的方法
    17. //声明一个类,如果没有指定其父类是谁,系统会让此类默认去继承Object类
    18. int num =cat1.hashCode();
    19. System.out.println(num);//1694203642
    20. }
    21. }

     

    super

    子类访问父类成员

            访问父类构造方法

                    super();     super(name);

            访问父类属性

                    super.name;

            访问父类方法

                    super.print();

    super关键字: 

      (1)使用super关键字,super代表父类对象

    (2)在子类构造方法中调用且必须是第一句

    (3)不可以访问父类中定义为private的属性和方法

    super关键字来访问父类的成员

            super只能出现在子类的方法和构造方法中

            super调用构造方法时,只能是第一句

            super不能访问父类的private成员

            继承条件下构造方法的调用规则

                    子类构造方法没有通过super显式调用父类的有参构造方法,也没通过this显式调用自身其他构造方法

                            系统默认调用父类的无参构造方法

                    子类构造方法通过super显式调用父类的有参构造方法

                            执行父类相应构造方法,而不执行父类无参构造方法

                    子类构造方法通过this显式调用自身的其他构造方法,在相应构造方法中应用以上两条规则

    子类继承父类的什么?

            继承public和protected修饰的属性和方法,不管子类和父类是否在同一个包里

            继承默认权限修饰符修饰的属性和方法,但子类和父类必须在同一个包里

    案例:

    1. package cn.bdqn.demo05;
    2. public class Father {
    3. private String name;
    4. private int age;
    5. public double height;
    6. public Father() {
    7. super();//调用Father类的父类Object类的无参构造方法
    8. System.out.println("我是Father类里的无参构造方法");
    9. }
    10. public Father(String name, int age,double height) {
    11. super();//调用Father类的父类Object类的无参构造方法
    12. this.name = name;
    13. this.age = age;
    14. this.height = height;
    15. System.out.println("我是Father类里的有参构造方法");
    16. }
    17. public String getName() {
    18. return name;
    19. }
    20. public void setName(String name) {
    21. this.name = name;
    22. }
    23. public int getAge() {
    24. return age;
    25. }
    26. public void setAge(int age) {
    27. this.age = age;
    28. }
    29. private void test(){
    30. System.out.println("我是Father类里的私有test()方法");
    31. }
    32. public void print(){
    33. System.out.println("我是Father类里的公共print()方法");
    34. }
    35. }

    1. package cn.bdqn.demo05;
    2. public class Son extends Father {
    3. private double money;
    4. public Son() {
    5. super();//调用的Son类的父类Father类里的无参构造方法
    6. System.out.println("我是Son类里的无参构造方法");
    7. }
    8. public Son(String name, int age, double height, double money) {
    9. super(name, age, height);//调用Son类的父类Father类里的有参构造方法
    10. this.money = money;
    11. System.out.println("我是Son类里的有参构造方法");
    12. }
    13. public double getMoney() {
    14. return money;
    15. }
    16. public void setMoney(double money) {
    17. this.money = money;
    18. }
    19. public void printInfo(){
    20. //输出父类里的属性
    21. //super不能直接调用父类里被private修饰的属性
    22. // System.out.println(super.name);
    23. // System.out.println(super.age);
    24. System.out.println(super.height);
    25. //super不能直接调用父类里被private修饰的方法
    26. // super.test();
    27. super.print();
    28. }
    29. }

    1. package cn.bdqn.demo05;
    2. public class Test {
    3. public static void main(String[] args) {
    4. // 使用Son类的无参构造方法创建对象
    5. Son son1 = new Son();
    6. //创建Son类对象一共调用了几次构造方法??? 3次
    7. System.out.println("----------------");
    8. Son son2 = new Son("张三", 22, 173, 999);
    9. son2.printInfo();
    10. }
    11. }

     不能被继承的父类成员

            private成员

            子类与父类不在同包, 使用默认访问权限的成员

            构造方法

    何时使用继承?

    继承与真实世界类似

            只要说“猫是哺乳动物”,猫的很多属性、行为就 不言自明了

            藏獒是一种狗

    符合is-a关系的设计使用继承

    继承是代码重用的一种方式

    将子类共有的属性和行为放到父类中

  • 相关阅读:
    WPF 控件专题 ListView 样式(斑马线)
    (76)MIPI DSI LLP介绍(十六)
    linux 查看内存大小
    【Python脚本进阶】1.1、基础环境
    飞行员需要新的策略来解决资金被困、外汇危机
    51单片机烟雾报警器mq2烟雾报警ADC0832采集实践制作DIY- GC0026-烟雾报警器
    我们在SqlSugar开发框架中,用到的一些设计模式
    使用并查集实现查找无向图的连通分量和求解有向图的强连通分量
    docker 配置mongoDB
    Spring boot 启动流程及外部化配置
  • 原文地址:https://blog.csdn.net/qq_51810428/article/details/126148611