16.继承

继承

  1. 继承是对某一批类的抽象,从而更好的分析和理解。

  2. 子类继承父类,且拥有父类的实例域和方法。

  3. 继承能增加代码的重复利用率

  4. Java中只有单继承,没有多继承

image

类的继承格式

Java中通过 extends 关键字声明

class 父类 {
}

class 子类 extends 父类 {
}
  • Objext类是个特殊类,我称之为祖宗类,所有类都默认继承 Object类。
  • 子类具有父类所有字段,之后定义不能和父类重复。

super & this

  • super关键字:

    • 代表父类,子类调用父类的字段时,用super.fileldName调用。

    • 只能在有继承的情况下才能使用

    • 构造方法:this( ); 本类的构造器

  • this关键字:

    • 代表自己,指向自己的引用,用 this.fileldName调用。
    • 没有继承也可以使用
    • 构造方法:super( );父类的构造器

实例:

  • 定义一个 Person
package com.wnaoii.oop.Demo04;

public class Person {
    protected String Name = "父类Name";
    private int Age = 13
}
  • 再定义一个 Student 类继承 Person
package com.wnaoii.oop.Demo04;

// 子类
public class Student extends Person {

   private String Name = "子类Name";

   public void printName(String name) {
       System.out.println(name);	// 这个 name 调的是形式参数 name
       System.out.println(this.Name);	// this.name 调的是当前这个类的 Name 
       System.out.println(super.Name);	// super.name 调的是当前这个类父类的 Name
   }
}
  • 实例化 student 对象查看效果
package com.wnaoii.oop.Demo04;

public class Application {
    public static void main(String[] args) {

        Student student = new Student();

        student.printName("参数name");

    }
}

结果:

参数name
子类Name
父类Name

super 注意点:

  • super 调用父类构造方法,必须在构造方法的第一个。
  • super 必须只能出现在子类的方法或构造方法中。
  • super 和 this 不能同时调用构造方法。(因为两者都必须在第一行,有冲突)

protected

  • 在继承中,子类无法访问父类的private字段或者private方法。
  • protected关键字可以把字段和方法的访问权限控制在继承树内部,一个protected字段和方法可以被其子类,以及子类的子类所访问。

无法调用:

// 父类
public class Person {
    // 定义一个 private name变量
    private String name = "父类Name";
}
// 子类
public class Student extends Person {
    public void printName() {
        System.out.println(super.name);	// 编译错误,无法调用
    }
}

成功调用:

  • 由于 private 关键字使得子类无法调用,则可以把 private 改为 protected,这样子类便能调用父类被 protected 修饰的字段。
// 父类
public class Person {
    // 定义一个 protected name变量
    protected String name = "父类Name";
}
// 子类
public class Student extends Person {
    public void printName() {
        System.out.println(super.name);	// 子类通过关键字 super 成功调用
    }
}

继承中的构造器

  • 子类并不继承父类的构造器(构造方法或者构造函数),只是调用(隐式或显式)。
// 父类
public class Person {
    // 一个简单的无参构造
    public Person() {
        System.out.println("已执行Person无参构造!")
    }
}
// 子类
public class Student extends Person {
    
    // 此处隐藏了一个调用父类的无参构造
    // super();
    
    public Student() {
        System.out.println("已执行Student无参构造!")
    }
}
// 调用
public class Application {
    public static void main(String[] args) {
		// 只用 Student 类创建一个对象
        Student student = new Student();
    }
}

结果:

已执行Person无参构造!
已执行Student无参构造!

显示调用父类无参构造则必须在子类构造器的第一行。(不写一般都默认调用父类无参构造器)

若父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。

若父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。

posted @ 2021-05-07 16:23  WNAOII  阅读(59)  评论(0)    收藏  举报