你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

java多态的理解

2021/11/26 19:09:49

一、多态是什么

  1. 面向对象的三大特性是封装、继承、多态。
  2. 多态(polymorphic)的定义:父类引用变量可以指向子类对象,允许不同类的对象可以调用同一个方法,即同一个方法可以根据调用对象的不同而有不同的实现形式。
  3. 实现多态的技术是动态绑定(dynamic binding),是指在方法的执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
  4. 多态的作用:消除类型之间的耦合关系。
  5. 现实中,关于多态的例子有很多。比方说按下 ctrl+F 键这个动作,如果当前在如果当前在 Word 下弹出的就是 Word 的查找和替换功能;在 vscode中弹出的就是 vscode的查找和替换功能。同一个事件在不同的对象中被执行会产生不同的结果。

二、多态存在的三个必要条件

     1. 继承;
     2. 重写;
     3. 父类引用指向子类对象。

三、多态的特性

  1. 可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
  2. 可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。
  3. 接口性(interface-ability)。多态是父类通过方法签名,向子类提供了一个共同接口,由子类来完成或者覆盖它而实现的。比如说定义一个父类Shape,规定了两个实现多态的接口方法,computeArea()以及computeVolume()。子类,如Circle和Sphere为了实现多态,就可以完成或者覆盖这两个接口方法。

四、练习题

public class Test {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Father a1 = new Father();
        Father a2 = new Son();
        Son b = new Son();
        Grandson1 c = new Grandson1();   
        Grandson2 d = new Grandson2();   
        			
        System.out.println(a1.show(a2)); // It's Father and Father
        System.out.println(a1.show(b)); // It's Father and Father
        System.out.println(a1.show(c));  // It's Father and Father
        System.out.println(a1.show(d));  // It's Father and Grandson2
        
        System.out.println(a2.show(a1));  // It's Son and Father
        System.out.println(a2.show(b));  // It's Son and Father
        System.out.println(a2.show(c));  // It's Son and Father
        System.out.println(a2.show(d)); // It's Father and Grandson2
        
        System.out.println(b.show(b));  //  It's Son and Son
        System.out.println(b.show(a1));  // It's Son and Father
        System.out.println(b.show(a2));  // It's Son and Father
        System.out.println(b.show(c));  // It's Son and Son
        System.out.println(b.show(d));   // It's Father and Grandson2
	}
}
class Father {  
    public String show(Grandson2 obj){  
           return ("It's Father and Grandson2");  
    }   
    public String show(Father obj){  
           return ("It's Father and Father");  
    }   
}   
class Son extends Father{  
        public String show(Son obj){  
               return ("It's Son and Son");  
        }  
        public String show(Father obj){  
               return ("It's Son and Father");  
        }   
}  
class Grandson1 extends Son{}   
class Grandson2 extends Son{}

解析:

        a1和a2被定义为Father类,可以使用Father类的show(Grandson2)和show(Father)两个方法;其中,a2是多态实现的,也可以使用Son类的show(Son)和show(Father)方法,并且重写了Father类的show(Father)方法;b是Son类,继承了Father类,可以使用Father类的show(Grandson2)和show(Father)两个方法以及Son类的show(Son)和show(Father)方法,并且重写了Father类的show(Father)方法