继承、重写、覆盖、重载、多态的区别

inheritance->继承、override->重写(=覆盖)、overload->重载、polymorphism -> 多态
 
1、继承(inheritance)
   一旦你已经创建了一个定义了对象一般属性的超类,该超类可以被继承以生成特殊用途的类。每一个子类只增添它自己独特的属性。这是继承的本质。Java 不支持多超类的继承。
   超类变量可以引用子类对象(这个具体有什么作用,有待补充)
2、重写(覆盖)(override
override是 重写(覆盖)了一个方法,以实现不同的功能。一般是 用于子类在继承父类时,重写(重新实现)父类中的方法
重写(覆盖)的规则:
   1、重写方法的参数列表必须完全与被重写的方法的相同,否则不能称其为重写而是重载.
   2、重写方法的访问修饰符一定要大于被重写方法的访问修饰符(public>protected>default>private)。
   3、重写的方法的返回值必须和被重写的方法的返回一致;
   4、重写的方法所抛出的异常必须和被重写方法的所抛出的异常一致,或者是其子类;
   5、被重写的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行重写。
   6、静态方法不能被重写为非静态的方法(会编译出错)。
 3、重载(overload
overload是 重载,一般是用于在 同一个类内实现若干重载的方法,这些方法的名称相同而参数形式不同。
重载的规则:
     1、在使用重载时只能通过相同的方法名、不同的参数形式实现。不同的参数类型可以是不同的参数类型,不同的参数个数,不同的参数顺序(参数类型必须不一样);
      2、不能通过访问权限、返回类型、抛出的异常进行重载;
      3、方法的异常类型和数目不会对重载造成影响;
 4、多态(polymorphism 
多态的概念比较复杂,有多种意义的多态。
    多态性的概念也可以被说成“一个接口,多个方法”。Java实现运行时多态性的基础是动态方法调度,它是一种在运行时而不是在编译期调用重载方法的机制。
    多态的通常含义是能够呈现出多种不同的形式或形态,即一个特定类型的变量可以用于引用不同类型的对象,并且自动调用该变量引用的特定类型对象的方法,这样就使得一个方法的调用根据该调用所作用到的不同对象类型而响应不同的操作。
一个有趣但不严谨的说法是:继承是子类使用父类的方法,而多态则是父类使用子类的方法。
一般,我们使用多态是为了避免在父类里大量重载引起代码臃肿且难于维护。

举个例子:
public class Shape 
{
   public static void main(String[] args){
     Triangle tri = new Triangle();
     System.out.println("Triangle is a type of shape? " + tri.isShape());// 继承
     Shape shape = new Triangle();
     System.out.println("My shape has " + shape.getSides() + " sides."); // 多态
     Rectangle Rec = new Rectangle();
     Shape shape2 = Rec;
     System.out.println("My shape has " + shape2.getSides(Rec) + " sides."); //重载
   }
   public boolean isShape(){
     return true;
   }
   public int getSides(){
     return 0 ;
   }
   public int getSides(Triangle tri){ //重载
     return 3 ;
   }
   public int getSides(Rectangle rec){ //重载
    return 4 ;
   }
}
class Triangle extends Shape 
{
   public int getSides() { //重写,实现多态
     return 3;
   }
}
class Rectangle extends Shape 
{
   public int getSides(int i) { //重载
    return i;
   }
}

注意Triangle类的方法是重写,而Rectangle类的方法是重载。对两者比较,可以发现多态对重载的优点:
如果用重载,则在父类里要对应每一个子类都重载一个取得边数的方法;
如果用多态,则父类只提供取得边数的接口,至于取得哪个形状的边数,怎样取得,在子类里各自实现(重写)。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值