java 三大特性之多态

 面向对象编程有三大特性:封装、继承、多态。

      封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据。对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法

      继承是为了重用父类代码。两个类若存在IS-A的关系就可以使用继承。,同时继承也为实现多态做了铺垫。那么什么是多态呢?多态的实现机制又是什么?

         多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)
实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
多态的作用:消除类型之间的耦合关系。

动态绑定的三大要素:1.继承; 2.方法的重写;3.类的“向上造型”。

 继承:在多态中必须存在有继承关系的子类和父类。

         重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。

         向上造型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。

         只有满足了上述三个条件,我们才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而达到执行不同的行为。

      
           举个例子说明一下,假设当我们十分口渴时,回到家,看见有好几个黑色封闭杯子,只知道里面都是果汁,只是不知道是西瓜汁啊,葡萄汁还是橙汁。所以我们得喝,得去品尝之后,才能根据它的特有味道推测出它是什么果汁。。
  这里所表现的的就是多态。西瓜汁,葡萄汁,橙汁都是果汁的子类,我们只是通过果汁这一个父类就能够引用不同的子类,这就是多态——我们只有在运行的时候才会知道引用变量所指向的具体实例对象。

         

   class Juice{
    	public void fun(){
    		System.out.println("果汁的味道");
    		fun2();
    	}
       public void fun2(){
    	   System.out.println("果汁的fun");
       }
    }
    
    class Orangejuice extends juice{

		public void fun(String a) {
//			子类重载父类方法,父类中不存在该方法,向上转型后,父类是不能引用该方法的

			// TODO Auto-generated method stub
		System.out.println("橙汁的味道");
		fun2();
		}

		public void fun2() {
//			子类重写父类方法指向子类的父类引用调用fun2时,必定是调用该方法
          System.out.println("橙汁的fun");
			// TODO Auto-generated method stub
		}
    		
    	}
    	
    
public class TestDemo {
 public static void main(String[] args) {
	Juice j=new Orangejuice();
	j.fun();
}
}


从程序的运行结果中我们发现,j.fun1()首先是运行父类Juice中的fun1().然后再运行子类Orangejuice中的fun2()。

      分析:在这个程序中子类Orangejuice重载了父类juice的方法fun1(),重写fun2(),而且重载后的fun1(String a)与 fun1()不是同一个方法,由于父类中没有该方法,向上转型后会丢失该方法,所以执行OrangeJuice的juice类型引用是不能引用fun1(String a)方法。而子类Orangejuice重写了fun2() ,那么指向Orangejuice的Juice引用会调用Jrangejuice中fun2()方法。

      所以对于多态我们可以总结如下:

      指向子类的父类引用由于向上转型了,它只能访问父类中拥有的方法和属性,而对于子类中存在而父类中不存在的方法,该引用是不能使用的,尽管是重载该方法。若子类重写了父类中的某些方法,在调用该些方法的时候,必定是使用子类中定义的这些方法(动态连接、动态调用)。

而运行时多态是动态的,它是通过动态绑定来实现的,也就是我们所说的多态性。

该实例是有关多态的经典例子,很经典,望多思考。摘自:http://blog.csdn.net/thinkGhoster/archive/2008/04/19/2307001.aspx

猜你喜欢

转载自blog.csdn.net/qq_38361756/article/details/82719659