Java学习(继承)

概述

是什么:
Java提供了一个关键字extends,用这个关键字,我们可以让一个类和另一个类建立起父子关系
格式:
public class Student extends People{}
其中Student称为子类(派生类),People称为父类(基类、超类)。
作用:

  1. 当子类继承父类后,就可以直接使用父类公共的属性和方法了。
  2. 提高代码复用性,增强类的功能扩展性。

设计规范&内存运行原理

设计规范

子类们相同特征放在父类里定义,子类独有的属性和行为应该定义在子类自己中。

如果把子类的独有属性、行为定义在父类中,会导致其他子类也会得到这些属性和行为,这不符合面向对象。

案例:
教学资源管理系统中,存在老师和学生两种角色,请创建这两种角色类。
学生的信息和行为:名称,年龄,所在班级,查看课表,填写听课反馈。
老师的信息和行为:名称,年龄,部门名称,查看课表,发布问题。

分析:

  1. 名称,年龄,查看课表是共有的,应当放在父类中。
  2. 学生类和老师类应该作为子类,继承父类且包含自己独有的属性。

代码:

public class People {
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void queryCourse(){
        System.out.println(name +"正在查看课表");
    }
}
public class Student extends  People{
    private String className;
    public void writeInfo(){
        System.out.println(getName()+"给予了好评!");
    }
    public int getclassName() {
        return className;
    }
    public void setclassName(String className) {
        this.className = className;
    }
}

这样一来子类的代码就简洁了,提高了代码的复用性。

内存原理

以上面老师类和学生类的代码为例子:

public class test {
    public static void main(String[] args) {
        Student s = new Student();
        s.setName("张三");
        s.setAge(999);
        s.setClassName("计算机1班");
        System.out.println(s.getName());
        System.out.println(s.getAge());
        s.queryCourse();
        s.writeInfo();
    }
}
  1. 代码运行,首先在堆内存里开拓一片父类空间和子类空间,此时没有赋值,里面都是默认值。

image.png

  1. 之后,先后调用父类空间和子类空间的getter&setter来赋值,再先后调用父类空间和子类空间的方法。

注意:

  1. 父类空间和子类空间都是属于同一个对象的。
  2. 在调用父类空间和子类空间的时,没有固定的先后顺序,按照程序执行顺序调用。

继承的特点

  1. 子类可以继承父类的属性和行为,但是子类不能继承父类的构造器。

解释: 子类有自己的构造器,父类的构造器是用于初始化父类对象的。

注意事项:

  1. 子类可以继承父类的私有成员,存在在父类空间中,这里不能直接访问(有点争议)。
  2. 子类可以访问父类的静态成员,但这不算继承,这是在共享使用。
  1. Java是单继承模式:一个类只能继承一个直接父类。

解释: 如果两个父类中存在同名方法,子类调用就不知道该去哪调用(反证法)。

  1. Java不支持多继承,但是支持多层继承。

解释: 子类A可以继承父类B,父类B可以继承父类C。
image.png

注意事项:

  1. A类也继承了C类,可以调用C类的方法。
  2. 在B,C类中出现同名方法,A在调用的时候会优先调用关系近的B类。
  1. Java中所有的类都是Object类的子类。

解释: Object类是祖宗类,但是使用的时候默认继承了Object类,不需要明确写出。

继承后的相关特点

成员变量、成员方法的特点

在子类中访问成员,满足:就近原则

  1. 先在子类局部范围找。
  2. 然后子类成员范围找。
  3. 再到父类成员范围找,还找不到就报错。

注意事项:
子父类中出现了同名成员,会依据优先原则使用子类的,但是如果一定要使用父类的,就需要使用super关键字!
格式:super.父类成员

方法重写

是什么:
在继承体系内,子类出现了和父类一模一样的方法声明,我们就称子类的方法是重写的方法。
应用场景:
当子类需要父类的功能,但是父亲的该功能不能完全满足自己的需求的时候。
@Override重写注解:(非常重要

  1. 放在重写后的方法上,作为重写是否正确的校验注解。
  2. 提高代码的可读性,代码优雅~

注意事项:

  1. 重写方法的名称,形参列表必须和被重写的方法的名称和参数列表一致。
  2. 私有方法不能被重写!
  3. 子类重写父类方法的时候,访问权限必须大于或等于父类(缺省<protected<public)【暂时了解】
  4. 子类不能重写父类的静态方法,会报错!(共享非继承)

子类构造器的特点

子类中的所有构造器默认都会优先访问父类中无参的构造器,再执行自己。
为什么:

  1. 子类在初始化的时候,有可能会用到父类的数据,如果父类没有完成初始化,子类就无法使用父类的数据。
  2. 子类初始化之前,一定要调用父类构造器先完成父类数据空间的初始化。

如何实现调用父类的构造器:
子类构造器的第一行语句默认都是:super(),不写也存在。

子类构造器访问父类有参数构造器

**super调用父类有参数构造器的作用:**初始化来自父类的数据。
如果父类中只有有参数构造器,在子类中只有有参数构造器,是不会报错的,但是如果子类创建了无参数构造器,就会报错!

this和super

this:表示的是本类对象的引用;super:表示父类存储空间的标识。

注意事项:

  1. 子类通过this去调用本类的其他构造器,本类其他构造器会通过super去调用父类构造器,最终还是会调用父类构造器。
  2. this和super都只能放在构造器的第一行,所以说两者不能存在于同一个构造器中。
  • 37
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值