目录
1.Java中提供了关键字extends,可以让一个类和另一个类建立起继承关系
一.继承
1.Java中提供了关键字extends,可以让一个类和另一个类建立起继承关系
格式: public class 子类名 extends 父类名 { }
子类也可以称为派生类 , 父类也可以称为基类或超类
2.继承的好处
(1)可以把多个子类中重复的代码抽取到父类中,从而提高代码的复用性
(2)子类可以在父类的基础上,增加其他功能,使子类更加强大
3.什么时候使用继承?
当类与类之间,存在相同的内容时,并满足子类是父类中的一种,就可以考虑使用继承,阿里优化代码
子类是父类中的一种:例如:父类是Person,子类一个是Student,一个是Phone
这就不能使用继承,因为父类代表人,而Phone是手机,不是人的一种
二.继承的特点
java只支持单继承,不支持多继承,但支持多层继承
1.单继承:一个子类只能继承一个父类
2.多继承:子类同时继承多个父类(在Java中是不允许的)
3.多层继承:子类继承于父类,而父类也可以有它的父类
例如:Student 继承于 Person,而Person 继承于 Animal,这就是多层继承
扩展:Animal就是Student的间接父类,而Person就是Student直接父类
每一个类都直接或间接继承于Object
4.多层继承练习:
(题目来自黑马程序员)
现在有四种动物:布偶猫、中国狸花猫、哈士奇、泰迪暂时不考虑属性,只要考虑行为。请按照继承的思想特点进行继承体系的设计
四种动物分别有以下的行为:
布偶猫:吃饭、喝水、抓老鼠中国狸花猫: 吃饭、喝水、抓老鼠
哈士奇: 吃饭、喝水、看家、拆家
泰迪:吃饭、喝水、看家、蹭一蹭
部分代码示范:
第一段是Animal类,第二段是狗类,第三段是哈士奇类,第四段是测试代码
package Demo; public class Animal { public void eat(){ System.out.println("吃饭"); } public void drink(){ System.out.println("喝水"); } }
package Demo; public class Dog extends Animal{ public void lookHome(){ System.out.println("看家"); } }
package Demo; //哈士奇类 public class Husky extends Dog{ public void breakHome(){ System.out.println("哈士奇在拆家"); } }
package Demo; public class Test { public static void main(String[] args) { Ragdoll rd = new Ragdoll(); rd.eat();//间接父类Animal中的,因为直接父类Cat有继承Animal,这就是多层继承 rd.catchMouse();//直接父类Cat中 rd.drink();//间接父类Animal中的,因为直接父类Cat有继承Animal,这就是多层继承 Husky hs = new Husky(); hs.lookHome();//直接父类Dog中的 hs.drink();//间接父类Animal中的,因为直接父类Dog有继承Animal,这就是多层继承 hs.eat();//间接父类Animal中的,因为直接父类Dog有继承Animal,这就是多层继承 hs.breakHome();//哈士奇特有 } }结果展示:
三.子类到底能继承父类中的哪些内容?
构造方法: 非私有(public......)的不能,私有(private)的也不能
成员变量: 非私有的能,私有的也能
成员方法: 非私有的能,私有的不能(父类中只有虚方法才能被子类继承)
虚方法: 非private,非static,非final
四.继承中成员变量和成员方法的访问特点
1. 继承中成员变量访问特点: 就近原则
先在局部位置找,本类成员位置找,父类成员位置找,逐级往上
2.如果出现了重名的成员变量怎么办?
System.out.printIn(name);//离它最近的name
System.out.println(this.name);//子类中的name
System.out.printIn(super .name) //父类中的name
3.构造方法的访问特点
(1)父类中的构造方法不会被子类继承
(2)子类中所有的构造方法默认先访问父类中的无参构造,再执行自己。
为什么?
子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据,所以子类初始化之前,一定要调用父类构造方法先完成父类数据空间的初始化。
如何调用父类构造方法?
子类构造方法的第一行语句默认都是: super(),不写也存在,且必须在第一行如果想调用父类的有参构造方法就要,要自己使用super进行调用
五.方法重写注意事项和要求
1.重写方法的名称、形参列表必须与父类中的一致
2.子类重写父类方法时,访问权限子类必须大于等于父类 (暂时了解:空着不写< protected< public)3.子类重写父类方法时,返回值类型子类必须小于等于父类
4.建议:重写的方法尽量和父类保持一致