【自学笔记】01Java基础-07面向对象基础-02继承

记录学习Java基础中有关继承、方法重写、构造器调用的基础知识,学习继承之前建议学习static关键字的内容【自学笔记】01Java基础-09Java关键字详解

1 继承概述

1.1 什么是继承?

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2 继承的特点

  • 子类可以继承父类的属性和行为,但是子类不能继承父类的构造器。
  • Java是单继承模式:一个类只能继承一个直接父类。
  • Java不支持多继承、但是支持多层继承。
  • Java中所有的类都是Object类的子类。

1.3 继承的重要问题

1.3.1 子类是否可以继承父类的构造器?

不可以的,子类有自己的构造器,父类构造器用于初始化父类对象。

1.3.2 子类是否可以继承父类的私有成员(方法,变量)?

可以的,只是不能直接访问。
具体表现如下:

  • 子类不能直接引用父类的私有字段(成员变量)。
  • 子类不能覆盖(override)父类的私有方法。
  • 子类可以通过调用父类提供的公共(public)或受保护(protected)方法来间接访问或者修改私有字段的值,前提是父类提供了这样的接口。

例如,在父类中有一个私有变量,并且提供了一个公共的getter和setter方法,那么子类就可以通过调用这些方法来读取和设置该私有变量的值。

1.3.3 子类是否可以继承父类的静态成员?

有争议的知识点。
子类可以直接使用父类的静态成员(共享)
但个人认为:子类不能继承父类的静态成员。(共享并非继承)

Java中,静态成员(包括静态变量和静态方法)是与类关联的,而不是与对象实例关联。因此子类可以直接访问父类的静态成员,但不会重新创建或覆盖这些成员。

public class Parent {
    public static int count = 0;
    // 静态方法
    public static void incrementCount() {
        count++;
    }
}

public class Child extends Parent {
    // 子类无需定义count,直接可以使用Parent.count
    public static void main(String[] args) {
        // 直接通过类名访问父类的静态成员
        System.out.println(Parent.count); // 输出:0
        Parent.incrementCount();
        System.out.println(Parent.count); // 输出:1
        System.out.println(Child.count);   // 输出:1,因为Child和Parent共享同一个静态变量count
    }
}

在这个例子中,Child 类和 Parent 类共享同一个 count 变量。同样,Child 类也可以调用 Parent 中的public静态方法 incrementCount()。但是,子类不能重写父类的静态方法,只能重新声明一个同名的静态方法,这将被视为一个新的方法而非覆盖。

1.4 继承后方法、变量的访问优先级

满足就近原则

  • 先子类局部范围找
  • 然后子类成员范围找
  • 然后父类成员范围找,如果父类范围还没有找到则报错。

当子类中方法或变量与父类重名时,会优先使用子类的,此时如何指定使用父类的方法或变量?
可以通过super.父类成员变量/父类成员方法,指定访问父类的成员。了解super关键字

1.5 子类如何声明与父类同名的变量的两种方式

子类中想声明与父类同名的变量时有两种情况:

  1. 对于父类中static修饰的静态变量(类变量),子类必须声明为static类型。子类和父类的static同名变量各自独立,前面学过了子类中使用父类中static变量直接类名.变量,可以查看了解static关键字
public class Parent {
    public static int count = 10;
}

public class Child extends Parent {
    public static int count = 20;
    public static void main(String[] args) {
        System.out.println(Parent.count); // 输出:10
        System.out.println(Child.count);  // 输出:20
    }
}
  1. 对于父类中非static修饰的实例变量,子类可以声明与父类同名的非static变量,可以使用this关键字来获取当前作用域内的非静态变量,用super来获取父类的非静态变量。
public class Parent {
    public int count = 10;
}

public class Child extends Parent {
    public int count = 20; // 子类中声明了与父类同名的实例变量

    public void displayCounts() {
        System.out.println("Parent count: " + super.count);
        System.out.println("Child count: " + this.count);
    }

    public static void main(String[] args) {
        Child child = new Child();
        child.displayCounts(); // 输出:
                            // Parent count: 10
                            // Child count: 20
    }
}

2 方法重写

在这里插入图片描述

public class Animal {
    public void makeSound() {
        System.out.println("动物发出叫声");
    }
}

public class Dog extends Animal {
    @Override // 标注此方法是重写父类Animal的makeSound方法
    public void makeSound() {
        System.out.println("狗叫汪汪汪");
    }
}

