先放死板的说明:
一、使用父类类型生成子类的对象;
二、该引用只能调用父类中定义的方法和变量;
三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)
四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。
多态的3个必要条件:
1.继承 2.重写 3.父类引用指向子类对象。
再放简单易懂的代码:
首先生成一个父类
public class Father { public void func1(){ //这是等下我们调用的方法 func2(); } public void func2() { //下面的子类重写了这个方法,当我调用的时候,这个方法不再生效,转而调用子类的方法 System.out.printf("父类的第二个方法"); }
然后生成一个子类继承父类
public class Child extends Father { public void func1(int i) { //为什么不调用这个方法呢,实际上他跟父类的方法不同。这个有参数 System.out.printf("子类第一个方法"); } public void func2() { System.out.printf("子类的第二个方法"); } }
main函数中的写法
Father bianliangA = new CHild();
public static void main(String addd []){ Father bianliangA = new Child(); bianliangA.func1(); }
那么该程序将会打印出什么样的结果呢? 很显然应该是“子类的第二个方法”
子类Child继承了父类Father,并重载了父类的func1()方法,重写了父类的func2()方法。
重载后的 func1(int i)和func1()不是同一个方法,由于父类中没有func1(int i),父类的引用child就不能调用func1(int i)。
而子类重写了func2()方法,那么父类类型的引用child在调用该方法时将会调用子类中重写的func2()