什么是多态 重载 覆盖 继承 最好解释

态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
多态有两种表现形式:重载和覆盖
首先说重载(overload),是发生在同一类中。与什么父类子类、继承毫无关系。    
  标识一个函数除了函数名外,还有函数的参数(个数和类型)。也就是说,一个类中可以有两个或更多的函数,叫同一个名字而他们的参数不同。    
  他们之间毫无关系,是不同的函数,只是可能他们的功能类似,所以才命名一样,增加可读性,仅此而已!  
    
  再说覆盖(override),是发生在子类中!也就是说必须有继承的情况下才有覆盖发生。
  
  我们知道继承一个类,也就有了父类了全部方法,如果你感到哪个方法不爽,功能要变,那就把那个函数在子类中重新实现一遍。  
  这样再调用这个方法的时候,就是执行子类中的过程了。父类中的函数就被覆盖了。(当然,覆盖的时候函数名和参数要和父类中完全一样,不然你的方法对父类中的方法就不起任何作用,因为两者是两个函数,毫不关系
 
  
----------------------------------------
态是和继承相反的概念 多态是和继承相反的概念 
多态是父类调子类的实现,继承是子类调父类的实现,由于多态时不知道会被哪个子类继承,所以定义的东西都是虚函数,当你执行这个虚函数时,首先找到该虚函数代表的实体子类,并执行子类中的相关代码
----------------------------------------------------------------
 
  
态也是java的一个很重要的部分,就是一个方法名可以用多次,具体根据参数的不同来分辨你调用哪个方法,通俗的解释多台就是,假如有个方法名叫:“动物的叫声”
 那么,当你传递的参数是动物狗,则调用狗叫声,是猫,则调用猫叫声,这就是多态。 

------------------------------------------------------------------------------------------------

本文面向Java初学者,我们在教材上经常会看到Java是多态的,可是一般的教科书只停留在理论上,很少有实际操作。现在把多态个概念用代码简单描述一下,由于本人水平有限,所以难免有不足之处。

    首先我们有这样几个类,电脑,个人电脑,笔记本电脑。

java 代码
  1. class Computer{   
  2.        
  3.     public void turnOn(){   
  4.     }   
  5. }  

    现在有了电脑这个类,那么个人PC,笔记本都是继承他。

    java 代码
    1. class PC extends Computer{   
    2.     public void turnOn(){   
    3.         System.out.println("PC has turn on");   
    4.     }   
    5. }   
    6.   
    7. class NB extends Computer{   
    8.     public void turnOn(){   
    9.         System.out.println("NB has turn on");   
    10.     }   
    11. }  

    我们看到,每个类都有一个 turnOn()方法,而在父类中这个方法是空的,子类中各自有不同的实现,到这里可能还不太明显。如果有另外一个方法,要接受这些类作为参数,就像这样

    java 代码
    1. class Test{   
    2.     public void go(Computer computer){   
    3.          computer.turnOn();   
    4.     }   
    5. }  

    这个方法接收的是基类参数,当然我们是可以把子类传递给方法的,也应该这么做。

    java 代码
    1. go(new PC());   
    2. go(new NB());  

    这样他就会去调用具体子类的turnOn()方法,所以这两次调用的输出是不一样的.如果不用基类作为参数,我们想调用每个子类的turnOn()方法,那么就要些两个方法体一样的go()而接收不同的参数的重载。

    java 代码
    1. public void go(PC computer){      
    2.          computer.turnOn();      
    3.     }     
    4.   
    5. public void go(NB computer){      
    6.          computer.turnOn();      
    7.     }    

    这样些也是正确的,但是这样会产生很多重复代码,而且也不易维护,当然这只是多态中最基本的一个部分,Java多态机制还有很多特性,关于这些建议大家看看 java编程思想(think in java)这本书,里面讲的很详细,这里只是很简单的描述了一下,还望个各位高手不要见笑。

另外一个多态的例子。

ContractedBlock.gif ExpandedBlockStart.gif Code
class Order
{
  
public Order(Customer customer)
  {
    ID 
= Guid.NewGuid().ToString();
    m_Customer 
= customer;
    m_Products 
= new List<Product>();
  }

  
public readonly string ID;

  
private Customer m_Customer;

  
private List<Product> m_Products;
  
public void AddProduct(Product product)
  {
    m_Products.Add(product);
  }

  
public double TotalAmount()
  {
    
double totalAmount = 0.0;

    
foreach(Product product in m_Products)
      totalAmount 
+= product.Price;

    
return totalAmount * m_Customer.Discount;
  }

  
public override string ToString()
  {
    
return "Dear " + m_Customer.Name ",\n" +
           
"\tTotal amount of order " + ID +
           
" is " + TotalAmount().ToString();
  }
}

abstract class Customer
{
  
public abstract string Name { get; }

  
public abstract double Discount { get; }
}

class SuperVipCustomer : Customer
{
  
public SuperVipCustomer(string name)
  {
    m_Name 
= name;
  }

  
private string m_Name;
  
public override string Name
  {
    
get { return m_Name; }
  }

  
private const double c_Discount = 0.65;
  
public override double Discount
  {
    
get { return c_Discount; }
  }

  
public override string ToString()
  {
    
return "Name: " + m_Name + "[SuperVip]";
  }
}

class VipCustomer : Customer
{
  
// Code here
}

class NormalCustomer : Customer
{
  
// Code here
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值