Java中的继承

  1.继承的基本概念

     当多个类之间存在相同的属性和方法时,在父类中定义这些相同的属性和方法,所有的子类无需重新定义这些属性和方法,只需要通过extends语句声明继承Base类。

   (1)继承的东西

      a.当sub类和base类位于同一个包中时,sub类继承base类中public,protected和默认访问级别的成员(包括成员变量和成员方法);

      b.当sub类和base类位于不同的包中时,sub类继承base类中的public和protected访问级别的成员。

   (2)Java不支持多继承

   (3)Java支持多级继承,所有的Java类都直接或者间接地继承了java.lang.Object类,Object类中定义了所有Java对象都具有的相同行为,位于下层的子类会继承上层所有直接或间接父类的属性和方法。

 

2.方法重载

    (1)两个方法的方法名相同;

    (2)方法的参数类型,个数,顺序至少有一项不相同;

    (3)方法的返回类型可以不相同

    (4)方法的修饰符可以不相同

编译器依靠方法名和参数签名来区分调用哪个方法,参数签名指参数类型,参数个数和参数顺序。

 

3.方法覆盖

    (1)子类中的一个方法,a.名称,b.返回类型和c.参数签名与父类中的某个方法的名称,返回类型和参数签名相匹配,那么,子类的方法覆盖了父类的方法;   注意三个条件:函数名,参数列表和返回类型

     编译器会首先判断方法的方法名和参数签名,如果完全相同,编译器会认为是子类方法对父类方法的覆盖,这时如果返回类型不同,会出现编译错误

    (2)子类不能缩小父类方法的访问权限

    (3)子类方法不能抛出比父类方法更多的异常,子类方法抛出的异常必须和父类方法抛出的异常相同,或者是父类方法抛出异常的子类

    (4)同一个类中的方法只能够被重载,不能够被覆盖

    (5)父类的静态方法不能被子类覆盖为非静态方法,父类的非静态方法也不能被子类覆盖为静态方法。

    (6)关于静态方法,子类可以定义与父类的静态方法同名,以便在子类中隐藏父类的静态方法

           同覆盖父类的实例方法一样,覆盖父类的静态方法要求有相同的函数名,参数签名和返回类型,不能缩小父类方法的访问权限,只能抛出父类方法异常相同的异常或者子异常

          覆盖静态方法和实例方法的区别在于:

          运行时,Java虚拟机将静态方法和类绑定,将实例方法和对象绑定。

     (7)父类的私有方法不能被子类覆盖;

     (8)父类的私有方法不能被子类覆盖,子类方法覆盖父类方法的前提是,父类方法要能够被子类方法继承

     (9)父类的抽象方法可以被子类通过两种途径覆盖:一是子类实现父类的抽象方法;二是子类重新声明父类的抽象方法;

 

方法覆盖   VS   方法重载

相同点:

(1)都要求方法名相同

(2)都可以用于抽象和非抽象方法之间

不同点:

(1)覆盖要求参数签名必须一致(类型,个数,顺序),重载要求参数签名必须不一致;

(2)方法覆盖要求返回类型必须一致,而重载不做要求;

(3)方法覆盖只能够用于子类覆盖父类的方法,方法重载用于一个类的所有方法,包括从父类中继承的方法;

(4)方法覆盖对访问权限和抛出的异常有要求,重载没有;

(5)一个方法在子类中只能够被覆盖一次,但是在一个类中,一个方法可以被重载多次。

 

  4.super

     (1)方法或变量被屏蔽:(注意以下三个描述中都提到了作用域)

             a.方法中的局部变量和类中的成员变量重名,或者和父类中的成员变量(该变量已经被子类继承)重名,在方法中,只有局部变量可见;

             b.子类中覆盖父类的成员方法,在子类的范围内,父类的方法不可见;

             c.子类中定义和父类同名的成员变量,在子类的范围内,父类的成员变量不可见

 

     (2)super和this关键字都可以覆盖Java默认的作用域,使被屏蔽的方法或者变量变为可见;

     (3)如果父类的成员被限制为private类型,则不能通过super进行访问;

     (4)使用super的情况:

             a.在子类的构造函数中通过super调用父类的构造函数;

             b.在子类中访问父类的被屏蔽的方法和属性(思考在什么情况下父类的方法和属性会被屏蔽呢?)

      (5)只能够在构造方法或者实例方法中使用super关键字,不能够在静态方法中使用super

 

   5.多态

     多态指系统A访问系统B的服务时,系统B可以通过多种实现方式来提供服务,而这一切对A是透明的,这里的系统指的是类;

 

 

在上述代码中,系统Feeder要访问系统Animal和系统Food的服务,Animal系统分别由Dog和Cat实现,Food系统分别由Bone和Fish实现,而这些对Feeder系统来说都是透明的

  Java虚拟机分别调用Dog和Cat实例的eat方法

 

  (1)Java允许某个类型的引用变量引用子类的实例,而且可以对这个引用变量进行类型转换(这是两句话)。

  Java中的绑定策略

   a.对于一个引用变量,Java编译器按照声明的类型处理,在编译阶段将成员变量和引用变量的类型绑定,将静态方法和引用变量的类型绑定,这两项属于静态绑定,在编译阶段就已经做了绑定;

   b.对于一个引用变量,java虚拟机将实例方法和引用变量实际引用的对象的方法绑定(方法在对象类中定义),在运行时动态绑定,具体调用哪个系统中的方法,由Java虚拟机在运行时动态决定

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值