java学习日记2021.11.03——面向对象三特性之继承

继承

继承的基本概念

定义:继承是软件可重用性的重要表现,新类可以在不增加自身代码的情况下,通过现有的类 中继承其属性和方法,来充实身的内容,,此时新类称为子类,现有的类为父类。

作用:继承最基本的作用就是使得代码可重用性,增加软件的可扩充性

java中只支持单继承,即每个类只能有一个直接父类。

语法格式:

【访问修饰符】class extends{

}

注意:在Java中,子类可以从父类中继承以下内容:

1.可以继承public和protected修饰的属性和方法,不论子类和父类是否在同一个包里

2.可以继承默认访问修饰符修饰的属性和方法

3.无法继承父类的构造方法

例子;使用继承,将8个部门类中相同的代码抽取成一个部门类

//父类为Department
public class Department {
    private int ID;
    private String name;
    private int amount;
    private String responsibiblity;
    private String manager;
    public Department(){ }
    public Department(String name,String  manager,String responsibiblity){
        this.name=name;
        this.manager=manager;
        this.responsibiblity=responsibiblity;
    }

    public int getID() {
        return ID;
    }

    public void setID(int ID) {
        this.ID = ID;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAmount() {
        return amount;
    }

    public void setAmount(int amount) {
        this.amount = amount;
    }

    public String getResponsibiblity() {
        return responsibiblity;
    }

    public void setResponsibiblity(String responsibiblity) {
        this.responsibiblity = responsibiblity;
    }

    public String getManager() {
        return manager;
    }

    public void setManager(String manager) {
        this.manager = manager;
    }
    public void print(){
        System.out.println("部门:"+this.name+"\n经理:"+this.manager
        +"\n部门职责:" +this.responsibiblity+"\n**************" );
}
}

使用继承实现部门类和子类

人事部继承Department

public class PD extends Department {
    private int count;//本月计划招生人数

    public PD(String name, String manager, String responsibility, int count) {
        super(name, manager, responsibility);
        this.count = count;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }
   public static void main(String[] args) {
    PD pd = new PD("人事", "tom", "负责公司人事",
            10);
    pd.print();
}
} 

研发部继承Department

public class RD extends Department {
   private String speciality;
   public RD(String name,String manager,String responsibility,String speciality){
       super(name,manager,responsibility);
       this.speciality=speciality;
   }
   public RD(String speciality){
       super();//默认调用父类无参构造方法
       this.speciality=speciality;
   }

    public String getSpeciality() {
        return speciality;
    }

    public void setSpeciality(String speciality) {
        this.speciality = speciality;
    }
}

super关键字

super关键字和this关键字作用类似,都是将被屏蔽的成员变量,,成员属性变得可见

  //从父类继承的方法不能满足子类的需求,差个输出人数,因此可在
  //子类中对父类的同名方法进行重写,以符合需求
public void print(){
     super.print();
    System.out.println("本月计划招生人数:"+this.count);
 }

通过super关键字访问父类成员的语法格式:

访问父类构造方法:super(参数)

访问父类属性/方法:super.

注意:super只能出现在子类(子类的方法和构造方法中);

super用于访问父类的成员,如属性、方法、构造方法;

具有访问权限的限制,如无法通过super访问父类的private成员。

//使用super调用父类构造方法
public PD(String name, String manager, String responsibility, int count) {
    super(name, manager, responsibility);
    this.count = count;
}

实例化子类对象

在java中,一个类的构造方法在如下两种情况下总会被执行

①创建该类的对象(实例化)

②创建该类的子类对象(子类的实例化)

子类在实例化时,总会先执行其父类的构造方法,然后才执行子类的构造方法,子类继承父类时构造方法的调用规则如下:

①子类的构造方法中没有通过super显式调用父类的有参构造方法,也没有通过this显式调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法,此时,是否写“super()”语句,效果都一样

②子类的构造方法中通过super显式调用父类的有参构造方法,那么将执行父类相应的构造方法,而不执行父类无参构造方法

③子类的构造方法中通过this显式的调用了自身的其他构造方法,在相应构造方法中遵循以上两条规则

④如果存在多级继承,在创建一个子类对象时,以上规则会多次向更高一级父类传递,一直执行到顶级父类Object类的无参构造方法为止。

举例

package cn.kgc.review;

/**
 * @Author $(USER)
 * @Date $(DATE)
 * @Description 人类为父类
 */
public class Person {
    String name;
    //无参构造
    public Person(){
        System.out.println("execute Person()");
    }
    //有参构造
    public Person(String name){
        this.name=name;
        System.out.println("execute Person(name)");
    }
}

package cn.kgc.review;

/**
 * @Author $(USER)
 * @Date $(DATE)
 * @Description 学生为人类的子类
 */
public class Student extends Person{
    //学生类作为Person的子类
    String school;
    public Student(){
        System.out.println("execute Student()");
    }
    public Student(String name,String school){
        super(name);//显示调用父类有参构造方法,将不执行父类无参构造方法
        this.school=school;
        System.out.println("execute Student(name,school)");
    }

}
package cn.kgc.review;

/**
 * @Author $(USER)
 * @Date $(DATE)
 * @Description pg为学生的子类
 */
public class PG extends Student {
    String guide;
    public PG(){
        System.out.println("execute PG()");
    }
    public PG (String name,String school,String guide){
        super(name, school);
        this.guide=guide;
        System.out.println("execute PG(name,school,guide)");
    }
}
class Tset{
    public static void main(String[] args) {
        PG pg=new PG();//调用PG的无参构造
        System.out.println();
        pg=new PG("王致和" ,"哈工大","刘老师l");//调用PG的有参构造
        System.out.println(pg.name+pg.school+pg.guide);
    }
}
Object类
方法重写

方法重写

如果从父类继承的方法不能满足子类的要求,可以在子类中对父类的同名方法进行重写。

//从父类继承的方法不能满足子类的需求,差个输出人数,因此可在
  //子类中对父类的同名方法进行重写,以符合需求
public void print(){
     super.print();
    System.out.println("本月计划招生人数:"+this.count);
 }

注意:

①重写方法和被重写方法有相同的方法名,相同的参数列表,相同的返回值类型或是后者的子类

②重写方法不能缩小被重写方法的访问权限

Guess you like

Origin blog.csdn.net/kkkyzp/article/details/121133203