继承的基本概念
继承是面向对象三大特性之一继承可以解决编程中代码重复的问题 实现代码重用的重要手段之一 继承是软件可重用性的一种表现
继承的语法格式如下
[访问修饰符]class <SubClass>extends<SuperClass>{}
在java中继承通过extends关键字实现 其中SubClass称为子类 SuperClass称为父类或基类 访问修饰符如果是public 那么该类在整个项目中可见 若不写访问修饰符则该类只在当前包中可见
在java中子类可以从父类中继承以下内容
可以继承public和protected修饰的属性和方法不论子类和父类是否在同一个包内 无法继承父类的构造方法
使用继承和重写完善类的结构
使用extends关键字建立继承关系 使用super挂机案子调用父类成员 使用方法重新重写父类中的方法输出子类自身的内容
使用super关键字调用父类成员
访问父类结构方法super(属性)
访问父类属性/方法 super.<父类属性/方法>
super只能出现在子类(子类的方法和构造方法)中而不是其他位置 super用于访问父类的成员如父类的属性方法构造方法 具有访问权限的限制 如无法通过super访问父类的private成员
实例化子类对象
创建该类的对象(实例化) 创建该类的子类的对象(子类的实例化)
如果子类构造方法没有通过super显式调用父类的有参构造方法 也没有通过this显式调用自身的其他构造方法 系统会默认贤调用父类的无参构造方法
如果子类的构造方法中通过super显式的调用了父类的有参构造方法那么美将执行父类相应的构造方法 而不执行父类无参构造方法
如果子欸的构造方法中通过this显式的调用了自身其他构造方法 在相应的构造方法中需要遵循以上两条规则
Object类
Object类是所有类的父类 在java中所有java类都直接或间接继承了java.lang.Object类 Object是所有java类的祖先 在定义一个类是没有使用extends关键字也就没有显式的继承某个类 那么这个类直接继承Object类 所有对象都继承这个类的方法
Object类的部分方法
方法 | 说明 |
toString() | 返回当前对象本身有关的信息范围字符串对象 |
equals() | 比较两个对象是否是同一个对象如果是返回true |
clone() | 生产当前对象的一个副本并返回 |
hashCode() | 返回该对象哈希代码值 |
getClass() | 获取当前对象所属的类信息返回Class对象 |
方法重写
在子类中可以根据需求对于父类继承的方法进行重新编写 这成为方法的重写或者方法的覆盖
方法重写必须满足如下要求
方法重写和被重写方法必须具有相同的方法名
重写方法和被重写方法必须具有相同的参数列表
重写方法的返回值必须和被重写方法的返回值相同或是其子类
重写方法不能缩小杯重写方法的访问权限
实现多态
多态意味着再一次方法调用中根据包含的对象实际类型来决定调用哪个方法而不是由用来储存对象引用的变量类型决定的 为了实现多态的操作 这个方法即使在父类中声明过的也必须是在子类中写过的方法
抽象类不能被实例化 子类如果不是抽象类必须重写抽象类中的全部抽象方法 abstract修饰符不能和final修饰符一起使用 abstract修饰的抽象方法没有方法体 private关键字不能用来iu是抽象方法
向上转型
子类向父类的转换成为向上转型 语法格式如下
<夫类型><引用变量吗>=new <子类型>();
将一个父类引用指向一个子类对象称为向上转型系统会自动进行类型转换 此时通过父类引用变量跳动的方法是子类覆盖或继承了父类的方法不是父类的的方法 此时通过父类引用变量无法调用子类特有的方法
向下转型
子类对象的父类引用给一个子类的引用 即将父类类型转换为子类类型 称为向下转型 此时必须进行强制类型转换
<子类型><引用变量名>=(<子类型>)<夫类型的引用变量>
instanceof运算符
在向下转型的过程中如果不是转换为真实子类型 会出现类型转换异常
使用instanceof时对象的类型必须和instanceof后面参数所指定的类有继承关系否则会出现编译错误 instanceof通常和强制类型转换结合使用
多态
多态的优势
多态对已存在的代码具有可替换性
堕胎对代码具有可扩充性 增加新的子类不影响已存在类的多态性 继承 性以及其他特性的允许和操作
多态的父类箱子类提供了一个共同接口有子类来具体实现
多态在应用中体现了灵活多样的操作提高了使用效率
多态简化了应用软件的代码编写和修改过程