基本概念
- 扩充一个类已有的功能
优点
- 父类定义公共的内容,方便统一修改
- 整体减少代码量
- 添加新类方便
语法
class 子类 extends 父类{}
- 子类又叫派生类
- 父类又叫超类,super(class)
在一个子类继承时,实际上会继承父类中的所有操作,对于所有的非私有(no private)操作属于显式继承(可以直接利用对象操作),而所有的私有操作属于隐式继承(间接完成)利用get/set方法间接操作
子类构造和父类构造
- 默认情况下,子类会找到父类中的无参构造方法
打印结果:public class Hero{ public Hero(){ System.out.println("父类无参构造"); } } public class Worrior extends Hero{ public Worrior(){ System.out.println("子类无参构造"); } public static void main(String args[]){ Worrior worrior = new Worrior();//实例化子类对象 } }
父类无参构造
子类无参构造
- 子类实例化时会默认执行父类构造,调用父类构造方法,然后再实例化子类对象,调用子类的构造方法,其实相当于在子类构造隐藏了一个super();
如果父类没有无参构造,则子类必须通过super()调用指定参数的构造方法public class Worrior extends Hero{ public Worrior(){ super();//调用父类构造 System.out.println("子类无参构造"); }
构造方法的执行顺序是按照继承顺序来执行的public class Hero{ private String nickName; public Hero(String nickName){ this.setNickName(nickName); System.out.println("父类无参构造"); } } public class Worrior extends Hero{ public Worrior(){ super("英雄名字");//调用父类对应的参数构造 System.out.println("子类无参构造"); } public static void main(String args[]){ Worrior worrior = new Worrior();//实例化子类对象 } }
小结
- 使用super关键字来调用父类构造方法
- 默认会先调用父类构造,再调用子类构造
- 构造方法不可继承
- Java中只能继承一个父类
- 父类私有属性在子类中不能直接访问(需通过get/set方法间接访问)
- 继承关系是一种“- is - a -”关系,父类和子类之间必须存在is - a 关系
方法重写
当子类定义了和父类方法名称相同,返回值类型,参数类型和个数完全相同的方法的时候,叫做方法的重写
当在一个类中的方法被重写后,如果实例化的是这个子类对象,则调用的方法就是被重写过的方法
注意:
> 方法重写发生在通过继承而相关的不同类中
> 方法重写具有同样的方法签名和返回值类型
> @override 称为重写标注,用来保证重写的方法与原方法的前面和返回值类型一致
被子类重写的方法不能拥有比父类更严格的访问控制权限,(private < default(不写) < public)
当一个子类重写一个父类的方法时,想要调用父类重写的方法时,就得在方法前加上super
super.方法();
注意:
> this.方法();先从本类查找是否存在指定的方法,如果没有再调用父类操作
> super.方法();直接由子类从父类中调用指定的方法,不再找子类
重写的应用
Java中所有类都继承于java.lang.Object类,如果定义类没有显式指明父类,父类默认为object
Object类可以接收所有类的实例化对象
public class Hero{
public static void main(String[] args){
Object obj = new Hero();
Hero hero = (Hero) obj;
}
}
常用的需要重写的Object类中的三个方法:
> 取得对象信息:
public String toString();
> 对象比较:
public boolean equals(Object obj);
> 取得哈希码:
public int hashCode();