继承的概念
继承:代码的复用,增加整个程序的扩展性
任意的一个动物,现在要程序扩展一个鸭子Duck,青蛙Frog等等这些类和Dog’与Cat有很多相似之处=》不同的动物类,具有很多属性和行为,这些属性或方法分散在具体的类中,就会有很多反码的冗余,拓展一个类也比较麻烦相似的的代码否要重写一遍
简单来说:就是将多个类共性抽取出来,提出继承的概念,继承就是在进行共性的提取,实现代码的复用
什么时候使用继承
要想使用继承,不是所有东西为了共用都能使用继承,必须满足is-a原则
Dog和Cat都是天然满足is aAnimal
因此将所有动物类的共性和方法提取出来放在Animal类中,具体的Dog,Cat类也罢只需要继承Animal类即可
继承的语法
使用extend表示继承父类
访问修饰符class子类名称extend父类{
}
有了继承的存在,将所有共性属性与方法放在父类中子类只需要实现独有的属性和方法即可整体代码实现更加简便,方便扩展
父类和子类成员关系
1.父类和子类不存在同名的属性和方法
2.子类和父类成员变量同名
当访问的变量的时候优先从子类寻找,若子类不存在才会从父类循环找同名属性,如父类中也没找到同名属性,编译就会报错
当父类中存在private私有域,子类在继承父类时,私有域无法直接使用,这种继承称为隐式继承
3.父类和子类方法的调用
当子类对象访问方法时
3.1若子类中存在该方法,则与优先访问子类的同名方法(具体看参数)
eg:如下图所示methodB()。子类和父类完全相同,方法名称相同参数类型完全相同,则优先访问子类的merthodB
3.2 若子类不存在该方法,则会从父类中寻找是否存在该方法,存在则调用,不存在则报错,一定注意隐式继承的问题
eg:下图methodA,子类和父类都有methodA,但是参数不同,根据名称+参数来决定到底调用的那个方法
当产生子类对象时,默认先调用父类的构造方法产生父类对象而后调用子类构造方法产生子类对象
注意:只要产生子类对象,一定先调用父类构造方法产生父类对象之后在调用子类构造方法产生子类对象
super:表示直接从父类中寻找成员变量或成员方法
- super 修饰属性,表示直接寻找父类的同名属性 private属性无法被调用
- super修饰方法
2.1 super 修饰普通成员方法,表示直接在父类中寻找同名方法
2.2super修饰构造方法,表示在子类构造方法中调用父类的构造方法
this关键字和super关键字区别
不同点
this.方法名称充当前类中寻找同名方法
super.方法名称从父类中寻找同名方法
相同点
两者都必须放首行
当父类中存在无参构造,则子类构造方法首行可以不写super();
如果父类中没有无参构造,则在子类的构造方法首行必须显式的使用super(参数)来调用父类的有参构造