继承概述

就是子类继承父类的属性和行为,使得子类对象具有与父类相同的属性、相同的行为。子类可以直接访问父类中的非私有的属性和行为。

继承特点

①.继承特点

子类可以自动拥有父类的非私有的成员
子类也可以拥有自己的成员

②.继承好处

提高代码的复用性,(减少重复无意义的代码)
类和类之间产生了关系,这是多态的前提

继承格式

1.继承的定义格式

通过 extends 关键字,声明 一个子类 继承另 一个父类。
af86787d11c3eebf7a225d81c80d1e3.png

成员变量

1.成员变量不重名访问

如果未出现重名变量,正常访问即可

  1. class Denmo{
  2. public static void main(String[] args){
  3. Zi z = new Zi();
  4. Zi.one();
  5. Fu f = new Fu();
  6. Fu.two();
  7. }
  8. class Fu{
  9. int x = 1;
  10. }
  11. class Zi{
  12. int
  13. }
  14. }

2.成员变量重名访问

如果子类父类中出现重名的成员变量,这时的访问是有影响的。
需要使用super关键字访问

  1. class Zi extends Fu {
  2. // Zi中的成员变量
  3. int num = 6;
  4. public void show() {
  5. //访问父类中的num
  6. System.out.println("Fu num=" + super.num); //访问子类中的num
  7. System.out.println("Zi num=" + this.num); }
  8. }

总结

  • Fu类中的成员变量是非私有的,子类中可以直接访问。
  • 若Fu类中的成员变量私有了,子类是不能直接访问的。
  • 通常编码时,我们遵循封装的原则,使用private修饰成员变量,

可以在父类中提供公共的getXxx方法和setXxx方法。

成员方法

1.成员方法不重名

成员方法不重名时,正常访问即可
优先查找子类对应方法,如果没有,会在父类中查找

  1. class Fu{
  2. public void show(){
  3. System.out.println("Fu类中的show方法执行"); }
  4. }
  5. class Zi extends Fu{
  6. public void show2(){
  7. System.out.println("Zi类中的show2方法执行"); }
  8. }
  9. public class ExtendsDemo04{
  10. public static void main(String[] args) {
  11. Zi z = new Zi();
  12. //子类中没有show方法,但是可以找到父类方法去执行
  13. z.show();
  14. z.show2();
  15. }
  16. }

2.成员方法重名(重写(override))

如果出现重名,会出现一种特殊访问,方法重写:
子类中出现与父类一模一样的方法时(返回值类型,方法名 和 参数列表都相同),会出现覆盖效果,
也称为重写或者复写。声明不变,重新实现

  1. class Fu {
  2. public void show() {
  3. System.out.println("Fu show");
  4. }
  5. }
  6. class Zi extends Fu {
  7. //子类重写了父类的show方法
  8. public void show() {
  9. System.out.println("Zi show");
  10. }
  11. }
  12. public class ExtendsDemo05{
  13. public static void main(String[] args) {
  14. Zi z = new Zi();
  15. // 子类中有show方法,只执行重写后的show方法
  16. z.show(); // Zi show
  17. }
  18. }

总结

  1. 子类方法覆盖父类方法,必须要保证权限大于等于父类权限。
  2. 子类方法覆盖父类方法,返回值类型、函数名和参数列表都要一模一样
  3. 子类可以根据需要,定义特定于自己的行为。既沿袭了父类的功能名称,又根据子类的需要重新实现父类方法,从而进行扩展增强。

    构造方法的继承

    1.构造方法不可以继承
    2.构造方法的作用是初始化成员变量的。
    所以子类的初始化过程中,必须先执行父类的初始化动作。
    子类的构造方法中默认有一个super() ,表示调用父类的构造方法,父类成员变量初始化后,才可以给子类使用。
    3.在子类构造方法中的第一行默认有 super() ,给父类进行初始化的
    4.在子类构造方法中可以手动调用父类其他重载的构造方法
    格式: super(参数列表);
    5.super 是写在子类的构造方法的第一行