面向对象高级 继承(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(...)的使用需要注意什么?

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

相关推荐
keyipatience1 小时前
线程栈与TLS和线程互斥
java·linux·服务器·开发语言·ubuntu
我的xiaodoujiao1 小时前
快速学习Python基础知识详细图文教程9--函数进阶
开发语言·python·学习·测试工具
weixin_408099671 小时前
2026 图片去水印 API 接口完全指南:一键去除图片水印(附 Python/Java/PHP/C# 示例)
java·python·php·图片处理·api调用·图片去水印·石榴智能
爱喝水的鱼丶2 小时前
SAP-ABAP:ALV通用封装实践——搭建可复用的ALV开发工具类,减少80%重复代码
开发语言·性能优化·sap·abap·erp·alv
去码头整点薯条ing2 小时前
某当网登录滑块【协议+OCR】
爬虫·python·ocr
脱胎换骨-军哥2 小时前
C++/Rust无缝互操作:混合系统新常态
开发语言·c++·rust
songroom2 小时前
Kimi K3:Rust封装XTP接口详细教程实践
开发语言·后端·rust
kebeiovo3 小时前
游戏服务端开发:Actor模型详解(Go语言)
开发语言·后端·golang
赶紧写完去睡觉3 小时前
Anaconda 创建虚拟环境与使用
python·pycharm·conda
迷途呀3 小时前
Python:函数中的参数类型
开发语言·笔记·python·langchain·nlp