目录
Java是一门面向对象的语言,面向对象程序有三大特性,继承则是其中之一。
继承:将多个类的共性进行抽取,达到代码的复用。
比如,小狗和小鸟都是动物,都会吃饭,都有各自的名字,这些是它们的共性。而小狗会汪汪叫,小鸟则会飞,这是他们特有的属性。因此,我们可以把小狗和小鸟的共性抽取出来,作为动物的共性。而它们也有自己的属性,这是他们所特有的。在继承中,存放的是多个类的共性的类,称之为 为 父类/基类;存放的是 自己特有属性的类,称之为 子类/派生类。
当我们写了多个类时,这些类有共性,有自己的特性,这种情况我们就可以用继承来写。
1. 继承的语法
继承所用到的关键字:extends
如上所说,小狗和小鸟都是动物,可以定义个Animal类作为父类,在父类中写 动物的共性。
然后定义Dog类和Bird类,写各自特有的属性,在定义子类的时候,要先把父类中存放的共性 继承下来。
继承语法:修饰符 子类名 extends 父类名{ },这样就继承了父类中的属性,然后在子类中就可以写自己特有的属性。
这样就完成了继承,我们可以写多个子类,在子类中只需写自己特有的属性就可以了,就不用写一个子类定义一个名字了,父类的属性可以直接用,这就达到了代码的复用。下面来运行一下:
2.父类成员变量的访问
2.1 子类与父类不同名的成员变量的访问
子类中没有与父类同名的成员变量,在子类访问a,子类中没有a。则访问的是父类中的a
2.2 子类与父类同名的成员变量的访问
子类与父类有同名的成员变量时,那么访问该变量时访问的是子类中的成员变量
【总结】:在子类中访问成员变量时,优先访问子类自己的成员变量,若子类自己中没有该变量,则再去访问父类中的。即 就近原则
3.父类成员方法的访问
3.1父类与子类没有同名的成员方法
子类与父类没有同名的成员方法时,在子类访问base1()方法,访问的是父类中的方法。
3.2 父类与子类有同名的成员方法
父类与子类有同名的成员方法,在子类调用该同名方法时,调用的是子类自己的成员方法
【总结】:在子类中访问成员方法时,若子类中没有该方法,则去父类中调用。即 先在子类中找,若子类中没有,再去 父类中调用,也是 就近原则。
问题:若子类和父类有同名的成员时,如何在子类中调用父类中的 该成员?这就要用到super关键字了。
4.调用与子类同名的父类成员
4.1调用与子类同名的父类成员方法
子类与父类有同名的成员方法,在子类中调用父类的该成员方法,使用super关键字.
语法:super.方法名();
4.2调用与子类同名的父类成员变量
子类与父类有同名的成员变量时,在子类中访问父类中的该成员变量,使用关键字super。
语法:super.变量名
【注意】:super关键字只能在非静态方法中使用。
5.子类中的构造方法
若父类中有构造方法,则在子类中应该首先帮助父类进行构造方法。使用super()帮助构造
若父类中是 无参 的构造方法,在子类中帮助父类构造方法时,要在子类构造方法中的第一句 通过super()调用,来帮助父类构造。若用户没有调用,编译器会在子类构造方法中的第一句 自动调用super()。
若父类中是 有参 的构造方法,则在子类帮助父类构造方法时,用户必须要在子类构造方法中的第一句 通过super(参数)调用,来帮助对父类构造。编译器不会自动调用。若用户不调用super(参数),则子类的构造方法会报错。
【 总结】:
(1)若父类中是 无参 的构造方法,子类帮助父类构造时 用户要在子类构造方法的第一句通过super()调用,来帮助父类构造方法。如果用户没有调用,编译器也会在子类构造方法的第一句自动调用。
(2)若父类中是 带参 的构造方法,子类帮助父类构造时 用户必须要在子类构造方法的第一句通过super(参数)调用,来帮助父类构造方法,否则子类的构造方法会报错。编译器不会自动调用父类中带参的构造方法。