java中多态的详细分析

  介绍

这篇文章主要介绍了java中多态的详细分析,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。

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

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

继承是为了重用父类代码。两个类若存在是一个的关系就可以使用继承,同时继承也为实现多态做了铺垫。那么什么是多态呢?多态的实现机制又是什么?请看我一一为你揭开:

所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性

比如你是一个酒神,对酒情有独钟。某日回家发现桌上有几个杯子里面都装了白酒,从外面看我们是不可能知道这是些什么酒,只有喝了之后才能够猜出来是何种酒。你一喝,这是剑南春,再喝这是五粮液,再喝这是酒鬼酒…。在这里我们可以描述成如下:

酒=剑南春

酒b=五粮液

酒c=酒鬼酒

这里所表现的的就是多态的。剑南春,五粮液,酒鬼酒都是酒的子类,我们只是通过酒这一个父类就能够引用不同的子类,这就是多态,我们只有在运行的时候才会知道引用变量所指向的具体实例对象。

诚然,要理解多态我们就必须要明白什么是“向上转型”。在继承中我们简单介绍了向上转型,这里就在啰嗦下:在上面的喝酒例子中,酒(赢得)是父类,剑南春(JNC),五粮液(我们),酒鬼酒(JGJ)是子类。我们定义如下代码:

JNC=new, JNC ();

对于这个代码我们非常容易理解无非就是实例化了一个剑南春的对象嘛!但是这样呢?

酒=new JNC ();

在这里我们这样理解,这里定义了一个葡萄酒类型的一种,它指JNC对向象实例。由于JNC是继承与葡萄酒,所以JNC可以自动向上转型为葡萄酒,所以一个是可以指向JNC实例对象的。这样做存在一个非常大的好处,在继承中我们知道子类是父类的扩展,它可以提供比父类更加强大的功能,如果我们定义了一个指向子类的父类引用类型,那么它除了能够引用父类的共性外,还可以使用子类强大的功能。

但是向上转型存在一些缺憾,那就是它必定会导致一些方法和属性的丢失,而导致我们不能够获取它们。所以父类类型的引用可以调用父类中定义的所有属性和方法,对于只存在与子类中的方法和属性它就望尘莫及了——1 .

公共类酒{
  公共空间fun1 () {
  System.out.println(“葡萄酒的乐趣.....“);
  fun2 ();
  }
  
  公共空间fun2 () {
  System.out.println(“葡萄酒的Fun2…“);
  }
  }
  
  公开课JNC葡萄酒{延伸/* *
  * @desc子类重载父类方法
  *父类中不存在该方法,向上转型后,父类是不能引用该方法的
  * @param
  * @return无效
  */公共空间fun1(字符串){
  System.out.println (JNC的“Fun1…“);
  fun2 ();
  }/* *
  *子类重写父类方法
  *指向子类的父类引用调用fun2时,必定是调用该方法
  */公共空间fun2 () {
  System.out.println (JNC的“Fun2…“);
  }
  }
  
  公共类测试{
  公共静态void main (String [] args) {
  葡萄酒新JNC=();
  a.fun1 ();
  }
  }
  -------------------------------------------------
  输出:
  葡萄酒的乐趣.....
  JNC的Fun2…

从程序的运行结果中我们发现,a.fun1()首先是运行父类中葡萄酒的fun1(),然后再运行子JNC中类的Fun2 ()。

分析:在这个程序中子JNC重类载了父类酒的方法fun1(),重写Fun2(),而且重载后的fun1(字符串)与fun1()不是同一个方法,由于父类中没有该方法,向上转型后会丢失该方法,所以执行JNC的葡萄酒类型引用是不能引用fun1(字符串)方法。而子JNC重类写了Fun2(),那么指JNC的酒向引用会调用JNC中Fun2()方法。

java中多态的详细分析