对于多态,可以总结以下几点:
一、使用父类类型的引用指向子类的对象;
二、该引用只能调用父类中定义的方法和变量;
三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)
四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。
另转载:
多态是通过:
1 接口 和 实现接口并覆盖接口中同一方法的几不同的类体现的
2 父类 和 继承父类并覆盖父类中同一方法的几个不同子类实现的.
一、基本概念
多态性:发送消息给某个对象,让该对象自行决定响应何种行为。
通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。
java 的这种机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。
- 如果a是类A的一个引用,那么,a可以指向类A的一个实例,或者说指向类A的一个子类。
- 如果a是接口A的一个引用,那么,a必须指向实现了接口A的一个类的实例。
如果是父类引用指向子类对象这种形式,有以下几种情况:
如果子类重写了父类的某个方法,那么此时调用的是子类重写的方法
如果子类没有重写父类的某个方法,那么此时调用的是父类中的方法
如果子类新增了父类中不存在的方法,那么这个父类引用是不能调用这个仅在子类中存在的方法中,因为子类对象自动向上转型为了父类对象
如果子类与父类有同名的成员变量和静态变量,那么由于子类自动向上转型为父类对象,此时调用father.a,那么输出的必然是父类的成员变量和静态变量,这里不存在子类覆盖父类同名变量这一说,因为这里本身可以看做是一个父类对象
如果是Son son=new Son(),那么这就是实实在在的一个子类对象,那么son.a和son.b,这样就会覆盖父类的同名变量,输出的是子类的成员变量a和静态成员变量b,如果子类中没有同名变量,那么son.a和son.b调用的是父类的a和b。换句话说,也就是子类可以继承父类的成员变量和静态变量,同时可以覆盖父类的成员变量和静态变量