1、什么是多态

多态指同一个实体同时具有多种形式。它是面向对象程序设计的一个重要特征,指对象的多种形态。
多态的作用:多态提高了程序的可扩展性和可维护性。

2、满足多态的条件

1、有继承关系
2、有方法重写
3、父类的引用指向子类对象
Animal a = new Dog();
左边是父类的引用,右边是子类的对象;

3、多态的特点

3.1 向上转型

本质:父类的引用指向子类的对象,即 Animal a = new Dog();

  • 可以调用父类的所有成员(除私有方法和私有属性),包括子类没有的方法
  • 不能调用子类特有的成员
  • 对于方法调用,编译看左边,运行看右边
  • 对于变量调用,编译看左边,运行看左边

总结:可以调用父类除私有外所有属性和方法,如果子类重写了相同的方法,则调用子类的方法。

父类的所有属性和方法(除私有)+ 子类的重写方法

下面看代码示例:
定义一个父类 Animal,里面定义了一些私有属性、私有方法和特有方法

class Animal{
    public String name = "我是动物";
    private String num = "66";	//私有属性
    public static void type(){
        System.out.println("我是父类的静态方法");
    }
    Animal(){
        System.out.println("我是Animal构造器");
    }
    public void eat(){
        System.out.println("动物们要吃饭了");
    }
    public void sum(){	//未被重写的特有方法
        System.out.println("总共有66只动物");
    }
    private void hello(){	//私有方法
        System.out.println("动物们好");
    }
}
 

定义一个子类 Dog,里面定义了一些子类的属性和特有方法,以及重写了父类的 eat 方法

class Dog extends Animal{
    public String name = "我是小狗";
    public String age = "6";	
    private String color = "yellow";
    Dog(){
        System.out.println("我是Dog构造器");
    }
    @Override
    public void eat() {
        System.out.println("小狗饿饿,要饭饭");
    }
    public void run() {	//父类没有的方法
        System.out.println("小狗跑得快");
    }
}
 

下面是主函数:

public class polymorphic {
    public static void main(String[] args) {
        Animal a = new Dog();
        System.out.println(a.name); //调用的是父类的name
        a.eat();    // 调用的是子类重写的方法
        a.sum();    //正常调用父类的方法
//      System.out.println(a.age);报错,不能使用子类特有的属性
//      a.run();报错,不能使用子类特有的方法
    }
}
 
 

运行结果:

3.2 向下转型

Animal a = new Dog(); Dog d = (Dog) a;
一个已经向上转型的子类对象,将父类引用转为子类引用

1、只能强制转换父类的引用,不能强制转换父类的对象
2、要求父类的引用必须指向的是当前目标类型的对象
3、当向下转型后,可以调用子类类型中所有的成员

4、初始化顺序

静态变量和静态代码块在类加载的时候执行,实例化对象先声明并实例化变量再执行构造函数

类初始化的顺序:
1、父类的静态变量和静态代码块
2、子类的静态变量和静态代码块
3、main方法
4、父类的变量和非静态代码块
5、父类的构造函数
6、子类的变量和非静态代码块
7、子类的构造函数