A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 秦松 中级黑马   /  2012-10-19 21:14  /  2232 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我们知道多态是父类引用指向子类对象,
那么这个多态是相对于父类说的呢还是相对于子类的呢?
还有多态提高了程序的扩展性,主要体现在哪?为什么那么说呢?

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

10 个回复

倒序浏览
希望能给起到点帮助
多态使用技巧:
1.实例方法
   编译时:查看父类(父接口)中是否存在调用的方法
   运行时: 调用的是子类(实现类)中重写的方法
  
  2.实例属性
   编译时:查看父类(接口)中是否存在这样的属性
   运行时: 得到的是父类(接口)中的实例属性.
  3.类方法
   编译时:查看父类(父接口)中是否存在调用的方法
   运行时: 调用的是父类中的类方法

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
(1)多态的体现:
      父类的引用指向了自己的子类对象:Animal c-->new Cat(); //父类变量c指向了子类对象Cat()
      ##也可以理解为
      父类的引用接收了自己的子类对象:Ainmal c = new Cat(); c = Cat();
   
   (2)多态的前提:
      1.必须有继承或者实现关系 class Cat extends Animal
      2.前提要存在覆盖 (只有子类重写了父类的方法,才可以在调用时体现出多态)

   (3)多态的好处和弊端:
      好处:提高了程序的扩展性(以后再有对象建立仍然可以直接将对象作为实际参数传递给方法),同时使代码简练
      弊端:只能使用父类的引用访问父类中的成员(也就是说只能使用所有对象的公共方法,因为父类没有子类的特有方法,在访问子类的特有方法时会报错)

我感觉没有针对于谁说:就是父类的引用指向子类对象,就是多态的体现
扩展性主要就体现在以后再出现一个类,你想让这个类拥有更多的功能,只要让后出现的类继承这个类或者实现这个接口就可以了,没有必要再自己重新添加功能,这就是提高了扩展性!

还有多态的用法:编译看左边,运行看右边,也就是说只要编译能通过,查阅的都是子类对象的方法...

新人,有理解不对的地方望谅解,希望对你有帮助...

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
多态简单的说就是:编译时期看父类,运行时期运行子类。
这句话记住了,基本就不会出错了。
至于其他特点楼上的两位说的比较多了,就不讲了。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
1、多态可以有编译时多态(方法重载)和运行时多态(方法重写),方法重载是在同一个类中,方法重写是子类重写父类的方法,如果牵扯子类和父类的关系的话,指的是方法重写引起的多态,
2、父类的引用指向了自己的子类对象,也可以接受自己的子类对象。
2、多态提高了程序的扩展性主要体现在:(我个人理解,不知道是否到位)多态可以通过集成类和实现接口来实现,但是java只支持单继承,但是可以实现多个接口,所以可以通过实现不同的接口,来实现更多的功能,从而提高了程序的扩展性。
如果有不足,还希望大家多多指教
  原因是:

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
多态是相对父类的。
1,多态是父类的引用指向了自己的子类对象
2,父类的引用可以接受自己的子类对象
比如创建一个父类Person它的子类有man和woman他创建的的引用可以指向man和women子类对象
提高扩展性体现
可以重写父类中的函数并可以被父类创建的引用调用
例如:
interface PCI
{
   void open();
   void open();
}
class Mainboard
{
     public void run()
     {
        System.out.println("mainboard is run");
     }
     public void UsrPCI(PCI p)
     {
         p.open();
         p.close();
     }
}
class Netcad implements PCI
{
     public void open()
     {
           System.out.println("pci is run");
     }
    public void close()
     {
           System.out.println("pci is close");
     }
}
clsaa DuotaiDemo
{
   public static void main(String[] args)
   {
          Mainboard mb=new Mainboard();
          mb.run();
          mb.UsePCI(new Netcard);

   }
}

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
乔九 中级黑马 2012-10-19 22:16:46
7#
多态是相对父类的。
1,多态是父类的引用指向了自己的子类对象
2,父类的引用可以接受自己的子类对象
比如创建一个父类Person它的子类有man和woman他创建的的引用可以指向man和women子类对象
提高扩展性体现
可以重写父类中的函数并可以被父类创建的引用调用
例如:
interface PCI
{
   void open();
   void open();
}
class Mainboard
{
     public void run()
     {
        System.out.println("mainboard is run");
     }
     public void UsrPCI(PCI p)
     {
         p.open();
         p.close();
     }
}
class Netcad implements PCI
{
     public void open()
     {
           System.out.println("pci is run");
     }
    public void close()
     {
           System.out.println("pci is close");
     }
}
clsaa DuotaiDemo
{
   public static void main(String[] args)
   {
          Mainboard mb=new Mainboard();
          mb.run();
          mb.UsePCI(new Netcard);

   }
}
回复 使用道具 举报
秦松 中级黑马 2012-10-19 22:16:56
8#
清凉一夏 发表于 2012-10-19 21:52
1、多态可以有编译时多态(方法重载)和运行时多态(方法重写),方法重载是在同一个类中,方法重写是子类 ...

谢谢美女!
回复 使用道具 举报
秦松 中级黑马 2012-10-19 22:20:29
9#
乔九 发表于 2012-10-19 22:16
多态是相对父类的。
1,多态是父类的引用指向了自己的子类对象
2,父类的引用可以接受自己的子类对象

:handshake
回复 使用道具 举报
楼上说的都很对。我再多说意思也都差不多。 顶!!!
回复 使用道具 举报
sun~~ 中级黑马 2012-10-19 23:23:34
11#
多态是:同一个引用类型,使用不同的实例而执行不同操作
多态j具有可扩充性、 接口性、 灵活性 、简化型 、可替换性
楼上的介绍更详细
结合实例记得更牢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马