一、多态的定义:
多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。
在运行时,可以通过指向基类的引用,来调用实现派生类(子类)中的方法。
二:多态的好处:
使用多态,我们可以很好的完成代码的解耦和工作,加强代码的可扩展性,是代码更加灵活,在不改变原有接口方法的情况下简化流程等,总结一下就是:
减耦合
增强可以替换性
可扩展性
灵活性等…
从代码看,我们可以省去很多很多重载的方法。
三、实现多态的三个条件(前提条件,向上转型、向下转型):
1、继承的存在;(继承是多态的基础,没有继承就没有多态)
2、子类重写父类的方法。(多态下会调用子类重写后的方法)
3、父类引用变量指向子类对象。(涉及子类到父类的类型转换)
JAVA引用变量有两个类型:一个是编译时的类型,一个是运行时的类型,编译时的类型由声明该变量时使用的类型决定,运行时的类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致,就会出现所谓的多态(Polymorphism)。这和C++里的类似。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | class BaseClass //父类 { public int book = 6 ; public void base() { System.out.println( "父类的普通方法" ); } public void test() { System.out.println( "父类的被覆盖的方法" ); } } public class SubClass extends BaseClass { //重新定义一个book实例属性覆盖父类的book实例属性 public String book = "Hello!" ; public void test() { //也叫方法的重写或方法的覆盖 System.out.println( "子类覆盖父类的方法" ) } public void sub() { System.out.println( "子类的普通方法" ); } //下面给出主方法的入口 public static void main(String[ ] args) { //下面编译时类型和运行时类型完全一样,因此不存在多态 BaseClass bc = new BaseClass(); //创建父类对象 //输出6 System.out.println(bc.book); //下面两次调用将执行BaseClass(父类)的方法 bc.base(); bc.test(); //下面编译时类型和运行时类型完全一样,因此不存在多态 SubClass sc = new SubClass(); //创建子类对象 //输出"Hello!" System.out.println(sc.book); //下面调用将执行从父类继承到的base方法 sc.base(); //下面调用将执行从当前类的test方法 sc.test(); //下面编译时类型和运行时类型不一样,多态发生 BaseClass ploymophicBc = new SubClass(); //输出6----表明访问的是父类属性 System.out.println(ploymophicBc.book); //下面调用将执行从父类继承到的base方法 ploymophicBc.base(); //下面调用将执行从当前类的test方法 ploymophicBc.test(); //因为ploymophicBc的编译类型是BaseClass,BaseClass 类没有提供资金SUBYYIF //所以下面代码编译时会出现错误 //ploymophicBc.sub(); } } |