2.1 @Override重写注解的作用

在上方示例代码中,重写的方法makeSound()上方出现了@Override注解。

  • Override注解放在重写后的方法上,作为重写是否正确的校验注解。
  • 加上该注解后如果重写错误,编译阶段会出现错误提示。
  • 建议重写方法都加@Override注解,代码安全,优雅!也并非一定要加。

2.2 方法重写的注意事项

  1. 子类必须继承自父类。
  2. 重写方法的名称、形参列表、返回类型必须与被重写方法的一致。
  3. private私有方法和static静态方法不能被重写。
  4. 子类重写父类方法时,访问权限必须大于或者等于父类 (权限范围:缺省 < protected < public)
  5. 重写的方法抛出的异常类型不能大于父类对应方法允许抛出的异常类型,也就是说,子类重写的方法可以不抛出异常,或者抛出父类方法所声明异常的子类异常。

3 子类构造器

复习构造器的概念 > 封装-构造方法

子类并不继承父类的构造器,而是在自己构造器调用父类构造器来初始化从父类继承而来的成员变量。

  • 子类可以通过 super 关键字在构造器内部明确调用父类的一个构造器,从而初始化父类的状态。
  • 调用语句super();必须是子类构造器中第一行,并且一个构造器中只能出现一次。如果显示写明就是显式调用,如果没写也会存在,为隐式调用
  • super()"()"中可以填入参数,以此调用父类有参构造器,将会通过指定的参数名称、数量、排序来判断调用的父类中的哪个有参构造器。

显式调用

public class Parent {
    public int value;

    // 父类构造器
    public Parent(int value) {
        this.value = value;
    }
}

public class Child extends Parent {
    public String name;

    // 显式调用父类构造器
    public Child(int parentValue, String childName) {
        super(parentValue); // 调用Parent类的构造器
        this.name = childName;
    }
  • 即使没有显式地调用父类构造器,子类构造器第一行也会自动插入一个父类无参构造器的隐式调用:“super();”
  • 如果父类没有无参构造器,那么子类必须显式调用一个带有参数的父类构造器;反之如果没有显式调用父类有参构造器,则父类必须存在无参构造能被默认隐式调用。

隐式调用

    // 若不显式调用,则会默认调用父类无参构造器(若存在)
    // 如果Parent类没有无参构造器,则此处会出错,需要显示调用带参构造器
    public Child(String childName) {
    	//super();//第一句默认调用父类无参构造器,即使不写也默认存在
        this.name = childName;
   }
}

3.1 子类构造器调用父类有哪些情况?

前言:
 我们知道在实体类中没有定义任何构造器时,系统会自动提供一个默认(无参)构造器。
 一旦定义了至少一个构造器(无论是否有参数),Java编译器将不再自动提供无参构造器。这时若需无参构造器来创建对象,那么必须手动提供一个无参构造器,否则将会报错。

所以子类构造器调用父类有以下情况:

  1. 父类没有显式定义任何构造器,此时默认有无参构造器,子类会默认隐式调用父类无参构造器
  2. 父类显式定义了无参构造器,此时子类会默认隐式调用父类无参构造器。
  3. 父类显式定义了有参构造器,此时子类必须显式调用super(...)至少一个有参构造器,否则因为无法找到默认无参构造器报错。
  4. 父类显式定义了有参构造器和无参构造器,此时子类会默认隐式调用无参构造器,也可以显式调用任一构造器。

3.2 子类为什么必须调用父类构造器?

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

4 this和super关键字使用总结

