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、子类的构造函数