继承

作者: chenyq1989 | 来源:发表于2017-10-09 23:39 被阅读0次

继承

类 超类和子类

  • 定义子类
  • 覆盖(override)方法

调用超类方法

  • 子类构造器

调用超类构造器

一个对象变量可以指示多种实际类型的现象被称为多台(polymorphism)

  • 继承层次
  • 多态

判断是否使用继承的关键是,子类和超类是否是is-a关系

  • 理解方法调用

理解静态绑定,动态绑定,方法签名(名称和参数列表)

  • 阻止继承

final类和方法

  • 强制类型转换

强制类型转换前使用instanceof判断,如果转换不可能成功,编译无法通过

应该少用类型转换,如果用了,应该查看超类设计是否合理

  • 抽象类
  • 受保护访问(域和方法)

Object:所有类的超类

  • equals方法

Objects.equals
在子类中首先调用超类的equals方法

public class Employee {
    public boolean equals(Object otherObject) {
        if(this == otherObject) return true;

        if(otherObject == null) return false;

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

        Employee other = (Employee)otherObject;

        return Objects.equals(name, other.name)
            && salary == other.salary
            && hireDay == other.hireDay;
    }
}

public class Manager extends Employee {
    public boolean equals(Object otherObject) {
        if(!super.equals(otherObject)) return false;

        Manager other = (Manager)otherObject;
        return bonus == other.bonus;
    }
}
  • 相等测试与继承

equals方法需满足以下特性

  1. 自反性
  2. 对称性
  3. 传递性
  4. 一致性
  5. 非空引用和null应返回false

编写完美的equals方法

  1. 显示命名参数为otherObject,稍后转换为另一个other变量
  2. 检测this和otherObject是否同一个引用
if(this == otherObject) return true;
  1. 检测otherObject是否为null
if(otherObject == null) return false;
  1. 比较this和otherObject是否为同一个类
if(getClass() != otherObject.getClass())
    return false;
  1. 将otherObject转换为相应的类类型变量
ClassName other = (ClassName) otherObject;
  1. 比较所有域,使用==比较基本类型,equals比较对象域,如果所有域匹配则返回true,否则返回false
  2. 如果在子类中重新定义equals,则需要在其中包含super.equals(other);

Objects.equals

Arrays.equals

  • HashCode方法

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

Object.hashCode
Objects.hash
Objects.hashCode
java.lang.(Integer|Long|Short...).HashCode
Arrays.hashCode
  • toString方法
public String toString() {
    return getClass().getName()
        + "[name="+name
        + ",salary="+salary
        + ",hireDay="+hireDay
        + "]";
}

public String toString() {
    return super.toString()
    + "[bonus="+bonus
    + "]";
}

Arrays.toString

泛型数组列表ArrayList

  • 访问数组列表元素

set get add remove

  • 类型化和原始数组的兼容性

对象包装器与自动装箱

所有基本类型都有与之对应的包装器类(final类)

自动装箱(list.add(3) --> list.add(Integer.valueOf(3)))

自动拆箱(int n = list.get(i) --> int n = list.get(i).intValue() )

包装器还包含有用的静态方法,如Integer.parseInt

参数变量可变的方法

/*定义*/
public void printf(String fmt, Object... args) {
    //args是一个Object[]数组
}

/*使用*/
printf("%s %d", "the deadline is ", 8);

枚举类

/* 定义枚举类型实际定义了一个类,有多个实例*/
public enum Size {SMALL,MEDIUM,LARGE, EXTRA_LARGE};
public enum Size {
    SMALL("S"),MEDIUM("M"),LARGE("L"), EXTRA_LARGE("XL")

    private String abbr;
    private Size(String abbr) {this.abbr = abbr;}

    public String getAbbr(){return this.abbr;}
}

toString, valueOf, ordinal, compareTo

反射

  1. 运行时分析类的能力
  2. 运行时查看对象
  3. 实现通用的数组操作代码
  4. 利用Method对象
  • Class类
  • 捕获异常
  • 利用反射分析类的能力
  • 在运行时使用反射分析对象
  • 使用反射编写泛型数组代码
  • 调用任意方法

Class[forName,newInstance]
Throwable
Field
Method
Constructor
Array

继承的设计技巧

  1. 将公共操作和域放在超类
  2. 不要使用受保护的域
  3. 使用继承实现"is-a"关系
  4. 除非所有继承的方法都有意义,否则不要使用继承
  5. 在覆盖方法时,不要改变预期的行为

相关文章

  • 继承 继承

    属性拷贝 继承不单单能通过原型链实现,也能通过其他方式实现,属性拷贝就是其中一种方法。 通过属性拷贝也能实现继承子...

  • 继承(单继承,多继承)

    将共性的内容放在父类中,子类只需要关注自己特有的内容 python中所有的内容都是对象,所有的对象都直接或间接继承...

  • js继承方式

    类式继承 构造函数继承 组合继承 类式继承 + 构造函数继承 原型式继承 寄生式继承 寄生组合式继承 寄生式继承 ...

  • Python-学习之路-08 OOP -02

    单继承和多继承 单继承:每个类只能继承一个类 多继承:每个类可以继承多个类 单继承的多继承的优缺点 菱形继承/钻石...

  • 原型相关(二)

    1.继承 继承方式:接口继承(只继承方法签名)实现继承(继承实际的方法)ECMAScript只支持实现继承,并且主...

  • 继承

    继承的引入和概述 继承案例和继承的好处 继承的弊端 Java中继承的特点 继承的注意实现和什么时候使用继承 继承中...

  • Java面向对象三大特性之继承

    继承 一、继承的特点 Java只支持单继承单继承 多继承 单继承、多继承优缺点①单继承优点:提高了代码的复用性,让...

  • 7、面向对象的程序设计3(《JS高级》笔记)

    三、继承 许多OO语言都支持两种继承方式:接口继承和实现继承。接口继承只继承方法签名,而实现继承则继承实际方法。由...

  • 【重学前端】JavaScript中的继承

    JavaScript中继承主要分为六种:类式继承(原型链继承)、构造函数继承、组合继承、原型式继承、寄生式继承、寄...

  • js之继承

    文章主讲 JS 继承,包括原型链继承、构造函数继承、组合继承、寄生组合继承、原型式继承、 ES6 继承,以及 多继...

网友评论

      本文标题:继承

      本文链接:https://www.haomeiwen.com/subject/xuymyxtx.html