黑马程序员----多态

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------

定义:
 
 
    多态:事物存在的多种体现形态

多态的体现:
       在对象上的体现:父类的引用指向了自己的子类
                猫 m=new 猫();
                动物 m=new 猫();
       在方法上的体现:
                方法的复写和重写
多态的意义

            1、定义一些事物的共同特性,通过继承同一个父类
            2、提高代码扩展性,因为可以用父类来代替子类接收实参

多态的弊端

            1、父类的方法会丢失
            2、父类引用只能访问父类中有的方法,但是访问的是子类中的方法(原因:在编译时参阅的是父类引用是否有该方法,但是运行时则参阅的是具体实例子类), 但是对于字段则没有这回事,引用是谁就访问谁的。 静态方法是不能被复写的,所以也不存在访问到子类的该方法
------
多态注意点
           
            1、向下转型时要注意:只有当父类引用指向自己的子类时,才能把该引用转换为子类,例如 animal a=new cat(),cat c=(cat)  a,切勿                              出现把父类对象强转为子类
            2、多态自始至终都是子类对象在做着改变
            3、在转型时,判断一个引用变量的所属类型  a  instanceof cat  判断a是不是cat的子类

多态边缘知识点
   Object中的equals、通过复写这个方法,定义自己的比较方式。
    toString


多态的应用小例
/**
 * 勤快动手,江山我有。
 */
package com.edu;
/**
 * 目的:旨在学习多态的使用
 * 需求:模拟电脑主板与网卡声卡等关系,让主板和声卡、网卡通过PCI槽解耦
 * @author duanlang
 *
 */
public class Polymorphism {
 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  new MainBoard().useCard(new SoundCard());
  new MainBoard().useCard(new NetCard());
 }
}
/**
 * 定义PCI标准
 * @author duanlang
 *
 */
interface PCI{
 public void open();
 public void close();
}
/**
 * 定义实现了PIC接口的声卡
 * @author duanlang
 *
 */
class SoundCard implements PCI{
 public void open(){
  System.out.println("open soundcard");
 }
 public void close(){
  System.out.println("close soundcard");
 }
}
/**
 * 定义实现了PIC接口的网卡
 * @author duanlang
 *
 */
class NetCard implements PCI{
 public void open(){
  System.out.println("open netcard");
 }
 public void close(){
  System.out.println("close netcard");
 }
}
class MainBoard{
 public void useCard(PCI pci){
  pci.open();
  pci.close();
 }
}



  

----------------------ASP.Net+Unity开发.Net培训、期待与您交流! --------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
多态是面向对象编程中的一个重要概念,它允许不同类型的对象对同一个消息做出不同的响应。基于多态的冲突通常是指在继承关系中存在多个同名方法,导致在调用时产生歧义或冲突的情况。 在黑马程序员的教学中,关于基于多态的冲突一般会涉及到两种情况: 1. 方法重载冲突:方法重载是指在同一个类中存在多个同名方法,但它们的参数类型和/或个数不同。当我们调用这个方法时,编译器会根据参数类型选择最合适的方法。但如果存在多个方法都符合调用要求,就会产生冲突。这种情况下,编译器无法确定到底应该调用哪个方法,会报错。 2. 方法覆盖冲突:方法覆盖是指子类重写了父类中的同名方法。当我们通过父类的引用调用这个方法时,实际执行的是子类中重写的方法。但如果存在多个子类同时重写了这个方法,并且我们使用父类引用指向不同的子类对象,就会产生冲突。这种情况下,编译器同样无法确定到底应该调用哪个方法,会报错。 为了解决基于多态的冲突,我们可以采取以下方法: 1. 方法重载冲突:避免在同一个类中定义多个同名方法,或者通过修改参数类型和/或个数来消除冲突。 2. 方法覆盖冲突:使用强制类型转换或者将父类引用指向具体的子类对象,明确调用具体的重写方法。 在实际开发中,我们需要注意避免基于多态的冲突,保持代码的清晰和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值