zoukankan      html  css  js  c++  java
  • Java 继承

    继承定义

    如果有两个类相似,那么它们会有许多重复的代码,通过继承这一机制,可以实现代码的复用,使整个程序更加简洁,也便于维护。

    • extends 关键字
      语法
    class 子类 extends 父类
    
    • 子类拥有父类除private以外的所有属性和方法。

    • 子类可以拥有自己的属性和方法。

    • 子类可以重写父类的方法。

    • Java 中的继承是单继承,一个类只有一个父类

    • 在其他类中调用子类从父类继承的 protected 方法或成员变量时,该类和父类在同一个包中才可以访问。

    • 若子类和父类不在同一个包中,则子类不能继承父类的友好变量和友好方法(所谓友好变量和友好方法,就是没有被 public 、private 、protected修饰的变量和方法)。

    • 有时需要将某个类的的对象的引用转换成另一个类的对象的引用,转换的语法与数值表达式的类型转换类似。进行类型转换的唯一原因是:在暂时忽视对象的实际类型之后,使用对象的全部功能。举例来说,一个数组的元素类型既有超类对象也有子类对象,那么数组类型自然得定义成超类类型,而为了能够使用子类自己新增的方法和变量,那就需要进行类型转换。需要注意的是,只能在继承层次类进行类型转换,只能将超类转换成子类,建议转换前使用关键字 instanceof 进行检查。但是,这实际上并不是一种好的做法,大多数情况下也并不需要,真的需要的时候可能也是超类设计的不合理,应该尽量少用。

    • implements 关键字
      使用 implements 关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)。

      语法

    修饰符 interface A extends 接口1,接口2{
          
    }
      
    修饰符 class B implements 接口1,接口2{
      
    }
    

    更多参见:Java 多态:接口

    • 当一个类没有继承的两个关键字,则默认继承object(这个类在 java.lang 包中,所以不需要 import)祖先类。

    也可以利用 Eclipse 帮我们自动建立继承关系。

    下例创建一个 Dog 类继承自 Animal 类:

    1

    2

    系统生成的代码:

    package com.shiyanlou;
    
    public class Dog extends Animal {
    }
    

    Dog 类里什么都没有写,其实它继承了父类 Animal,所以 Dog 类拥有 Animal 类的全部方法和属性(除了 private 方法和属性以外)。

    重写

    • 子类可以隐藏继承的成员变量,只要子类中定义个同名的成员变量即可。
    • 子类可以重写继承自父类的方法,子类在调用方法时,优先调用子类的方法。
    • 重写父类方法时,不可以降低方法访问权限。
    • 重写的方法一定要与原父类的方法语法保持一致,比如返回值类型,参数类型及个数,和方法名都必须一致。
    • 方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式

    相关知识

    • final 关键字

    • final 修饰类,则该类不允许被继承,为最终类。
    • final 修饰方法,则该方法不允许被重写。
    • final 修饰属性,则该属性不会进行隐式的初始化(类的初始化属性必须有值)或在构造方法中赋值(但只能选其一),也就是说必须赋给初值。
    • final 修饰变量,则该变量的值只能赋一次值,即常量。
    • super 关键字

    1. 访问父类的属性 super.属性名
    2. 访问父类的方法 super.bark()
    3. 子类构造方法需要调用父类的构造方法时,在子类的构造方法体里最前面的位置:super()
    4. 要想调用父类中被重写的方法,则必须使用关键字super。
    • 注一:如果子类的构造方法中没有使用关键字 super ,那么默认有super();,即默认调用父类不带参数的构造方法。因此,若你在父类中实现了多个构造方法,那么 Java 不提供默认的不带参数的构造方法,则会在子类省略 super 时出错。综上,当自定义构造方法时,建议应包括一个不带参数的构造方法。
    • 注二:和关键字 this 作比较,this 有两个用途:一是引用隐式参数,二是调用该类其他的构造器。同样,super 关键字也有两个用途:一是调用超类的方法,二是调用超类的构造器。在调用构造器的时候,这两个关键字的使用方式很相似。调用构造器的语句只能作为另一个构造器的第一条语句出现。构造参数既可以传递给本类(this)的其他构造器,也可以传递给超类(super)的构造器。

    初始化顺序

    继承的初始化顺序是先初始化父类再初始化子类。也就是说你创建一个子类对象,它会先去创建一个父类对象,然后再创建子类对象。

    注:父类的构造器(构造方法或构造函数)带有参数的,则必须在子类的构造器中显式地通过super关键字调用父类的构造器并配以适当的参数列表。如果父类有无参构造器,则在子类的构造器中用super调用父类构造器不是必须的,如果没有使用super关键字,系统会自动调用父类的无参构造器。

    参考资料

  • 相关阅读:
    PHP开发APP接口(九)
    C#深入理解类型
    C#从委托、lambda表达式到linq总结
    C# ==和Equals()
    C# 泛型
    C# Reflection
    原声JS网络请求
    JavaScript预编译
    泛型初探
    C#内存分配
  • 原文地址:https://www.cnblogs.com/mingyueanyao/p/7211653.html
Copyright © 2011-2022 走看看