继承

继承就是子类继承父类的属性和行为,使得子类对象具有与父类相同的属性、相同的行为。子类可以访问父类中的非私有的属性和行为
好处:
1、提高代码的复用性
2、类与类之间产生了关系,是多态的前提
通过extends关键字,可以声明一个子类继承另一个父类格式如下:

class 父类{
 …
 }
 class 子类 extends 父类{
 …
 }

继承后的特点–成员变量

成员变量不重名

如果子类父类中出现不重名的成员变量,这时访问是没有影响的

成员变量重名

子父类中出现了同名的成员变量时,在子类需要访问父类中非私有成员变变量时,需要使用super关键字,修饰父类成员变量,类似于之前学过的this。使用格式:super.父类成员变量名

public class Demo01Extend {
    public static void main(String[] args) {
        Zi zi = new Zi();
        zi.show();
    }
}

public class Fu {
    int num =5;
    public void show(){
        System.out.println("Fu show");
    }
}


public class Zi extends Fu{
    int num1 =20;
    int num = 6;
    public void show(){
        System.out.println("Fu num ="+super.num);//访问父类中的num
        System.out.println("Zi num ="+this.num);//访问子类中的num
        System.out.println("Zi show");
    }
}

PS:父类中的成员变量是非私有的,子类可以直接访问。若父类中的成员变量私有了,子类是不能直接访问的,通常编码时,我们遵循封装的原则,使用private修饰成员变量,那么如何访问父类的私有成员变量,可以在父类中提供公共的getXxx和SetXxx方法

继承后的特点–成员方法

成员方法不重名

如果子类父类中出现不重名的成员方法,这时是没有影响的

成员方法重名–重写(override)

方法重写:子类出现与父类一模一样的方法时(返回值类型,方法名和参数列表都相同),会出现覆盖效果,也称为重写或复写。申明不变重新实现
(重载:方法名称一样,参数列表不一样)
方法覆盖重写的注意事项:
1、必须保证父子类方法的名称相同,参数列表也相同
@override写在前面,用来检测是不是有效的正确覆盖重写
这个注解就算不写,只要满足要求,也是正确的方法覆盖重写
2、子类方法的返回值必须【小于等于】父类返回值范围
小扩展提示:java.lang.object类是所有类的公共最高父类(祖宗类),java.lang.String就算Object的子类
3、子类方法权限不许【大于等于】父类方法权限修饰符
小扩展提示:public》protected>(default)>private
备注:(default)不是关键字default,而是什么都不写,留空
eg:public(权限)string(返回值范围) method(){}

继承后的特点–构造方法

继承关系中,父子类构造方法的访问特点:
1、子类构造方法当中有一个默认隐含的“super()”调用,所以一定是先调用的父类构造,后执行的子类构造
2、子类的构造可以通过super关键字来调用父类重载构造
3、super的父类构造调用,必须是子类构造方法的第一个语句,不能一个子类构造调用多次super构造
总结:子类必须调用父类构造方法,不写则赠送super();写了则用写的指定的super调用,super只能有一个,还必须是第一个

class Fu {
   private int n;
     Fu(){
        System.out.println("Fu()");
   }
   class Zi extends Fu {
      Zi(){
          super();// 调用父类构造方法
          System.out.println("Zi()");
       }
     }
public class ExtendsDemo07{
      public static void main (String args[]){
          Zi  zi = new Zi();
       }
 }
super关键字

super关键字的用法有三种:
1、在子类的成员方法中,访问父类的成员变量
2、在子类的成员方法中,访问父类的成员方法
3、在子类的构造方法中,访问父类的构造方法

pubic class Zi extends Fu{
  int num = 20;
  public Zi(){
      super();
   }
   public void methodZi(){
      System.out.println(super.num);
   }
   public void method(){
   super.method;//访问父类中的method
   }
 }
this关键字

super关键字用来访问父类内容,而子类关键字用来访问本类内容 用法也有三种:
1、在本类方法中,访问本类成员变量
2、在本类成员方法中,访问本类的另一个成员方法
3、在本类的构造方法中,访问本类的另一个构造方法,在使用时注意:
this(…)调用也必须是构造方法的第一个语句,唯一一个
super和this两种构造调用,不能同时使用

pubic class Zi extends Fu{
  int num = 20;
  public Zi(){
      super();//这一行不再赠送
      this(123);//本类的无参构造调用本类的有参构造
   }
   public Zi(int n){
      System.out.println(n);
   }
   public void methodZi(){
      System.out.println(super.num);
   }
  }