饺子泡牛奶

V1

2022/03/27阅读:44主题:橙心

继承与多态

一、关于继承

  1. 什么是继承?

继承(inheritance):它是Java程序设计中的一项核心技术。它的基本思想是可以基于已有的类创建新的类,继承已存在的类就是复用这些类的方法,而且可以增加一些新的方法和字段,使类能够适应新的情况。

  1. 如何使用继承?

关键字extends表示继承,表明正在构造的新类派生与一个已存在的类。

  1. 类、超类和子类
  • 已存在的类被称为超类基类父类

  • 新类被称为子类派生类孩子类

  • 子类比超类拥有的功能更多

二、继承的实现

  • 超类实现:
/* *
 * 定义一个超类,有自己的方法和字段。
 */


public class Parent {

    String name = "parent";
    
    public String getName() {
        return this.name;
    }
}
  • 子类继承:
/* *
 * 定义一个子类,使用extends关键字继承超类。
 * 子类有自己的特有实现。
 * 在子类方法中实现调用超类方法。
 */


public class Child extends Parent {

   public void getParentName(){
       // 调用超类getName()方法
       System.out.println(getName());
   }

    public static void main(String[] args) {
        Child child = new Child();
        child.getParentName(); 
        // print "parent"
    }
}
  • super关键字:
/* *
 * 定义一个超类,有自己的方法。
 */


public class Parent {

    public void hobby() {
        System.out.println("sing");
    }
}
/* *
 * 定义一个子类,使用extends关键字继承超类。
 * 在子类中,重写超类已有方法。
 * 使用super关键字调用超类方法。
 */


public class Child extends Parent {

    @Override
    public void hobby() {
        System.out.println("run");
    }

    public void getParentHobby() {
        // 显式调用超类方法
        super.hobby();
    }

    public static void main(String[] args) {
        Child child = new Child();
        // 调用重写超类的方法
        child.hobby();
        child.getParentHobby();
        // print run sing
    }
}
  • 注意事项:

    • super不是一个对象的引用,它只是一个指示编译器调用超类方法的特殊关键字。

    • 使用super调用构造器的语句必须是子类构造器的第一条语句。

    • Java不支持多重继承

    • 在覆盖一个方法的时候,子类方法不能低于超类方法的可见性。

三、关于多态

  1. 什么是多态?

多态(polymorphism):一个对象变量可以指示多种实际类型的现象称为多态。即同一个行为具有多个不同表现形式或形态的能力。

  1. 如何使用多态?
  • 前提:必须有继承关系

  • 格式:

超类类型 变量名 = new 子类类型( );

四、多态的实现

  • 超类实现:
/* *
 * 定义一个超类,有自己的成员变量及方法
 */


public class People {

    String name = "people";

    public void eat() {
        System.out.println("吃饭");
    }
}
  • 子类实现:
/* *
 * 定义一个子类,使用extends关键字继承超类。
 * 在子类中,重写超类已有方法。
 * 子类有自己特有的成员变量及方法。
 */


public class Student extends People {

    String name = "student";

    @Override
    public void eat() {
        System.out.println("学生爱吃汉堡");
    }

    public void study() {
        System.out.println("学习");
    }
}

  • 多态使用:
/* *
 * 使用向上及向下转型调用超类方法。
 */


public class Sample {

    public static void main(String[] args) {
        // 多态本身就是向上转型过的过程。
        
        // 1. 向上转型格式:超类类型 变量名=new 子类类型();
        // 适用场景:超类的功能就能完成相应的操作。
        People student = new Student();
        System.out.println(student.name);
        // print people

        //  注意:在使用多态后的超类引用变量调用方法时,会调用子类重写后的方法。
        student.eat();
        // 学生爱吃汉堡


        // 2. 向下转型格式:子类类型 变量名=(子类类型) 超类类型的变量;
        // 适用场景:当要使用子类特有功能时,使用向下转型。
       Student student1 = (Student) student;
        System.out.println(student1.name);
        // print student
        student1.study();
        // print 学习
    }
}
  • 多态解析过程:

在运行时能够自动地选择适当的方法,称为动态绑定

  1. 首先,虚拟机获取实际类型的方法表;

  2. 接下来,虚拟机查找签名的类;

  3. 最后,虚拟机调用这个方法。

五、继承设计技巧

  1. 将公共操作和字段放在超类中。

  2. 不要使用protected关键字修饰字段:由于子类集合无限制的,任何派生的子类都能访问,并且同一个包的类都能访问该修饰符的字段,从而破坏了封装性

  3. 使用继承实现“is-a”的关系。

  4. 除非所有继承的方法都有意义,否则不要使用继承。

  5. 在覆盖方法时,不要改变预期的行为

  6. 使用多态,不要使用类型信息。(使用多态或接口实现的代码比使用多个类型检测的代码更易于维护和拓展。)


“-------怕什么真理无穷,进一寸有一寸的欢喜。”

微信公众号搜索:饺子泡牛奶

分类:

后端

标签:

Java

作者介绍

饺子泡牛奶
V1