• 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可能不相等。

  • 相关阅读:
    asp.net保存网上图片到服务器
    一个强大的jquery分页插件
    JS全屏漂浮广告、移入光标停止移动
    使用C#类向数据库添加数据的例子源码
    pip安装报错Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-e_k8hq6a/pynacl/
    mycat启动报Unable to start JVM: No such file or directory (2)【转】
    pt-table-checksum校验与pt-table-sync修复数据【转】
    linux网卡参数NM_CONTROLLED【转】
    pt-table-checksum解读【转】
    pt-table-checksum报错Skipping chunk【转】
  • 原文地址:https://www.cnblogs.com/loveincode/p/7188320.html
Copyright © 2020-2023  润新知