在这里插入图片描述

  1. this 关键字:

    • 表示当前对象引用,它总是指向调用该方法或构造器的对象实例。
    • 在方法内部,this 可以用来引用当前对象的属性或方法:
      class Person {
          String name;
          public Person(String name) {
              this.name = name; // 使用 this 引用当前实例对象的 name 属性,并将传入的形参name赋值给它
          }
          public void showName() {
              System.out.println(this.name); // 使用 this 引用当前对象的 name 属性
          }
      }
      
    • 当成员变量与局部变量同名时,this 用于区分二者:
      class MyClass {
          int value;
          public void setValue(int value) {
              this.value = value; // 设置的是成员变量 value,而不是方法参数
          }
      }
      
    • this 还可以作为方法或构造器的参数传递当前对象引用:
      class AnotherClass {
          public void process(MyClass obj) {
              //...
          }
          
          public void callProcess() {
              process(this); // 将当前对象自身作为参数传递给 process 方法
          }
      
  2. super 关键字:

    • super 通常在子类中使用,用于访问父类(超类)的成员,包括属性、方法和构造器。
    • 在构造器中,super() 用于调用父类的构造器:
      class Child extends Parent {
          public Child() {
              super(); // 调用父类无参构造器
          }
          public Child(String name) {
              super(name); // 如果父类有一个接受 String 参数的构造器,则调用该构造器
          }
      }
      
    • 在子类的方法中,super 用于调用父类被覆盖(重写)的方法:
      class Animal {
          public void makeSound() {
              System.out.println("动物发出叫声");
          }
      }
      
      class Dog extends Animal {
          @Override
          public void makeSound() {
              super.makeSound(); // 调用父类的 makeSound 方法
              System.out.println("狗叫汪汪汪");
          }
      }
      
    • 同样,super 也可以用于访问父类中被隐藏的静态字段。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/293381.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

期货跟单系统。镜像跟单系统有什么作用?功能有哪些?

期货跟单系统&#xff1a; 期货自动跟单系统&#xff0c;是一款专门用来针对特定账户的操作而进行自动跟单的软件。软件兼容目前所有的期货公司账户&#xff0c;具有稳定性&#xff0c;速度性和可靠性的优势。 补差补点&#xff0c;根据盘手实盘心理分析&#xff0c;增加模拟…

PLC三相电动机Y-▲启动控制程序示例

一、三相电动机星三角启动接法。 二、因为电动机在启动的时候启动电流非常的大&#xff0c;所以在启动时采用星型接法&#xff0c;也就是Y型接法&#xff0c;也就是图上的KM1和KM2接通&#xff0c;目的为了减小启动电流&#xff0c;采用Y型接法的启动电流是原来电流的1/3 三、启…

华为交换机怎么添加和剥除VLAN标签

知识改变命运&#xff0c;技术就是要分享&#xff0c;有问题随时联系&#xff0c;免费答疑&#xff0c;欢迎联系&#xff01; 华为交换机VLAN标签的添加和剥除处理过程 接口对收发的以太网数据帧添加或剥除VLAN标签的处理依据接口的接口类型和缺省VLAN。 由上面各类接口添加或…

Mybatis之多表查询

目录 一、简介 1、使用嵌套查询: 2、使用多个 SQL 语句&#xff1a; 3、使用关联查询&#xff1a; 4、使用自定义映射查询&#xff1a; 二、业务场景 三、示例 1、一对一查询 2、一对多查询 一、简介 MyBatis 是一个优秀的持久层框架&#xff0c;它提供了强大的支持来执…

小样本学习介绍(超详细)

小样本学习介绍 本文首先介绍了什么是小样本学习&#xff0c;其次介绍了为什么小样本学习的很多文章都采用元学习的方法。目的是通过通俗的解释更加清楚的介绍小样本学习是什么&#xff0c;适合初学者的入门。当然&#xff0c;以下更多的是自己的思考&#xff0c;欢迎交流。 …

cesium第一视角/上帝视角以及解除视角锁定

第一视角效果&#xff1a; function event1() {viewer.scene.screenSpaceCameraController.enableZoom false; //. 禁止视角缩放viewer.scene.screenSpaceCameraController.enableRotate false; //禁止左键拖动视角viewer.scene.screenSpaceCameraController.enableTilt fal…

GAMES101:作业5记录

总览 在这部分的课程中,我们将专注于使用光线追踪来渲染图像。在光线追踪中最重要的操作之一就是找到光线与物体的交点。一旦找到光线与物体的交点,就可以执行着色并返回像素颜色。在这次作业中,我们需要实现两个部分:光线的生成和光线与三角的相交。本次代码框架的工作流程为…

【C语言】stdbool.h——有关bool的总结

在编程和日常生活中&#xff0c;经常需要一种只能具有两个值之一的数据类型&#xff0c;如是否、开关、真假等&#xff0c;因此&#xff0c;C 有一种bool数据类型&#xff0c;称为booleans。布尔值表示 或true的值false。 C 中的 bool 是大多数语言中的基本数据类型&#xff0…

自由DIY预约小程序源码系统:适用于任何行业+自由DIY你的界面布局+全新升级的UI+多用户系统 带安装部署教程

随着移动互联网的普及&#xff0c;预约服务逐渐成为人们日常生活的一部分。从家政服务、医疗挂号到汽车保养&#xff0c;预约已经渗透到各个行业。然而&#xff0c;市面上的预约小程序大多功能单一&#xff0c;界面老旧&#xff0c;无法满足商家和用户的个性化需求。今天来给大…

03 decision tree(决策树)

一、decision tree&#xff08;决策树&#xff09; 1. classification problems&#xff08;纯度&#xff09; i . entropy &#xff08;熵&#xff09; ​ 作用&#xff1a;衡量一组数据的纯度是否很纯 &#xff0c;当五五开时他的熵都是最高的&#xff0c;当全是或者都不是…

fastadmin 安装QueryList

之前的项目复制过来&#xff0c;抓取数据的时候报这个错&#xff0c;于是我准备重新安装QueryList 我准备安装QueryList 4版本 安装命令&#xff1a; composer require jaeger/querylist:~V4 报错&#xff1a; 解决方法&#xff1a; 创建一个新用户和用户组&#xff0c;切换…

vivado 管理宏

管理宏 宏存储为XDC约束。根据定义&#xff0c;它们是Tcl命令。这允许要在XDC约束文件和Tcl脚本中使用并交互使用的宏。宏是使用write_xdc命令编写的。使用read_xdc读取宏命令-cell选项可用于将作用域限制为特定的单元格。-cell选项特别适用于将一个宏的相对放置应用到不同层次…

electron预加载脚本

webPreferences 指定预加载脚本,可以使用部分node脚本 webPreferences: {preload: path.join(__dirname, "preload.js"),},创建preload.js 中 测试文件读取功能 const fs require(fs) const text fs.readFileSync(package.json, utf-8)console.log(text)报错,为了…

Visual Studio 2013 “即将退休”

新年快乐&#xff01; 这也是向各位开发者提醒 Visual Studio 支持生命周期中即将到来的好时机。 对 Visual Studio 2013 的支持即将在今年(2024年)的4月9日结束。如果你正在使用旧版本的 Visual Studio&#xff0c;我们强烈建议您升级您的开发环境到最新的 Visual Studio 20…

给孩子选台灯什么样的好?分享高品质的学生护眼台灯!

在这个青少年如此高近视率的情况下&#xff0c;想要真正保护孩子的视力&#xff0c;除了需要监督孩子养成良好的用眼习惯以外&#xff0c;还要注意光线环境&#xff01;在夜晚不管是看书写字、还是使用电脑平板上网课&#xff0c;都需要一个健康的照明环境。因此在挑选孩子学习…

Electron介绍

前言 相信很多的前端小伙伴都想过一个问题&#xff0c;web技术是否可以用于开发桌面应用。答案当然是可以的&#xff0c;Electron框架就是其中的一种解决方案。 Electron介绍 Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 Electron 并不是一门新的…

.NetCore部署微服务(一)

目录 前言 什么是微服务 微服务的优势 微服务的原则 创建项目 在Docker中运行服务 客户端调用 简单的集群服务 前言 写这篇文章旨在用最简单的代码阐述一下微服务 什么是微服务 微服务描述了从单独可部署的服务构建分布式应用程序的体系结构流程&#xff0c;同时这些…

Redis 连接 命令

目录 1.Redis Echo 命令 - 打印字符串简介语法可用版本: > 1.0.0返回值: 返回字符串本身。 示例 2.Redis Select 命令 - 切换到指定的数据库简介语法可用版本: > 1.0.0返回值: 总是返回 OK 。 示例 3.Redis Ping 命令 - 查看服务是否运行简介语法可用版本: > 1.0.0返回…

【Proteus仿真】【Arduino单片机】超声波测距系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用动态数码管、按键、HCSR04超声波、蜂鸣器模块等。 主要功能&#xff1a; 系统运行后&#xff0c;数码管显示超声波检测距离&#xff0c;当检…

Apache网页优化

本章主要介绍如何对Apache网页进行优化 Apache 网页压缩Apache 网页缓存Apache 隐藏版本信息Apache 网页防盗链 目录 1、网页压缩与缓存 1.1、网页压缩 &#xff08;1&#xff09;gzip介绍 &#xff08;2&#xff09;HTTP压缩的过程 &#xff08;3&#xff09;Apache的…