zoukankan      html  css  js  c++  java
  • Java基础语法<八> 继承 多态 抽象 反射

    1、超类和子类

    超类和子类

    父类与子类

    多态:

    一个对象变量可以指示多种实际类型的现象称为多态

    一个变量可以引用父类对象,也可以引用其子类对象,这就是多态。

    不能将一个超类的引用赋给子类变量,因为调用子类方法时可能发生运行错误

    子类引用可以赋给超类引用

    动态绑定:

    在运行时能够自动地选择哪个方法的现象称为动态绑定

    是一个非常重要的特性,无需对现存的代码进行修改,就可以对程序进行扩展。

    阻止继承:final类和方法 

    将方法和类声明为final主要目的是:确保它们不会在子类中改变语句

    强制类型转换

    只能在继承层次内进行类型转换。

    在将超类转换成子类之前,应该使用instanceof进行检查。

    抽象类

    使用abstract关键字,这样就完全不需实现这个方法。

    为了提高程序清晰度,包含一个或多个抽象方法的类本身必须被声明为抽象的

    除了抽象方法外,抽象类还可以包含具体数据和具体方法。

    尽量将通用的域和方法(不管是否是抽象的)放在超类(不管是否是抽象类)中

    扩展抽象类

    1 子类中定义部分抽象方法或抽象方法也不定义,这样就必须将子类也标记为抽象类

    2 定义全部的抽象方法,子类就不是抽象的了

    抽象类不能被实例化 (不能new)这个类的对象

    可以创建一个具体子类的对象,可以定义一个抽象类变量,但是它只能引用非抽象子类的对象。

    受保护访问

    private 子类不能访问超类的私有域,

    protected 允许子类访问超类的某个域

    2、Object:所有类的超类

    Object是Java的始祖,在Java中每个类都是由它扩展而来

    可以使用Object类型的变量引用任何类型的对象

    eqluas方法

      用于检测一个对象是否等于另一个对象,在Object类中,这个方法将判断两个对象是否具有相同的引用。

      在子类中定义equals方法时,首先调用超类的equals。如果检测失败,对象就不可能相等。

      如果超类中的域都相等,就需要比较子类中的实例域。

    相等测试与继承

      Java语言规范要求equals方法具有下面的特性:

    自反性:x.eqluas(x) 返回true

    对称性:当且仅当x.eqluas(y) 返回true,y.eqluas(x)返回true

    传递性:如果x.eqluas(y)返回true,y.eqluas(z)返回true,x.equlas(z)也应该返回true

    一致性:如果x,y引用的对象没有发生变化,反复调用x.eqluas(y)应该返回同样的结果

    对于任意非空引用x,x.eqluas(null) 应该返回false

    对称性,instanceof 子类与超类的比较 

    • 如果子类能够拥有自己的相等概念,则对称性需求将强制采用getClass进行检测
    • 如果由超类决定相等的概念,那么就可以使用instanceof进行检测,这样可以在不同子类的对象之间进行相等的比较。

    编写一个完美的equals方法的建议:

    1 显式参数命名为otherObject,稍后需要将它转换成另一个叫做other的变量

    2 检测this 与 otherObject是否引用同一个对象:

    if(this == otherObject) return true;

    3 检测otherObject是否为null,如果是null ,返回false

    if(otherObjecr == null) return false;

    4 比较this 与 otherObject是否属于同一个类。

      如果equals的语义在每个子类中所改变,就使用getClass检测

      if(getClass != otherObject.getClass()) return false;

      如果所有的子类都拥有统一的语义,就使用instanceof检测

      if(!otherObject instanceof ClassName) return false;

    5 将otherObject转换为相应的类类型变量

    ClassName other = (ClassName)otherObjecrt;

    6 现在开始对所有需要比较的域进行比较了。使用==比较基本类型域,使用equals比较对象域。

    如果在子类重新定义equals,就要调用super.equlas(other);

    hashCode方法

    散列码(hashCode)是由对象导出的一个整数值。

    hashCode定义在Object类中,因此每个对象都有一个默认的散列码,其值为对象的存储位置。

    如果重新定义equals方法,就必须重新定义hashCode方法,以便用户可以将对象插入到散列表中

    toString方法 

    3、泛型数组列表

    访问数组列表对象

    ArrayList<T>

    不必指出数组的大小

    使用add将任意多的元素添加到数组

    使用size()替代length计算元素的数目

    使用a.get(i)替代a[i]访问元素

    4、对象包装器与自动装箱

    基本类型 转换为 对象 

    5、参数数量可变的方法

     省略号...是Java代码的一部分,它表明这个方法可以接收任意数量的对象

    6、枚举类

     Enum

    7、反射

     反射机制:

    在运行中分析类的能力

    在运行中查看对象

    实现通用的数组操作代码

    利用Method对象

    Class类

     Class.forName().newInstance();

    捕获异常

      try catch

    利用反射分析类的能力

      Field Method Constructor 

      三个类都有

      getName返回项目的名称

      getModifiers 返回一个整型数值,描述修饰符

      Field getType 返回描述域所属类型的Class对象

      getFileds

      getDeclaredFileds

    在运行时使用反射分析对象

      setAccessible

    使用反射编写泛型数组代码

      CopyOf

    调用任意方法

      Method invoke

    8、继承设计的技巧

    1、将公共操作和域放在超类

    2、不要使用受保护的域

    3、使用继承实现 is-a 关系

    4、除非所有集成的方法都有意义,否则不要使用继承

    5、在覆盖方法时,不要改变预期的行为

    6、使用多态,而非类型信息

    7、不要过多的使用反射

    9、tag问题

    9.1 

    抽象:就是把现实生活中的某一类东西提取出来,用程序代码表示,我们通常叫做类或者接口。抽象包括两个方面:一个是数据抽象,一个是过程抽象。数据抽象也就是对象的属性。过程抽象是对象的行为特征。

    继承:是对有着共同特性的多类事物,进行再抽象成一个类。这个类就是多类事物的父类。父类的意义在于抽取多类事物的共性。

    多态:允许不同类的对象对同一消息做出响应。方法的重载、类的覆盖正体现了多态。

    9.2 

    重载:发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。
    重写:发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类;如果父类方法访问修饰符为private则子类中就不是重写。

    9.3  HashCode Equals 关系

    equals相等,hashcode必相等;hashcode相等,equals可能不相等。

  • 相关阅读:
    java中的 equals 与 ==
    String类的内存分配
    SVN用命令行更换本地副本IP地址
    npoi 设置单元格格式
    net core 微服务框架 Viper 调用链路追踪
    打不死的小强 .net core 微服务 快速开发框架 Viper 限流
    net core 微服务 快速开发框架 Viper 初体验20201017
    Anno 框架 增加缓存、限流策略、事件总线、支持 thrift grpc 作为底层传输
    net core 微服务 快速开发框架
    Viper 微服务框架 编写一个hello world 插件02
  • 原文地址:https://www.cnblogs.com/loveincode/p/7188320.html
Copyright © 2011-2022 走看看