内容纲要

继承就是子类(扩展类、派生类)继承父类(超类、基类)的属性和行为,父类可以把子类中共性的代码抽取出来。子类继承父类的字段和方法,子类可以直接访问父类的非私有private变量和方法。

继承

Java是单继承语言,可以多级继承,可以通过实现接口弥补。

定义

使用extends关键字来定义类的继承,子类也可以自定义自己特有属性与行为,其中java.lang.Object是所有的超类。

Pet.java

public class Pet {

    String name;
    int age;

    public void eat() {
        System.out.println("我在吃饭!");
    }

}

Cat.java

public class Cat extends Pet {

    String name;//与父类同名成员变量
    String food;

    public void play(){
        System.out.println("我在玩");
    }

}

继承

成员变量

  • 父类只能使用本类中,而子类可以使用父类的非私有变量方法。
  • 若子类对象中使用父类的成员变量,则会向上寻找。
  • 若子类变量与父类变量重名,通过方法间接访问变量,方法属于谁就使用谁的变量。
  • 若子类使用和父类成员变量重名,实例化谁的对象就优先使用谁的变量。
  • 如果父类子类变量重名,可以通过thissuper关键字区分父类子类变量。

成员方法

  • 若子类使用和父类成员方法重名,实例化谁的对象就优先使用谁的变量。
  • 如果父类子类方法重名,可以通过thissuper关键字区分父类子类方法。

方法重写

在继承中,父类子类方法的名称一样,参数列表一样称为子类重写父类方法。

Pet.java

public class Pet {

    public void eat() {
        System.out.println("我在吃饭!");
    }

    public Object play(){
        return null;
    }

}

Cat.java

public class Cat extends Pet {

    @Override
    public void eat(){
        System.out.println("我在玩");
    }
    //返回值类型必须小于父类的返回值类型,String的父类是Object
    @Override
    public String play(){
        return null;
    }
}
  • 可以通过添加注解@Override来检测是否重写。
  • 子类方法中的返回值类型必须不能大于父类的返回值类型
  • 子类方法权限必须大于等于父类方法的权限修饰符:public > protected > [default](默认什么都不写) > private

构造方法

子类不可继承父类的构造方法

public class Pet {

    public Pet() {
        System.out.println("Pet构造方法");
    }

}

Cat.java

public class Cat extends Pet {

    public Cat() {
        super();//默认调用父类构造方法
        System.out.println("Cat构造方法");
    }
}
  • 在创建具有继承关系的子类事例时,默认调用父类构造方法,先执行父类构造方法后执行子类构造方法。

super关键字

  • 在子类成员方法中,访问父类的成员变量super.变量名
  • 在子类成员方法中,访问父类的成员方法super.方法名(参数列表);
  • 在子类构造方法中,访问父类的构造方法super(参数列表);,只能写在语句第一行,并且只能调用一次,不能与this(参数列表);同时调用。

this关键字

  • 在本类成员方法中,访问本类的成员变量this.变量名,用来区分本类变量和局部变量,父类变量重名。
  • 在本类成员方法中,访问本类的成员方法this.方法名(参数列表);
  • 在本类构造方法中,访问本类的另一个构造方法this(参数列表);,只能写在语句第一行,并且只能调用一次,不能与super(参数列表);同时调用。

抽象类

在方法的前面加上关键字abstract,去掉语句块就是抽象方法。抽象方法所在的类必须是抽象类,在class之前加上abstract,在抽象类中可以定义普通方法。

定义

不能实例化抽象类,比须用一个子类继承抽象类,子类必须重写抽象父类中的方法。

AbstractPet.java

public abstract class AbstractPet {

    public abstract void speak();

    public void instroduce(){
        System.out.println("我是宠物!");
    }
}

Cat.java

public class Cat extends AbstractPet{

    @Override
    public void speak() {
        System.out.println("喵喵喵!");
    }
}

Main.java

public class Main {

    public static void main(String[] args) {

        Cat cat = new Cat();
        cat.speak();
        //喵喵喵!
    }

}
  • 抽象类中可以有构造方法,可以通过子类super(参数列表);调用。
  • 有抽象方法的一定是抽象类,抽象类不一定有抽象方法。
最后修改日期:2020年8月18日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。