继承初步
生活中继承关系 父亲 和 儿子 的关系? 父子关系 第一顺位继承人 代码中的继承关系: 英雄联盟: 所有的英雄人物都属于英雄类,在这个类里面规定了英雄应该拥有的属性,血量,攻击力,魔法值,魔抗,物抗~ 但是每一个英雄,例如,凯特琳(皮城女警), 在这个英雄类基础上,特定的技能,特定的皮肤,特定的模型~~~ 在游戏开发中,大量的使用【继承】,来简化代码,提供开发效率 用代码来实现继承关系:extends在代码中继承使用的关键字是extends,如果一个类通过extends关键字继承了其他类,那么就可以说,当前类是其他类的子类,或者其他类是当前类父类
【发现】1.在创建子类对象的时候,会首先自动调用父类的构造方法这里是为了初始化属于父类的成员变量。有其父必有其子
2.父类中的【非私有化】成员变量,子类可以通过继承之后得到使用的权限
3.父类中的【非私有化】成员方法,子类可以通过继承之后得到使用的权限4.在父类中用private修饰的私有化成员方法,这个私有化成员方法不能通过继承该类的子类对象来调用原因:私有化的成员方法,只能在当前类的内部使用,外部没有任何使用权限5.父类中用private修饰的私有化成员变量,这个私有化的成员变量不能通过继承该类的子类对象来调用原因:私有化的成员变量,只能在当前类的内部使用,外部没有任何使用权限【总结】在继承中,父类里没有私有化的成员变量和成员方法都可以被子类继承,但是一旦私有化,子类就无法继承这些属性或者方法, 原理是封装思想。【使用继承的注意事项】继承可以节省代码,提高开发效率,但是在使用继承的时候,前提条件就是,两个类之间的确包含有继承的关系例如:Animal 动物类Dog 狗Cat 猫绿萝 这里不属于动物类,不能使用继承关系
子类在创建对象时候,首先会自动调用父类的构造方法【前提】父类的构造方法,不能被子类继承[问题]在子类中如果通过构造方法初始化从父类继承而来的成员变量,可能会存在一定的隐患,如果直接使用this.成员变量赋值操作,会导致父类中的成员变量不符合一些业务逻辑,或者生活逻辑。[考虑]能否借助于父类的构造方法,来初始化原本属于父类的成员变量[解决]借助于super关键字 调用父类方法的关键字super关键字的注意事项:
1.super关键字可以在子类中直接调用父类的成员方法
2.【重点】使用super调用父类的构造方法:super(实际参数); Java编译器会根据不同的参数类型,来调用不同的父类中的构造方法
3.使用super关键字调用父类的构造方法的时候,要求必须当前代码块的第一行
4.this关键字调用构造方法,和super关键字调用构造方法,不能同时出现在一个代码块里面
5.在子类的构造方法中,如果没有通过super指定调用父类的构造方法,那么Java编译器会帮我们自动调用父类的无参构造方法来使用。[建议]存在继承关系下, 父类中最好提供一个无参的构造方法供子类使用
[回顾]this关键字调用构造方法的格式:1.this(实际参数) Java编译器会根据不同的参数类型,来调用不同的构造方法2.如果用this调用构造方法,必须在当前代码块的第一行3.this关键字调用构造方法的时候,不能相互调用
[问题]父亲,业余活动,喜欢钓鱼,但是儿子业余活动,喜欢吃鸡父类中存在一个playGame()的方法,这个方法是比较符合父类的实际情况子类继承之后,也能调用playGame(),但是这个方法不太符合子类的情况[期望]需要让继承而来的方法, 更加适合子类的实际情况【重写】子类中存在和父类同名,同参数,同返回值的方法,这种情况称之为【重写】通常会使用【注解】@Override开启严格的重写检查如果父类中没有这个方法,使用@Override检查会报错