面向对象高级 继承(extends):

2.1 继承快速入门

子类对象实际上是由子、父类两张设计图共同创建出来的。

1、什么是继承? 继承后有啥特点?

继承就是用extends关键字,让一个类和另一个类建立起一种父子关系。

子类可以继承父类非私有的成员。

2、带继承关系的类,Java会怎么创建它的对象?对象创建出来后,可以直接访问哪些成员?

带继承关系的类,java会用类和其父类,这多张设计图来一起创建类的对象。

对象能直接访问什么成员,是由子父类这多张设计图共同决定的,这多张设计图对外暴露了什么成员,对象就可以访问什么成员(非私有的成员)。

2.2 继承的好处

关于继承的好处我们只需要记住:继承减少重复代码的编写,可以提高代码的复用性

2.3 权限修饰符

2.4 单继承、Object

Java语言只支持单继承,不支持多继承,但是可以多层继承。就像家族里儿子、爸爸和爷爷的关系一样:一个儿子只能有一个爸爸,不能有多个爸爸,但是爸爸也是有爸爸的。

Object类

Object类是java所有类的祖宗类。我们写的任何一个类,其实都是object的子类或子孙类。

1、继承相关的两个注意事项?

Java是单继承的:一个类只能继承一个直接父类;Java中的类不支持多继承,但是支持多层继承。

Object类是Java中所有类的祖宗。

2.5 方法重写

什么是方法重写

当子类觉得父类方法不好用,或者无法满足父类需求时,子类可以重写一个方法名称、参数列表一样的方法,去覆盖父类的这个方法,这就是方法重写。

注意:重写后,方法的访问遵循就近原则

    1. 重写小技巧:使用Override注解,它可以指定java编译器,检查我们方法重写的格式是否正确,代码可读性也会更好。
    1. 子类重写父类方法时,访问权限必须大于或者等于父类该方法的权限

public > protected > 缺省

    1. 重写的方法返回值类型,必须与被重写的方法返回值类型一样,或者范围更小
    1. 私有方法、静态方法不能被重写,如果重写会报错。

关于这些注意事项,同学们其实只需要了解一下就可以了。实际上我们实际写代码时,只要和父类写的一样就可以( 总结起来就8个字:声明不变,重新实现

1、方法重写是什么?

子类写了一个方法名称,形参列表与父类某个方法一样的方法去覆盖父类的该方法。

2、重写方法有哪些注意事项?

建议加上:@Override注解,可以校验重写是否正确,同时可读性好。

子类重写父类方法时,访问权限必须大于或者等于父类被重写的方法的权限。

重写的方法返回值类型,必须与被重写方法的返回值类型一样,或者范围更小。

私有方法、静态方法不能被重写。

3、方法重写有啥应用场景?

当子类觉得父类的方法不好用,或者不满足自己的需求时,就可以用方法重写。

2.6 子类中访问成员的特点

  • 原则:在子类中访问其他成员(成员变量、成员方法),是依据就近原则的
  1. 先子类局部范围找。

  2. 然后子类成员范围找。

  3. 然后父类成员范围找,如果父类范围还没有找到则报错。

  • 如果子类和父类出现同名变量或者方法,优先使用子类的;此时如果一定要在子类中使用父类的成员,可以加this或者super进行区分。

2.7 子类中访问构造器的特点

子类中访问构造器的语法规则

  • 首先,子类全部构造器,都会先调用父类构造器,再执行自己。

子类访问构造器的应用场景

  • 如果不想使用默认的super()方式调用父类构造器,还可以手动使用super(参数)调用父类有参数构造器。
复制代码

总结:

子类构造器可以通过调用父类构造器,把对象中包含父类这部分的数据先初始化赋值,

再回来把对象里包含子类这部分的数据也进行初始化赋值。

在本类中访问自己的构造方法

刚才我们学习了通过super()super(参数)可以访问父类的构造器。有时候我们也需要访问自己类的构造器。语法如下:

复制代码
this(): 调用本类的空参数构造器
this(参数): 调用本类有参数的构造器
复制代码
public class Test3 {
    public static void main(String[] args) {
        // 目标:掌握在类的构造器中,通过this(...)调用兄弟构造器的作用。
        Student s1 = new Student("柳岩", 18, "家里蹲大学");
        System.out.println(s1.getName());
        System.out.println(s1.getAge());
        System.out.println(s1.getSchoolName());
​
        System.out.println("=================");
​
        // 需求:如果学生没有填写学校,那么学校默认就是胜雅教育
        // 调用Student中2个参数的构造方法
        Student s2 = new Student("刘涛", 20);
        System.out.println(s2.getName());
        System.out.println(s2.getAge());
        System.out.println(s2.getSchoolName());
    }
}
​
class Student{
    private String name;
    private int age;
    private String schoolName;
​
    public Student() {
    }
​
    public Student(String name, int age){
       // 调用本类中3个参数的构造方法
       this(name, age, "胜雅教育");
    }
​
    public Student(String name, int age, String schoolName) {
        super();
        this.name = name;
        this.age = age;
        this.schoolName = schoolName;
    }
​
    //...为了节省代码篇幅,这里省略了get和set方法...
}

this(...)和super(...)使用时的注意事项:

this(...) 、super(...) 都只能放在构造器的第一行,因此,有了this(...)就不能写super(...)了,反之亦然。

总结:

1、子类构造器有啥特点?

子类中的全部构造器,都必须先调用父类的构造器,再执行自己。

2、super(...)调用父类有参数构造器的常见应用场景是什么?

为对象中包含父类这部分的成员变量进行赋值。

3、this(...)的作用是什么?

在构造器中调用本类的其他构造器。

4、this(...)和super(...)的使用需要注意什么?

都必须放在构造器的第一行。

相关推荐
Byron Loong1 天前
【c++】为什么有了dll和.h,还需要包含lib
java·开发语言·c++
WL_Aurora1 天前
Python 算法基础篇之集合
python·算法
独隅1 天前
CodeX + Visual Studio Code 联动的全面指南
开发语言·php
坚果派·白晓明1 天前
【鸿蒙PC三方库移植适配框架解读系列】第一篇:Lycium C/C++ 三方库适配 — 概述与环境配置
c语言·开发语言·c++·harmonyos·开源鸿蒙·三方库·c/c++三方库
头歌实践平台1 天前
招聘大数据可视化
大数据·python
爱吃小白兔的猫1 天前
LPA算法详解:一种近线性时间的图社区发现方法
开发语言·php
Cloud_Shy6181 天前
Python 数据分析基础入门:《Excel Python:飞速搞定数据分析与处理》学习笔记系列(第八章 使用读写包操作 Excel 文件 上篇)
python·数据分析·excel·pandas
香蕉鼠片1 天前
算法过程中不会的
开发语言·c++
阿旭超级学得完1 天前
C++11包装器(function和bind)
java·开发语言·c++·算法·哈希算法·散列表